<html>
    <head>
        <style>
            body {
                height: 10000px;
            }
        </style>
        <script src="../resources/js-test-pre.js"></script>
    </head>
    <body>
        <script>
            description("Test scrolling backward with page granularity by using the space bar.");

            jsTestIsAsync = true;

            var failTimeoutId;
            function test() {
                if (window.eventSender) {
                    // Force the first layout to avoid the suppressed scrollbar cases.
                    scratch = document.documentElement.offsetWidth;
                    scrollBy(0, 1000);

                    // Avoid special cases for being "onload".
                    setTimeout(function() {
                        eventSender.keyDown(' ', ['shiftKey']);
                    } , 0);

                    failTimeoutId = setTimeout(function() {
                        testFailed("The scrollview failed to scroll in response to the event.");
                        debug("window.scrollY = " + window.scrollY + " excepted value around " + (1000 - (window.innerHeight - 40)));
                        finishJSTest();
                    }, 1000);
                }
            }

            window.addEventListener("scroll", function() {
                if (window.scrollY == 1000 - (window.innerHeight - 40)) {
                    testPassed("Scrolled to " + window.scrollY);
                    clearTimeout(failTimeoutId);
                    finishJSTest();
                }
            })
            window.addEventListener("load", test);
        </script>
        <script src="../resources/js-test-post.js"></script>
    </body>
</html>