<html>
<head>
<script>
function print(message, color) {
    var paragraph = document.createElement("div");
    paragraph.appendChild(document.createTextNode(message));
    paragraph.style.fontFamily = "monospace";
    if (color)
        paragraph.style.color = color;
    document.getElementById("console").appendChild(paragraph);
}
function shouldBe(description, actual, expected)
{
    if (expected === actual) {
        print("PASS: " + description + " should be " + expected +
              " and is\n",
              "green");
    } else {
        print("FAIL: " + description + " should be " + expected +
              " but instead is " + actual + "\n",
              "red");
    }
}
function mouseeventverify(event, x, y, target, type)
{
    shouldBe("event type", event.type, type);
    shouldBe("event target", event.target, target);
    shouldBe("event.pageX", event.pageX, x);
    shouldBe("event.pageY", event.pageY, y);
    shouldBe("event.offsetX", event.offsetX, x);
    shouldBe("event.offsetY", event.offsetY, y);
    shouldBe("event.x", event.x, x);
    shouldBe("event.y", event.y, y);
}
function mouseeventverify2(event, x, y, offsetX, offsetY, target, type)
{
    shouldBe("event type", event.type, type);
    shouldBe("event target", event.target, target);
    shouldBe("event.pageX", event.pageX, x);
    shouldBe("event.pageY", event.pageY, y);
    shouldBe("event.offsetX", event.offsetX, offsetX);
    shouldBe("event.offsetY", event.offsetY, offsetY);
    shouldBe("event.x", event.x, x);
    shouldBe("event.y", event.y, y);
}
function test() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    if (window.eventSender) {
        eventSender.mouseMoveTo(22, 104);
        eventSender.mouseDown();
        eventSender.mouseUp();
    }

    if (window.eventSender) {
        eventSender.mouseMoveTo(22, 184);
        eventSender.mouseDown();
        eventSender.mouseUp();
    }

    if (window.eventSender) {
        eventSender.mouseMoveTo(22, 262);
        eventSender.mouseDown();
        eventSender.mouseUp();
    }

    if (window.eventSender) {
        eventSender.mouseMoveTo(22, 344);
        eventSender.mouseDown();
        eventSender.mouseUp();
        eventSender.mouseDown();
        eventSender.mouseUp();
    }

    if (window.eventSender) {
        eventSender.mouseMoveTo(22, 448);
        eventSender.mouseDown();
        eventSender.mouseUp();
        eventSender.mouseDown();
        eventSender.mouseUp();
    }

    if (window.testRunner)
        testRunner.notifyDone();
}
</script>
</head>
<body onload="test();">
<p>This page tests whether a click event on a list box item propogates with the correct target and positioning values.<br>
Bug 3248: Mouse events on OPTION element seem to be ignored<br>
<a href="https://bugs.webkit.org/show_bug.cgi?id=3248">https://bugs.webkit.org/show_bug.cgi?id=3248</a></p>
<form action="" method="post">
<select style="position:absolute; top: 84;" size="2" onmousedown="mouseeventverify(event, 22, 104, document.getElementById('o1'), 'mousedown')">
<option>One
<option id="o1" onmousedown="mouseeventverify(event, 22, 104, this, 'mousedown')">Two
</select>
</form>
<form action="" method="post">
<select style="position:absolute; top: 164;" size="2" onmouseup="mouseeventverify(event, 22, 184, document.getElementById('o2'), 'mouseup')">
<option>One
<option id="o2" onmouseup="mouseeventverify(event, 22, 184, this, 'mouseup')">Two
</select>
</form>
<form action="" method="post">
<select style="position:absolute; top: 242;" size="2" onclick="mouseeventverify(event, 22, 262, document.getElementById('o3'), 'click')">
<option>One
<option id="o3" onclick="mouseeventverify(event, 22, 262, this, 'click')">Two
</select>
</form>
<form action="" method="post">
<select style="position:absolute; top: 324;" size="2" ondblclick="mouseeventverify(event, 22, 344, document.getElementById('o4'), 'dblclick')">
<option>One
<option id="o4" ondblclick="mouseeventverify(event, 22, 344, this, 'dblclick')">Two
</select>
</form>
<select style="position:absolute; top: 408;" size="3" onmousedown="mouseeventverify2(event, 22, 448, 12, 38, this, 'mousedown')">
<option>One
<option id="o5" onmousedown="mouseeventverify2(event, 22, 448, 12, 38, this, 'mousedown')">Two
</select>
</form>
<div style="position:absolute; top: 550;" id='console'></div>
</body>
</html>
