<!-- based on clientXY-in-zoom-and-scroll.html -->
<script src="../js/resources/js-test-pre.js"></script>
<script>
    function clickHandler(e)
    {
        // do something
        event = e;
        var elem = document.getElementById('gizmo');
        elem.textContent = "client(" + e.clientX + "," + e.clientY + ") page(" + e.pageX + "," + e.pageY + ")";
    }
</script>
<br/>
<div id="console"></div>
<div id="testArea">
    <div id="gizmo" style="position: absolute; left: 0px; top: 0px; overflow-x: hidden; overflow-y: hidden; width: 100%; height: 100%; text-align: middle;" onDblClick="clickHandler(event)">Double-click on this page.</div>
</div>

<script>
    var event;

    function sendDblClick()
    {
        if (window.eventSender) {
            eventSender.leapForward(1000); // drain dblclick timer
            eventSender.mouseMoveTo(200, 100); // x and y different for safety
            eventSender.mouseDown();
            eventSender.mouseUp();
            eventSender.mouseDown();
            eventSender.mouseUp();
        }
    }
    function zoomPageIn()
    {
        if (window.eventSender) {
            eventSender.zoomPageIn();
        }
    }

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

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

    // Zoomed.
    function zoomed(e)
    {
        event = e;
        debug("\nZoomed");
        shouldBe("event.clientX", "167");
        shouldBe("event.clientY", "83");
        shouldBe("event.pageX", "167");
        shouldBe("event.pageY", "83");
    }
    window.addEventListener("dblclick", zoomed, false);
    zoomPageIn();
    sendDblClick();
    zoomPageOut();
    window.removeEventListener("dblclick", zoomed, false);

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

        layoutTestController.notifyDone();
    }

    successfullyParsed = true;
</script>
<script src="../js/resources/js-test-post.js"></script>

