<script src="../../resources/js-test-pre.js"></script>
<style>
    #pusher {
        width: 1000px;
        height: 1000px;
        outline: 1px solid black;
    }
    #subpixel-test {
        width: 4.5px;
    }
</style>
<div id="console"></div>
<div id="testArea">
    <div id="pusher">This box is here to create scrollbars.</div>
    <div id="subpixel-test"></div>
</div>
<script>
    var r = document.getElementById('subpixel-test').getBoundingClientRect();
    var hasSubpixelSupport = r.right - r.left == 4.5;

    var event;

    function sendClick()
    {
        if (window.eventSender) {
            eventSender.mouseMoveTo(100, 100);
            eventSender.mouseDown();
            eventSender.mouseUp();
        }
    }

    function zoomPageIn()
    {
        if (window.eventSender) {
            eventSender.zoomPageIn();
        }
    }

    function zoomPageOut()
    {
        if (window.eventSender) {
            eventSender.zoomPageOut();
        }
    }

    function scrollPage(x, y)
    {
        window.scrollTo(x, y);
    }

    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    // Default.
    function base(e)
    {
        event = e;
        debug("Base");
        shouldBe("event.clientX", "100");
        shouldBe("event.clientY", "100");
        shouldBe("event.pageX", "100");
        shouldBe("event.pageY", "100");
    }
    window.addEventListener("click", base, false);
    sendClick();
    window.removeEventListener("click", base, false);
    
    // Just zoomed.
    function justZoomed(e)
    {
        event = e;
        debug("\nJust zoomed");
        shouldBe("event.clientX", "83");
        shouldBe("event.clientY", "83");
        shouldBe("event.pageX", "83");
        shouldBe("event.pageY", "83");
    }
    window.addEventListener("click", justZoomed, false);
    zoomPageIn();
    sendClick();
    zoomPageOut();
    window.removeEventListener("click", justZoomed, false);

    // Just scrolled.
    function justScrolled(e)
    {
        event = e;
        debug("\nJust scrolled");
        shouldBe("event.clientX", "100");
        shouldBe("event.clientY", "100");
        shouldBe("event.pageX", "150");
        shouldBe("event.pageY", "150");
    }
    window.addEventListener("click", justScrolled, false);
    scrollPage(50, 50);
    sendClick();
    scrollPage(0, 0);
    window.removeEventListener("click", justScrolled, false);

    // Zoomed and scrolled.
    function zoomedAndScrolled(e)
    {
        event = e;
        debug("\nZoomed and scrolled");
        shouldBe("event.clientX", hasSubpixelSupport ? "83" : "84");
        shouldBe("event.clientY", hasSubpixelSupport ? "83" : "84");
        shouldBe("event.pageX", "133");
        shouldBe("event.pageY", "133");
    }
    window.addEventListener("click", zoomedAndScrolled, false);
    zoomPageIn();
    scrollPage(50, 50);
    sendClick();
    zoomPageOut();
    scrollPage(0, 0);
    window.removeEventListener("click", zoomedAndScrolled, false);

    if (window.testRunner) {
        var area = document.getElementById('testArea');
        area.parentNode.removeChild(area);

        testRunner.notifyDone();
    }
</script>
<script src="../../resources/js-test-post.js"></script>
