<html>
    <head>
        <style>
            body {
                height: 10000px;
            }
        </style>
        <script src="../resources/js-test-pre.js"></script>
    </head>
    <body>
        <script>
            description("Test scrolling 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;

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

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

            window.addEventListener("scroll", function() {
                if (window.scrollY == 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>