<!DOCTYPE html> <!-- webkit-test-runner [ AsyncOverflowScrollingEnabled=true ] -->
<html>
<head>
    <style>
        body {
            height: 2000px;
        }

        .scroller {
            margin: 10px;
            width: 500px;
            height: 400px;
            overflow: auto;
            border: 2px solid black;
        }
        
        .horizontal .scroller {
            width: 400px;
            height: 400px;
            margin: 10px;
        }
        
        .filler {
            height: 200px;
            width: 100%;
            margin: 10px;
            background-color: silver;
        }

        .horizontal .filler {
            height: 80%;
            width: 200%;
            background-color: silver;
        }
    </style>
    <script src="../../../resources/js-test-pre.js"></script>
    <script src="../../../resources/ui-helper.js"></script>
    
    <script>
        jsTestIsAsync = true;

        var minXOffset = 0;
        var maxXOffset = -1000;
        
        async function onScrollCompletion(x, y)
        {
            eventSender.monitorWheelEvents();
            eventSender.mouseMoveTo(x, y);
            eventSender.mouseScrollByWithWheelAndMomentumPhases(1, 0, "began", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(10, 0, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(10, 0, "changed", "none");
            await UIHelper.animationFrame();
            eventSender.mouseScrollByWithWheelAndMomentumPhases(10, 0, "changed", "none");
            eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, "ended", "none");
            return UIHelper.waitForScrollCompletion();
        }
        
        async function onSwipeCallback()
        {
            return new Promise(resolve => {
                testRunner.installDidBeginSwipeCallback(resolve);
            });
        }

        async function scrollTest()
        {
            description('A back swipe, over a scrolled-to-left overflow, should start a navigation gesture.');

            if (window.testRunner) {
                testRunner.setNavigationGesturesEnabled(true);
            }

            history.pushState({ name: 'backstate' }, 'back');

            window.addEventListener('scroll', () => {
                minXOffset = Math.min(minXOffset, window.pageXOffset);
                maxXOffset = Math.max(maxXOffset, window.pageXOffset);
            }, false);

            if (!window.eventSender) {
                finishJSTest();
                return;
            }

            const mouseLocationX = 150; // Over the horizontally scrollable overflow.
            const mouseLocationY = 300;

            debug('Swipe to the left');
            
            await Promise.all([onSwipeCallback(), onScrollCompletion(mouseLocationX, mouseLocationY)]);

            // Should not have received any scroll events.
            shouldBe('minXOffset', '0');
            shouldBe('maxXOffset', '-1000');

            finishJSTest();
        }

        window.addEventListener('load', () => {
            scrollTest();
        }, false);
    </script>
</head>
<body>
    <div id="outer" class="scroller">
        <div class="filler">Scrolls vertically</div>
        <div id="inner" class="horizontal scroller">
            <div class="filler">Scrolls horizontally</div>
        </div>
        <div class="filler"></div>
    </div>
    <div id="console"></div>
    <script src="../../../resources/js-test-post.js"></script>
</body>
</html>
