<!-- webkit-test-runner [ enablePageCache=true ] -->
<!DOCTYPE html>
<html>
<head>
    <style>
        #overflowing {
            width: 200px;
            height: 200px;
            margin: 10px;
            border: 1px solid black;
            overflow: scroll;
        }
        
        .content {
            height: 400px;
            background-image: linear-gradient(white, gray)
        }
    </style>
    <script>
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
        }
        
        function logResult(s)
        {
            document.getElementById('result').textContent += s + "\n";
        }

        var scrollTopBeforeScroll;
        var postScrollCallback;

        function iframeScrolled()
        {
            var newScrollTop = document.getElementById('iframe').contentDocument.scrollingElement.scrollTop;
            if (newScrollTop > scrollTopBeforeScroll)
                logResult('PASS: mouseWheel caused scrolling');
            else
                logResult('FAIL; mouseWheel did not scroll; scrollTop is ' + newScrollTop + ', was ' + scrollTopBeforeScroll);

            if (postScrollCallback)
                postScrollCallback();
        }
        
        function testScrollability(completionHandler)
        {
            var iframeTarget = document.getElementById('iframe');
            var iframeBounds = iframeTarget.getBoundingClientRect();
            
            scrollTopBeforeScroll = iframeTarget.contentDocument.scrollingElement.scrollTop;
            logResult('Sending mouseWheel events');

            eventSender.mouseMoveTo(iframeBounds.left + 10, iframeBounds.top + 10);
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'changed', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'changed', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'ended', 'none');

            postScrollCallback = completionHandler;
        }
        
        function startTest()
        {
            if (!window.eventSender) {
                logResult('This test must be run in DumpRenderTree/WebKitTestRunner');
                return;
            }

            testScrollability(function() {
                window.setTimeout(function() {
                    logResult('\nNavigating forward then back\n');
                    window.location.href = "data:text/html,<body onload='history.back()'></body>";
                }, 0);
            });
            
        }
        
        var showCount = 0;
        function pageShowed()
        {
            if (++showCount == 2) {
                testScrollability(function() {
                    testRunner.notifyDone();
                });
            }
        }
        
        window.addEventListener('load', startTest, false);
        window.addEventListener('pageshow', pageShowed, false);
    </script>
</head>
<body>

<iframe id="iframe" src="resources/scroll-notifying-page.html"></iframe>

<pre id="result"></pre>
</body>
</html>
