<!DOCTYPE html>

<script>
var clicked = false;
var count = 0;
var requestId = 0;

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

function log(message)
{
    var console = document.getElementById("console");
    console.appendChild(document.createTextNode(message + "\n"));
}

function click(newwindow, image)
{
    var e = newwindow.document.createEvent("MouseEvent");
    e.initMouseEvent("click", true, true, newwindow, 1, 1, 1, 1, 1, false, false, false, false, 0, newwindow.document);
    image.dispatchEvent(e);
}

window.onload = function()
{
    var newwindow = window.open("resources/flowchart.jpg");
    if (window.testRunner)
        testRunner.useUnfortunateSynchronousResizeMode();
    newwindow.onload = function() {

        newwindow.onresize = function() {
            var image = newwindow.document.querySelector("img");
            if (image.clientWidth == 0) {
                // On GTK+, sometimes the resize callback fires before the GTK
                // window has finished resizing. If that happens, try to resize
                // again.
                requestId = newWindow.requestAnimationFrame(function() {
                    newwindow.resizeTo(100, 100);
                    if (requestId)
                        newwindow.cancelAnimationFrame(requestId);
                    requestId = 0;
                });
                return;
            }

            if (window.eventSender) {
                if (!clicked) {
                    // Zoom in level 1
                    eventSender.zoomPageIn();
                    var w = Math.round(image.clientWidth);
                    var h = Math.round(image.clientHeight);
                    log("Size at zoomed in level : "  + w + " x " + h);
                    clicked = true;
                    count++;
                    click(newwindow, image);
                } else {
                    var w = Math.round(image.clientWidth);
                    var h = Math.round(image.clientHeight);
                    log("Size at zoomed level after scale up click " + count + " : "  + w + " x " + h);
                    if (count == 3)
                        testRunner.notifyDone();

                    // Restore the image size
                    click(newwindow, image);
                    count++;
                    // Brings to normal zoom
                    eventSender.zoomPageOut();
                    // Zoom out level 1
                    eventSender.zoomPageOut();
                    // Restore the image size
                    var w = Math.round(image.clientWidth);
                    var h = Math.round(image.clientHeight);
                    log("Size at zoomed out level after click " + count + " (Image restored): "  + w + " x " + h);
                    count++;
                    click(newwindow, image);
                }
            }
        };

        newwindow.resizeTo(100, 100);
    };
}
</script>
<p>This tests that on a zoomed page, click to scale up / down works fine.  This test requires testRunner to run.  To test manually, open <a href="resources/dice.png">this image</a> in a browser window, resize the window to 100px tall and zoom out and click on the image to scale it up.</p>
<pre id="console"></pre>
