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

.table td, .table th {
    padding: 2px;
}

.table th {
    height: 20px;
    text-align: left;
    font-weight: strong;
}

.table tr:nth-child(odd) {
    background: #f3f3f3;
}

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

</style>
<script src="../../resources/js-test-pre.js"></script>
<script>
function onLoad() {
    setupTopLevel();
    window.addEventListener("scroll", onPageScroll);
}
</script>
</head>
<body onload="onLoad();">
<script>

var divTarget;
var pageScrollPositionBefore;
var divScrollPositionBefore;
var continueCount = 5;

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

let didCheck = false;
function checkForScroll()
{
    if (didCheck)
        return;
    didCheck = true;

    // The div should not have scrolled at all.
    var pageScrollPositionAfter = document.scrollingElement.scrollTop;
    var divScrollPositionAfter = divTarget.scrollTop;

    if (divScrollPositionBefore != divScrollPositionAfter)
        testFailed("Scrollable div consumed wheel events.");
    else
        testPassed("Scrollable div 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);
    }

    testRunner.notifyDone();
}

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

    divTarget = document.getElementById('target');

    divScrollPositionBefore = divTarget.scrollTop;

    // Scroll the #source until we reach the #target.
    var startPosX = Math.round(divTarget.offsetLeft) + 20;
    var startPosY = Math.round(divTarget.offsetTop) - 42;
    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, -4, 'none', 'continue');
    eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'none', 'end');
    eventSender.callAfterScrollingCompletes(checkForScroll);
    // We should finish via the scroll event; this will fire in the case of failure when the page doesn't scroll.
}

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

        eventSender.monitorWheelEvents();
        requestIdleCallback(() => {
            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 the<br/>"
            + "down past the div.<br/><br/>"
            + "The scrollable region should not scroll.</p>";
        messageLocation.appendChild(message);
    }
}

</script>
<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 Region</h3>
        <div id="target" style='overflow-y: auto; overflow-x: hidden; height: 350px;'>
            <table class="table" style='width: 99%'>
                <tr><th>Count</th><th>DATA</th><th>Rev Count</th></tr>
                <tr><td>TOP TOP TOP TOP TOP</td><td>TOP TOP TOP TOP TOP</td><td>TOP TOP TOP TOP TOP</td></tr>
                <tr><td>1</td><td>0.1100</td><td>40</td></tr>
                <tr><td>2</td><td>0.1155</td><td>39</td></tr>
                <tr><td>3</td><td>0.2200</td><td>38</td></tr>
                <tr><td>4</td><td>0.2255</td><td>37</td></tr>
                <tr><td>5</td><td>0.3300</td><td>36</td></tr>
                <tr><td>6</td><td>0.3355</td><td>35</td></tr>
                <tr><td>7</td><td>0.4400</td><td>34</td></tr>
                <tr><td>8</td><td>0.4455</td><td>33</td></tr>
                <tr><td>9</td><td>0.5500</td><td>32</td></tr>
                <tr><td>10</td><td>0.5555</td><td>31</td></tr>
                <tr><td>11</td><td>0.6600</td><td>30</td></tr>
                <tr><td>12</td><td>0.6655</td><td>29</td></tr>
                <tr><td>13</td><td>0.7700</td><td>28</td></tr>
                <tr><td>14</td><td>0.7755</td><td>27</td></tr>
                <tr><td>15</td><td>0.8800</td><td>26</td></tr>
                <tr><td>16</td><td>0.8855</td><td>25</td></tr>
                <tr><td>17</td><td>0.9900</td><td>24</td></tr>
                <tr><td>18</td><td>0.9955</td><td>23</td></tr>
                <tr><td>19</td><td>0.9999</td><td>22</td></tr>
                <tr><td>20</td><td>1.0000</td><td>21</td></tr>
                <tr><td>21</td><td>1.0000</td><td>20</td></tr>
                <tr><td>22</td><td>0.9999</td><td>19</td></tr>
                <tr><td>23</td><td>0.9955</td><td>18</td></tr>
                <tr><td>24</td><td>0.9900</td><td>17</td></tr>
                <tr><td>25</td><td>0.8855</td><td>16</td></tr>
                <tr><td>26</td><td>0.8800</td><td>15</td></tr>
                <tr><td>27</td><td>0.7755</td><td>14</td></tr>
                <tr><td>28</td><td>0.7700</td><td>13</td></tr>
                <tr><td>29</td><td>0.6655</td><td>12</td></tr>
                <tr><td>30</td><td>0.6600</td><td>11</td></tr>
                <tr><td>31</td><td>0.5555</td><td>10</td></tr>
                <tr><td>32</td><td>0.5500</td><td>9</td></tr>
                <tr><td>33</td><td>0.4455</td><td>8</td></tr>
                <tr><td>34</td><td>0.4400</td><td>7</td></tr>
                <tr><td>35</td><td>0.3355</td><td>6</td></tr>
                <tr><td>36</td><td>0.3300</td><td>5</td></tr>
                <tr><td>37</td><td>0.2255</td><td>4</td></tr>
                <tr><td>38</td><td>0.2200</td><td>3</td></tr>
                <tr><td>39</td><td>0.1155</td><td>2</td></tr>
                <tr><td>40</td><td>0.1100</td><td>1</td></tr>
                <tr><td>END END END END END</td><td>END END END END END</td><td>END END END END END</td></tr>
            </table>
        </div>
    </div>
</div>
<div id="console"></div>
<script>
description("Tests that a scrollable div 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>
