<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
<html>
<head>
    <style>
        body {
            height: 1000px;
        }
        .scroller {
            position: absolute;
            top: 10px;
            left: 10px;
            height: 300px;
            width: 300px;
            border: 20px solid gray;
            padding: 5px;
            overflow: scroll;
        }
        .content {
            width: 200%;
            height: 300%;
        }
        
        .overlapper {
            position: absolute;
            width: 300px;
            height: 300px;
            top: 200px;
            left: 200px;
            border-radius: 50%;
            box-shadow: 0 0 20px black; /* Inflate layer size for testing */
            background-color: rgba(0, 0, 128, 0.5);
        }
        
    </style>
    <script src="../../../resources/js-test-pre.js"></script>
    <script src="../../../resources/ui-helper.js"></script>
    <script>
        var jsTestIsAsync = true;

        var scroller;
        var overflowScrollEventCount = 0;
        var windowScrollEventCount = 0;

        async function resetScrollPositions()
        {
            window.scrollTo(0, 0);
            scroller.scrollTop = 0;
            
            // Wait for scroll events to fire.
            await UIHelper.animationFrame();

            overflowScrollEventCount = 0;
            windowScrollEventCount = 0;
        }
        
        async function testScrollOverContent()
        {
            debug('');
            debug('Test scroll over content');
            await resetScrollPositions();
            await UIHelper.mouseWheelScrollAt(50, 50);

            shouldBe('overflowScrollEventCount > 0', 'true');
            shouldBe('windowScrollEventCount == 0', 'true');
        }

        async function testScrollOverOverlapper()
        {
            debug('');
            debug('Test scroll over overlapping element');
            await resetScrollPositions();
            await UIHelper.mouseWheelScrollAt(300, 300);
            
            shouldBe('overflowScrollEventCount == 0', 'true');
            shouldBe('windowScrollEventCount > 0', 'true');
        }

        async function testScrollOverOverlapperOutsideRadius()
        {
            debug('');
            debug('Test scroll over overlapping element outside border');
            await resetScrollPositions();
            await UIHelper.mouseWheelScrollAt(230, 230);
            
            shouldBe('overflowScrollEventCount > 0', 'true');
            shouldBe('windowScrollEventCount == 0', 'true');
        }

        async function scrollTest()
        {
            await testScrollOverContent();
            await testScrollOverOverlapper();
            await testScrollOverOverlapperOutsideRadius();

            finishJSTest();
        }

        window.addEventListener('load', () => {
            scroller = document.querySelector('.scroller');
            scroller.addEventListener('scroll', () => {
                ++overflowScrollEventCount;
            }, false);

            window.addEventListener('scroll', () => {
                ++windowScrollEventCount;
            }, false);

            setTimeout(scrollTest, 0);
        }, false);

        var successfullyParsed = true;
    </script>
</head>
<body>
    <div class="scroller">
        <div class="content"></div>
    </div>
    <div class="overlapper"></div>
    <script src="../../../resources/js-test-post.js"></script>
</body>
</html>
