<html>
<head>
    <script src="../../../resources/js-test-pre.js"></script>
    <style type="text/css">
    #wrapper {
        height: 400px;
        width: 600px;
        overflow: scroll;
        background-color: #EEE;
    }

    iframe {
        background-color: #CCC;
        width: 400px;
        height: 100px;
        margin-bottom: 1000px;
    }

    body {
        margin: 0;
    }
    </style>
    <script>
    jsTestIsAsync = true;

    function checkForScroll() {
        var iframe = document.getElementById("frame");
        var wrapper = document.getElementById("wrapper");
        if (iframe.contentWindow.scrollY && !wrapper.scrollTop)
            testPassed("The iframe scrolled but the wrapper did not.");
        else
            testFailed("The iframe's scroll position is: " + iframe.contentWindow.scrollY + ", and the wrapper's scroll position is: " + wrapper.scrollTop);

        finishJSTest();
    }

    function scrollTest()
    {
        eventSender.monitorWheelEvents();
        eventSender.mouseMoveTo(200, 50);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "began", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, "changed", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "ended", "none");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, "none", "begin");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, "none", "continue");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, "none", "continue");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, "none", "continue");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, "none", "continue");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, "none", "continue");
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "none", "end");
        eventSender.callAfterScrollingCompletes(checkForScroll);
    }

    function setup() {
        if (window.eventSender) {
            setTimeout(scrollTest, 0);
            return;
        }
        
        var message = document.createElement("div");
        message.innerHTML = "<p>To run this test manually, place the mouse pointer "
            + "inside the iframe, then use a two-finger swipe to scroll the iframe to the bottom (and beyond).</p>"
            + "<p>The test passes if the overflow container does not scroll but the iframe scrolls to the bottom.</p>";
        document.body.appendChild(message);
        finishJSTest();
    }

    </script>
</head>
<body onload="setup()">
    <div id="wrapper">
        <iframe id="frame" src="./resources/inner_content.html"></iframe>
    </div>
    <script src="../../../resources/js-test-post.js"></script>
</body>
</html>
