<!DOCTYPE html>
<html>
    <head>
        <link rel="help" href="http://www.w3.org/TR/DOM-Level-3-Events/#events-WheelEvent">
        <script src="../../../resources/js-test-pre.js"></script>
    </head>
    <body>
        <script>
        var iframeTarget;
        var pageScrollPositionBefore;
        var iFrameScrollPositionBefore;
        var continueCount = 5;

        function checkForScroll() {

            // The IFrame should have scrolled, but not the main page.
            var pageScrollPositionAfter = document.scrollingElement.scrollTop;
            var iFrameScrollPositionAfter = window.frames['target'].document.scrollingElement.scrollTop;

            if (iFrameScrollPositionBefore != iFrameScrollPositionAfter)
                testPassed("IFrame received wheel events.");
            else
                testFailed("IFrame did not receive wheel events.");

            testRunner.notifyDone();
        }

        function scrollTest() {
            // See where our IFrame lives:
            pageScrollPositionBefore = document.scrollingElement.scrollTop;

            iframeTarget = document.getElementById('target');

            var iFrameBody = window.frames['target'].document.body;
            iFrameBody.scrollTop = iFrameBody.scrollHeight - iframeTarget.clientHeight - 100;

            iFrameScrollPositionBefore = iFrameBody.scrollTop;

            // Scroll the #source until we reach the #target.
            var startPosX = iframeTarget.offsetLeft + 20;
            debug("IFrame display height = " + iframeTarget.clientHeight);
            var startPosY = iframeTarget.offsetTop + iframeTarget.clientHeight - 42; // One wheel turn before end.
            eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
            debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'changed', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'changed', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'ended', 'none');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'none', 'begin');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'none', 'continue');
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'none', 'end');
            setTimeout(checkForScroll, 100);
        }

        function setupTopLevel() {
            if (window.eventSender) {
                testRunner.waitUntilDone();

                setTimeout(scrollTest, 1000);
            } else {
                var messageLocation = document.getElementById('parent');
                var message = document.createElement('div');
                message.innerHTML = "<p>This test is better run under DumpRenderTree. To manually test it, place the mouse pointer<br/>"
                    + "inside the IFrame, then use the mouse wheel or a two-finger swipe to scroll the IFrame to the bottom (and beyond).<br/>"
                    + "<br/><br/>"
                    + "The test passes if you scroll far enough to see the row of END labels but the main page does not scroll.</p>";
                messageLocation.appendChild(message);
            }
        }
        </script>
        <iframe id="target" name="target" style="border:solid 1px green; height: 500px; width: 500px;" 
            src= "data:text/html,
                <html>
                    <head>
                        <style>div { width: 400px; height: 200px; } </style>
                    </head>
                    <body>
                        <div id='notToBeScrolled' style='height: 1000px; width: 1000px;'>
                            TOP TOP TOP TOP TOP TOP TOP TOP TOP TOP TOP TOP TOP TOP<br/><br/>
                            This should still be visible inside the frame after you scroll down
                            <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
                            <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
                            <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
                            This should NOT be visible inside the frame after you scroll down<br/>
                            <br/>
                            END END END END END END END END END END END END END
                        </div>
                    </body>
                </html>"
            onload="setupTopLevel();">
        </iframe>
        <div id="console"></div>
        <script>
        description("Tests that iframe doesn't pass wheel events to main frame when scrolling at bottom");
        </script>
        <script src="../../../resources/js-test-post.js"></script>
    </body>
</html>
