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

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

pre {
    max-height: 200px;
    max-width: 200px;
}
</style>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../resources/ui-helper.js"></script>
<script>
    window.jsTestIsAsync = true;

    var selectTarget;
    var pageScrollPositionBefore;
    var selectScrollPositionBefore;

    function onPageScroll()
    {
        if (document.scrollingElement.scrollTop >= 70)
            checkForScroll();
    }

    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.");

        if (window.internals) {
            document.getElementById('layers').innerText = internals.layerTreeAsText(document,
                internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS | internals.LAYER_TREE_INCLUDES_TILE_CACHES);
        }

        finishJSTest();
    }

    async function scrollTest()
    {
        selectTarget = document.getElementById('target');

        pageScrollPositionBefore = document.scrollingElement.scrollTop;
        selectScrollPositionBefore = selectTarget.scrollTop;

        // Scroll the #source until we reach the #target.
        const startPosX = Math.round(selectTarget.offsetLeft) + 20;
        const startPosY = Math.round(selectTarget.offsetTop) - 42;

        const events = [
            {
                type : "wheel",
                viewX : startPosX,
                viewY : startPosY,
                deltaY : -10,
                phase : "began"
            },
            {
                type : "wheel",
                deltaY : -10,
                phase : "changed"
            },
            {
                type : "wheel",
                deltaY : -10,
                phase : "changed"
            },
            {
                type : "wheel",
                phase : "ended"
            },
            {
                type : "wheel",
                deltaY : -10,
                momentumPhase : "began"
            },
            {
                type : "wheel",
                deltaY : -40,
                momentumPhase : "changed"
            },
            {
                type : "wheel",
                momentumPhase : "ended"
            }
        ];

        await UIHelper.mouseWheelSequence({ events: events });
        checkForScroll();
        // We should finish via the scroll event; this will fire in the case of failure when the page doesn't scroll.
    }

    function setupTest()
    {
        window.addEventListener("scroll", onPageScroll);

        if (window.eventSender) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
            setTimeout(scrollTest, 0);
        } 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/>"
                + "at the top of the page, and then use the mouse wheel or a two-finger swipe to scroll down<br/>"
                + "past the selectTarget.<br/><br/>"
                + "You should not see the 'content21' label if this test is successful.</p>";
            messageLocation.appendChild(message);
        }
    }
    
    window.addEventListener('load', setupTest, 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>
description("Tests that a select doesn't consume wheel events when scroll is latched to main frame.");
</script>
<pre id="layers">Layer tree goes here</p>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
