<head>
<script src="../../../resources/js-test-pre.js"></script>
<script>
var nrmouseclicks = 0; // small hack to distinguish between clicks
var ev;
function mouseev(event) {
    if (nrmouseclicks == 0) {
        shouldBe("event.clientX", "50");
        shouldBe("event.clientY", "50");
        shouldBe("event.pageX", "50");
        shouldBe("event.pageY", "50");
        shouldBe("event.layerX", "50");
        shouldBe("event.layerY", "50");
        shouldBe("event.offsetX", "42");
        shouldBe("event.offsetY", "42");
        nrmouseclicks++;
    } else if (nrmouseclicks == 1) {
        shouldBe("event.clientX", "50");
        shouldBe("event.clientY", "50");
        shouldBe("event.pageX", "50");
        shouldBe("event.pageY", "550");
        shouldBe("event.layerX", "50");
        shouldBe("event.layerY", "550");
        shouldBe("event.offsetX", "42");
        shouldBe("event.offsetY", "542");
        nrmouseclicks++;
    } else if (nrmouseclicks == 2) {
        shouldBe("event.clientX", "50");
        shouldBe("event.clientY", "50");
        shouldBe("event.pageX", "550");
        shouldBe("event.pageY", "50");
        shouldBe("event.layerX", "550");
        shouldBe("event.layerY", "50");
        shouldBe("event.offsetX", "542");
        shouldBe("event.offsetY", "42");
        nrmouseclicks++;

        // test initMouseEvent
        window.scrollTo(500, 500);
        ev = document.createEvent("MouseEvent");
        ev.initMouseEvent("mousedown", true, true, document.defaultView, 1, 50, 50, 50, 50, false, false, false, false, 0, document);
        var child = document.getElementById('target');
        child.dispatchEvent(ev);
    } else {
        shouldBe("ev.clientX", "50");
        shouldBe("ev.clientY", "50");
        shouldBe("ev.pageX", "550");
        shouldBe("ev.pageY", "550");
        shouldBe("ev.layerX", "550");
        shouldBe("ev.layerY", "550");
        shouldBe("ev.offsetX", "542");
        shouldBe("ev.offsetY", "542");
    }
}
function test() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        // test a normal mouse to
        eventSender.mouseMoveTo(50, 50);
        eventSender.mouseDown();
        eventSender.mouseUp();

        // now scroll a bit down and verify that clientY does not change
        window.scrollTo(0, 500);
        eventSender.mouseDown();
        eventSender.mouseUp();

        // now scroll a bit to the right and verify that clientX does not change
        window.scrollTo(500, 0);
        eventSender.mouseDown();
        eventSender.mouseUp();
    }
}
</script>
</head>
<body onload="test()">
<div id="target" style="background: red; width:2000px; height: 2000px" onmousedown="mouseev(event)">
</div>
<div id="console"></div>
</body>
