<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
<html>
<head>
    <meta name="viewport" content="initial-scale=1">
    <script src="../../../../resources/js-test-pre.js"></script>
    <script src="../../../../resources/ui-helper.js"></script>
    <style>
        body {
            margin: 0;
        }
    </style>
</head>
<body>
    <div id="eventTarget" style="overflow: scroll; height: 200px">
        <div style="height: 3000px"></div>
    </div>
    <p id="description"></p>
    <div id="console">
    </div>
    <script>
        description("Test scrolling on a block without -webkit-overflow-scrolling.");
        window.jsTestIsAsync = true;

        async function runTest()
        {
            let eventTarget = document.getElementById("eventTarget");

            function touchEventHandler(event) {
                if (event.touches.length)
                    debug("Received" + (event.cancelable ? " cancelable" : "") + " event " + event.type + " at " + event.touches[0].clientX + ", " + event.touches[0].clientY);
                else
                    debug("Received" + (event.cancelable ? " cancelable" : "") + " event " + event.type);
            }

            document.addEventListener('touchstart', touchEventHandler, { 'passive': true });
            document.addEventListener('touchmove', touchEventHandler, { 'passive': true });
            document.addEventListener('touchend', touchEventHandler, { 'passive': true });
            document.addEventListener('touchcancel', touchEventHandler, { 'passive': true });

            shouldBe("window.scrollX", "0");
            shouldBe("window.scrollY", "0");
            shouldBe("document.documentElement.scrollTop", "0");
            shouldBe("document.documentElement.scrollLeft", "0");
            shouldBe("document.getElementById('eventTarget').scrollTop", "0");
            shouldBe("document.getElementById('eventTarget').scrollLeft", "0");

            await UIHelper.callFunctionAndWaitForTargetScrollToFinish(eventTarget, async () => {
                await UIHelper.dragFromPointToPoint(50, 150, 50, 50, 0.15);
            });

            shouldBe("window.scrollX", "0");
            shouldBe("window.scrollY", "0");
            shouldBe("document.documentElement.scrollTop", "0");
            shouldBe("document.documentElement.scrollLeft", "0");
            shouldBeTrue("document.getElementById('eventTarget').scrollTop > 0");
            shouldBe("document.getElementById('eventTarget').scrollLeft", "0");
            finishJSTest();
        }

        window.addEventListener('load', runTest, false);
    </script>
    <script src="../../../../resources/js-test-post.js"></script>
</body>
</html>
