<!DOCTYPE html>
<style>
    body {
        height: 2000px;
        width: 2000px;
    }
</style>

<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>

<script>
    var pageScaleFactor = 2;
    var scrollbarThicknessInCSSPixels;

    if (window.internals)
        internals.settings.setVisualViewportEnabled(true);

    function viewport() {
        return window.visualViewport;
    }

    var test = async_test('Verify viewport dimensions');

    var doBeforeZooming = test.step_func(function() {
        scrollbarThicknessInCSSPixels = window.innerWidth - document.documentElement.clientWidth;
        window.scrollTo(100, 100);

        // Initial viewport dimensions.
        assert_equals(viewport().width, 800 - scrollbarThicknessInCSSPixels, "initial width");
        assert_equals(viewport().height, 600 - scrollbarThicknessInCSSPixels, "initial height");
        assert_equals(viewport().offsetLeft, 0, "initial offsetLeft");
        assert_equals(viewport().offsetTop, 0, "initial offsetTop");
        assert_equals(viewport().pageLeft, 100, "initial pageLeft");
        assert_equals(viewport().pageTop, 100, "initial pageTop");
        assert_equals(viewport().scale, 1, "initial scale");
    });

    var doAfterZooming = test.step_func(function() {
        scrollbarThicknessInCSSPixels /= pageScaleFactor;

        // Make the layout viewport have origin (100, 100).
        window.scrollTo(1500, 1500);
        window.scrollTo(100, 100);
        window.scrollTo(110, 110);
        assert_equals(viewport().width, 800 / pageScaleFactor - scrollbarThicknessInCSSPixels, "scaled width");
        assert_equals(viewport().height, 600 / pageScaleFactor - scrollbarThicknessInCSSPixels, "scaled height");
        assert_equals(viewport().offsetLeft, 10, "scrolled left viewport");
        assert_equals(viewport().offsetTop, 10, "scrolled top viewport");
        assert_equals(viewport().pageLeft, 110, "scrolled pageLeft");
        assert_equals(viewport().pageTop, 110, "scrolled pageTop");
        assert_equals(viewport().scale, 2, "scale");

        // Scroll the visual viewport.
        window.scrollTo(100, 120);
        assert_equals(viewport().offsetTop, 20, "set offsetTop");
        assert_equals(viewport().offsetLeft, 0, "set offsetLeft");

        test.done();
    });

    function getUIScript() {
        return `(function() {
            uiController.zoomToScale(${pageScaleFactor}, function() {
                uiController.uiScriptComplete(uiController.zoomScale);
            });
        })();`;
    }

    window.onload = function() {
        doBeforeZooming();
        testRunner.runUIScript(getUIScript(), function(zoomScale) {
            doAfterZooming();
        });
    };
</script>
