<html>
    <head>
        <style>
            div {
                height: 9999px;
                width: 9999px;
            }
        </style>
        <script src="../../../resources/js-test-pre.js"></script>
        <script>
            jsTestIsAsync = true;

            function runTest() {
                description('Test the "scrollLeft" properties on the body element in quirks mode.');

                debug("Initial values");
                shouldBe("document.body.scrollLeft", "0");
                shouldBe("document.body.scrollTop", "0");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "0");
                shouldBe("window.scrollY", "0");

                debug("");
                debug("Let set the scrollLeft value on the main body element (document.body), in quirks mode, this should change the main frame's scroll position.");
                shouldBe("document.body.scrollLeft = 42", "42");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "0");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "0");

                debug("");
                debug("Change scrollX, this should have no effect on the horizontal scrolling");
                shouldBe("window.scrollBy(0, 21)", "undefined");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Now we create a body element, completely detached from the DOM tree. This should not change the scroll position in any way.");
                floatingBody = document.createElement('body');
                shouldBe("floatingBody.scrollLeft", "0");
                shouldBe("floatingBody.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Setting the scroll position on that detached body element should not affect the main frame since it is not the first body element of the document.");
                shouldBe("floatingBody.scrollLeft = 654", "654");
                shouldBe("floatingBody.scrollLeft", "0");
                shouldBe("floatingBody.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                secondSiblingBody = document.createElement('body');
                document.documentElement.appendChild(secondSiblingBody);
                debug("");
                debug("We add a new body element after the first body element, this should have no impact on the state.");
                shouldBe("secondSiblingBody.scrollLeft", "0");
                shouldBe("secondSiblingBody.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Setting a \"scrollTop\" on secondSiblingBody should not affect the main frame.");
                shouldBe("secondSiblingBody.scrollLeft = 987", "987");
                shouldBe("secondSiblingBody.scrollLeft", "0");
                shouldBe("secondSiblingBody.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                bodyChildOfMainBody = document.createElement('body');
                document.body.appendChild(bodyChildOfMainBody);
                debug("");
                debug("We add a new body element inside the first body element, this should have no impact on the state.");
                shouldBe("bodyChildOfMainBody.scrollLeft", "0");
                shouldBe("bodyChildOfMainBody.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Setting a \"scrollTop\" on bodyChildOfMainBody should not affect the main frame.");
                shouldBe("bodyChildOfMainBody.scrollLeft = 57", "57");
                shouldBe("bodyChildOfMainBody.scrollLeft", "0");
                shouldBe("bodyChildOfMainBody.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Now we insert a new body element *before* the existing one. It will replace the existing element as the first body element of the document.");
                oldBodyElement = document.body;
                newMainBody = document.createElement('body');
                document.documentElement.insertBefore(newMainBody, oldBodyElement);
                shouldBeTrue("document.body === newMainBody");
                shouldBeTrue("document.body !== oldBodyElement");

                debug("Since we are in quirks mode, the new body element gets the scroll position from the frame, and the old one lose its scroll position.");
                shouldBe("oldBodyElement.scrollLeft", "0");
                shouldBe("oldBodyElement.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "42");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "42");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Scrolling that new body should work as expected.");
                shouldBe("document.body.scrollLeft = 68", "68");
                shouldBe("oldBodyElement.scrollLeft = 894", "894");

                shouldBe("oldBodyElement.scrollLeft", "0");
                shouldBe("oldBodyElement.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "68");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "68");
                shouldBe("window.scrollY", "21");

                debug("");
                debug("Scrolling the main frame should not require a renderer.");
                shouldBe("document.body.style.display = 'none'", "'none'");
                shouldBe("document.body.scrollLeft = 54", "54");
                shouldBe("oldBodyElement.scrollLeft", "0");
                shouldBe("oldBodyElement.scrollTop", "0");
                shouldBe("document.body.scrollLeft", "54");
                shouldBe("document.body.scrollTop", "21");
                shouldBe("document.documentElement.scrollLeft", "0");
                shouldBe("document.documentElement.scrollTop", "0");
                shouldBe("window.scrollX", "54");
                shouldBe("window.scrollY", "21");

                // Finally, let's clear the state to make this simpler for manual testing.
                newMainBody.parentNode.removeChild(newMainBody);
                window.scrollTo(0, 0);

                finishJSTest();
            }
        </script>
    </head>
    <body onload="runTest()">
        <div></div>
        <script src="../../../resources/js-test-post.js"></script>
    </body>
</html>
