<!DOCTYPE html>
<html>
<head>
<style>
.scrollable_region {
    width: 680px;
}
.contents {
    height: 1024px;
    background-image: repeating-linear-gradient(silver, white 200px);
}
</style>
<script src="../../../resources/js-test-pre.js"></script>
<script>
    jsTestIsAsync = true;

    var wrapperTarget;
    var divTarget;
    var pageScrollPositionBefore;
    var wrapperScrollPositionBefore;
    var divScrollPositionBefore;

    function checkForSecondScroll()
    {
        // 'parent' should have scrolled, the content of 'target' should
        // not have scrolled, and 'wrapper' should not have scrolled.
        var pageScrollPositionAfter = document.scrollingElement.scrollTop;
        var wrapperScrollPositionAfter = wrapperTarget.scrollTop;
        var divScrollPositionAfter = divTarget.scrollTop;

        debug("Second scroll event:");
        if (pageScrollPositionBefore != pageScrollPositionAfter)
            testPassed("Page received wheel events during the second gesture.");
        else
            testFailed("Page did not receive wheel events during the second gesture.");

        if (wrapperScrollPositionBefore != wrapperScrollPositionAfter)
            testFailed("Wrapper received wheel events during the second gesture.");
        else
            testPassed("Wrapper did not receive wheel events during the second gesture.");

        if (divScrollPositionBefore != divScrollPositionAfter)
            testFailed("div received wheel events during the second gesture.");
        else
            testPassed("div did not receive wheel events during the second gesture.");

        finishJSTest();
    }

    function checkForFirstScroll()
    {
        // 'parent' should not have scrolled, and the content of 'target' should
        // not have moved. However, 'wrapper' should have moved.
        var pageScrollPositionAfter = document.scrollingElement.scrollTop;
        var wrapperScrollPositionAfter = wrapperTarget.scrollTop;
        var divScrollPositionAfter = divTarget.scrollTop;

        debug("First scroll event:");
        if (pageScrollPositionBefore != pageScrollPositionAfter)
            testFailed("Page received wheel events during the first gesture.");
        else
            testPassed("Page did not receive wheel events during the first gesture.");

        if (wrapperScrollPositionBefore != wrapperScrollPositionAfter)
            testPassed("Wrapper received wheel events during the first gesture.");
        else
            testFailed("Wrapper did not receive wheel events during the first gesture.");

        if (divScrollPositionBefore != divScrollPositionAfter)
            testFailed("div received wheel events during the first gesture.");
        else
            testPassed("div did not receive wheel events during the first gesture.");

        wrapperScrollPositionBefore = wrapperTarget.scrollTop;

        eventSender.monitorWheelEvents();
        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(checkForSecondScroll);
    }

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

        divTarget = document.getElementById('target');
        divTarget.scrollTop = divTarget.scrollHeight - divTarget.clientHeight - 100;

        divScrollPositionBefore = divTarget.scrollTop;

        wrapperTarget = document.getElementById('wrapper');
        wrapperScrollPositionBefore = wrapperTarget.scrollTop;
        debug("wrapperTarget = " + wrapperTarget);

        // Move mouse to a position to the right side of the table, and near the bottom.
        var startPosX = divTarget.offsetLeft + divTarget.clientWidth + 50;
        var startPosY = Math.round(divTarget.offsetTop) - 42; // One wheel turn before end.

        eventSender.monitorWheelEvents();
        eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
        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, -5, 'none', 'begin');
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -10, 'none', 'continue');
        eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'none', 'end');
        eventSender.callAfterScrollingCompletes(checkForFirstScroll);
    }

    function setupTopLevel()
    {
        description("Tests that a scrollable div nested inside another scrollable div properly handles wheel events under sub-pixel conditions.");
        if (window.eventSender) {
            setTimeout(scrollTest, 0);
            return;
        }
        
        finishJSTest();
    }

    window.addEventListener('load', () => {
        setupTopLevel();
    }, false);
</script>
</head>
<body>
<div id="parent" style="height: 2000px; width: 800px;">
    <div id="wrapper" style='overflow-y: auto; overflow-x: hidden; max-height: 600px;'>
        <div id="source" style="height: 100px; width: 600px;">
            Put mouse next to the table labeled 'Scrollable Region' and flick downward. The scroll movement
            should come to a halt. Then flick again. The overall page should scroll.
        </div>
        <div class="scrollable_region">
            <h3>Scrollable Region</h3>
            <div id="target" style='overflow-y: auto; overflow-x: hidden; max-height: 485.55px;'>
                <div class="contents">
                </div>
            </div>
            <div id="bottom" style="height: 100px; width: 600px;">
                <p>A set of information at the bottom of the table.</p>
            </div>
        </div>
    </div>
</div>
<div id="console"></div>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
