<!DOCTYPE html>

<html>
<head>
    <style>
        body {
            height: 3000px;
            width: 2000px;
        }
        #fixed {
            position: fixed;
            top: 10px;
            left: 12px;
            width: 30px;
            height: 20px;
            background-color: silver;
        }
        #absolute {
            position: absolute;
            top: 100px;
            left: 120px;
            width: 50px;
            height: 25px;
            background-color: blue;
        }
    </style>
    <script src="../../resources/js-test-pre.js"></script>
    <script>
        description("This test zooms and scrolls the page and checks that client rects are correct.");

        window.jsTestIsAsync = true;

        function stringFromRect(domRect)
        {
            return `${domRect.x}, ${domRect.y} - ${domRect.width} x ${domRect.height}`;
        }

        function dumpRects()
        {
            var fixed = document.getElementById('fixed');
            var absolute = document.getElementById('absolute');

            debug('layoutViewport: ' + stringFromRect(internals.layoutViewportRect()));
            debug('visualViewportRect: ' + stringFromRect(internals.visualViewportRect()));

            debug('fixed client bounds: ' + stringFromRect(fixed.getBoundingClientRect()));
            debug('fixed client rect: ' + stringFromRect(fixed.getClientRects()[0]));

            debug('absolute client bounds: ' + stringFromRect(absolute.getBoundingClientRect()));
            debug('absolute client rect: ' + stringFromRect(absolute.getClientRects()[0]));
        }

        function doAfterZooming()
        {
            window.scrollTo(0, 0);
            dumpRects();

            debug('');
            window.scrollTo(476, 526);
            debug('Scrolled to ' + window.scrollX + ', ' + window.scrollY);
            dumpRects();

            debug('');
            window.scrollTo(100, 776);
            debug('Scrolled to ' + window.scrollX + ', ' + window.scrollY);
            dumpRects();

            debug('');
            window.scrollTo(50, 300);
            debug('Scrolled to ' + window.scrollX + ', ' + window.scrollY);
            dumpRects();

            window.scrollTo(0, 0);

            finishJSTest();
        }
        
        function getUIScript()
        {
            return `(function() {
                uiController.zoomToScale(2, function() {
                    uiController.uiScriptComplete(uiController.zoomScale);
                });
            })();`;
        }

        function doTest()
        {
            if (!window.testRunner)
                return;

            testRunner.runUIScript(getUIScript(), function(zoomScale) {
                doAfterZooming();
            });
        }
        
        window.addEventListener('load', doTest, false);
    </script>
</head>
<body>
    <div id="fixed"></div>
    <div id="absolute"></div>
    <script src="../../resources/js-test-post.js"></script>
</body>
</html>
