<!DOCTYPE html>
<html dir="rtl">
<head>
    <link rel="stylesheet" href="resources/scrollable-style.css">
    <script src="../../resources/js-test-pre.js"></script>
    <style>
    .origin {
        position: absolute;
        top: 0;
        left: 0;
        height: 10px;
        width: 10px;
        background-color: blue;
    }
    
    .wide {
        width: 1200px;
        height: 10px;
        background-color: silver;
    }
    iframe {
        position: absolute;
    }
    </style>
    <script>
    var pageScrollPositionBefore;
    var iframeScrollPositionBefore;
    
    function checkForScroll()
    {
        // The iframe should have scrolled, but not the main page.
        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()
    {
        pageScrollPositionBefore = document.scrollingElement.scrollTop;

        var iframeTarget = document.getElementById('target');
        iframeScrollPositionBefore = iframeTarget.contentDocument.scrollingElement.scrollTop;

        var startPosX = iframeTarget.offsetLeft + 20;
        var startPosY = iframeTarget.offsetTop + 20;

        eventSender.monitorWheelEvents();
        eventSender.mouseMoveTo(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');
        eventSender.callAfterScrollingCompletes(checkForScroll);
    }
    
    function startTest()
    {
        if (window.eventSender) {
            testRunner.waitUntilDone();
            setTimeout(scrollTest, 0);
        }
    }
    
    window.addEventListener('load', startTest, false);
    </script>
</head>
<body>
    <div class="wide">
    <div class="origin"></div>

    <iframe id="target" name="target" style="border:solid 1px green; height: 300px; width: 300px;" 
        src= "data:text/html,
            <html>
                <head>
                    <style>div { width: 400px; height: 1000px; background-color: green; } </style>
                </head>
                <body>
                    <div></div>
                </body>
            </html>">
    </iframe>
    <div id='console'></div>
</html>
