<!DOCTYPE html>
<html>
<head>
<style>
.scrollable_region {
    width: 680px;
}

.scrollable_select option:nth-child(odd) {
    background: #f3f3f3;
}

</style>
<script src="../../../resources/js-test-pre.js"></script>
<script>
    jsTestIsAsync = true;

    var selectTarget;
    var pageScrollPositionBefore;
    var selectScrollPositionBefore;

    function checkForScroll()
    {
        // The select should not have scrolled at all.
        var pageScrollPositionAfter = document.scrollingElement.scrollTop;
        var selectScrollPositionAfter = selectTarget.scrollTop;

        if (selectScrollPositionBefore != selectScrollPositionAfter)
            testFailed("Select consumed wheel events.");
        else
            testPassed("Select did not receive wheel events.");

        finishJSTest();
    }

    function scrollTest()
    {
        pageScrollPositionBefore = document.scrollingElement.scrollTop;

        selectTarget = document.getElementById('target');

        selectScrollPositionBefore = selectTarget.scrollTop;

        // Scroll the #source until we reach the #target.
        var startPosX = Math.round(selectTarget.offsetLeft) + 20;
        var startPosY = Math.round(selectTarget.offsetTop) - 42; // Slightly more than one wheel scroll away from the iframe
        eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
        debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");

        eventSender.monitorWheelEvents();
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none', true);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'changed', 'none', true);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'changed', 'none', true);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'ended', 'none', true);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'none', 'begin', true);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'none', 'continue', true);
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'none', 'end', true);
        eventSender.callAfterScrollingCompletes(checkForScroll);
    }

    function setupTopLevel()
    {
        description("Tests that a select doesn't consume wheel events when scroll is latched to main frame.");

        if (window.eventSender) {
            setTimeout(scrollTest, 0);
            return;
        }
        
        var messageLocation = document.getElementById('parent');
        var message = document.createElement('div');
        message.innerHTML = "<p>To manually run this test, place the mouse pointer "
            + "at the top of the page, and then use the mouse wheel or a two-finger swipe to scroll down "
            + "past the selectTarget.</p>"
            + "<p>You should not see the 'content21' label if this test is successful.</p>";
        messageLocation.appendChild(message);
        finishJSTest();
    }

    window.addEventListener('load', () => {
        setupTopLevel();
    }, false);
    </script>
</head>
<body>
<div id="parent" style="height: 2000px; width: 2000px;">
    <div id="source" style="height: 100px; width: 500px;">
        Put mouse here and flick downwards
    </div>
        <div class="scrollable_region">
            <h3>Scrollable Select</h3>
            <select id="target" class="scrollable_select" size="8">
                <option>content1</option>
                <option>content2</option>
                <option>content3</option>
                <option>content4</option>
                <option>content5</option>
                <option>content6</option>
                <option>content7</option>
                <option>content8</option>
                <option>content9</option>
                <option>content10</option>
                <option>content11</option>
                <option>content12</option>
                <option>content13</option>
                <option>content14</option>
                <option>content15</option>
                <option>content16</option>
                <option>content17</option>
                <option>content18</option>
                <option>content19</option>
                <option>content20</option>
                <option>content21</option>
            </select>
        </div>
    </div>
</div>
<div id="console"></div>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
