<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
    #square {
        position: absolute;
        width: 80px;
        height: 80px;
        border: 2px solid black;
        top: 0;
        left: 0;
    }

    #output {
        width: 100%;
        height: 100%;
        overflow: scroll;
    }

    #description {
        margin-top: 100px;
    }

    body {
        margin: 0;
        width: 100%;
        height: 100%;
    }
    </style>
    <script src="../../../resources/ui-helper.js"></script>
    <script src="../../../resources/basic-gestures.js"></script>
    <script>
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    function pageScaleAfterSettingViewScale(scale)
    {
        return new Promise(async resolve => {
            await UIHelper.setViewScale(scale);
            await Promise.all([UIHelper.ensureVisibleContentRectUpdate(), UIHelper.ensurePresentationUpdate()]);
            resolve(internals.pageScaleFactor().toFixed(2));
        });
    }

    function pageScaleAfterDoubleTappingOnSquare()
    {
        return new Promise(async resolve => {
            await doubleTapToZoomAtPoint(40, 40);
            resolve(internals.pageScaleFactor().toFixed(2));
        });
    }

    async function runTest()
    {
        const appendOutput = message => {
            output.appendChild(document.createTextNode(message));
            output.appendChild(document.createElement("br"));
        };

        appendOutput(`Initial page scale factor                   : ${internals.pageScaleFactor().toFixed(2)}`);
        appendOutput(` - Page scale after setViewScale(1.25)      : ${await pageScaleAfterSettingViewScale(1.25)}`);
        appendOutput(` - Page scale after setViewScale(0.75)      : ${await pageScaleAfterSettingViewScale(0.75)}`);
        appendOutput(` - Page scale after setViewScale(1)         : ${await pageScaleAfterSettingViewScale(1)}`);
        appendOutput("");
        appendOutput(`Page scale after double tapping to zoom in  : ${await pageScaleAfterDoubleTappingOnSquare()}`);
        appendOutput(` - Page scale after setViewScale(1.25)      : ${await pageScaleAfterSettingViewScale(1.25)}`);
        appendOutput(` - Page scale after setViewScale(0.75)      : ${await pageScaleAfterSettingViewScale(0.75)}`);
        appendOutput(` - Page scale after setViewScale(1)         : ${await pageScaleAfterSettingViewScale(1)}`);
        appendOutput("");
        appendOutput(`Page scale after double tapping to zoom in again : ${await pageScaleAfterDoubleTappingOnSquare()}`);
        appendOutput(` - Page scale after setViewScale(0.75)           : ${await pageScaleAfterSettingViewScale(0.75)}`);
        appendOutput(` - Page scale after setViewScale(1.25)           : ${await pageScaleAfterSettingViewScale(1.25)}`);
        appendOutput(` - Page scale after setViewScale(1)              : ${await pageScaleAfterSettingViewScale(1)}`);
        appendOutput("");

        testRunner.notifyDone();
    }
    </script>
</head>

<body onload="runTest()">
    <div id="square"></div>
    <pre id="output"></pre>
    <p id="description">This test verifies that changing the view scale zooms the page to initial scale, but only if the
        page was already at initial scale. To manually test, <strong>(1)</strong> change the zoom scale without changing
        the page scale in any way, and check that the page zooms to initial scale; <strong>(2)</strong> now double tap
        on the box to zoom in, and check that changing zoom levels does not change the page scale; <strong>(3)</strong>
        finally, double tap on the box again to zoom back out to initial scale, and check that changing zoom levels
        automatically zooms the page to initial scale once again.
    </p>
</body>
</html>
