<!DOCTYPE html> <!-- webkit-test-runner [ AsyncOverflowScrollingEnabled=true ] -->
<html>
<head>
    <meta name="viewport" content="width=device-width">
    <style>
        div {
            box-sizing: border-box;
        }
        .container {
            position: relative;
            width: 200px;
            height: 200px;
            margin: 10px;
            border: 1px solid black;
        }
        
        .scroller {
            overflow: scroll;
        }
        
        .content {
            width: 100%;
            height: 300%;
            background-image: repeating-linear-gradient(white, silver 200px);
        }
        
        .overlay {
            transform-origin: top left;
            background-color: rgba(0, 0, 0, 0.25);
        }
        
        .container > div {
            position: absolute;
            width: 100%;
            height: 100%;
        }
    </style>
    <script src="../../../resources/ui-helper.js"></script>
    <script src="../../../resources/js-test-pre.js"></script>
    <script>
        var scrollTopWithScale0Overlay;
        var scrollTopWithScaledOverlayHitOverlay;
        var scrollTopWithScaledOverlayHitScroller;

        window.addEventListener('load', async () => {

            let scrollers = document.querySelectorAll('.scroller');
            let bounds = scrollers[0].getBoundingClientRect();

            await UIHelper.immediateScrollElementAtContentPointToOffset(bounds.left + 10, bounds.top + 10, 0, 100);
            scrollTopWithScale0Overlay = scrollers[0].scrollTop;
            
            // In case the previous scroll failed.
            document.scrollingElement.scrollTop = 0;
            scrollers[1].scrollTop = 0;

            bounds = scrollers[1].getBoundingClientRect();
            // Hit the overlay
            await UIHelper.immediateScrollElementAtContentPointToOffset(bounds.left + 10, bounds.top + 10, 0, 100);
            scrollTopWithScaledOverlayHitOverlay = scrollers[1].scrollTop;

            // In case the previous scroll failed.
            document.scrollingElement.scrollTop = 0;
            scrollers[1].scrollTop = 0;

            // Hit the scroller
            await UIHelper.immediateScrollElementAtContentPointToOffset(bounds.left + bounds.width / 2 + 10, bounds.top + 10, 0, 100);
            scrollTopWithScaledOverlayHitScroller = scrollers[1].scrollTop;
            
            description('Tests hit-testing of layers over scrollers with odd transforms');
            shouldBe('scrollTopWithScale0Overlay', '100');
            shouldBe('scrollTopWithScaledOverlayHitOverlay', '0');
            shouldBe('scrollTopWithScaledOverlayHitScroller', '100');

            finishJSTest();
            
        }, false);

        var successfullyParsed = true;
        var jsTestIsAsync = true;
    </script>
    <script src="../../../resources/js-test-post.js"></script>
</head>
<body>
    <div class="container">
        <div class="scroller">
            <div class="content"></div>
        </div>
        <div class="overlay" style="transform: scale(0)"></div>
    </div>

    <div class="container">
        <div class="scroller">
            <div class="content"></div>
        </div>
        <div class="overlay" style="transform: scale(0.5)"></div>
    </div>
</body>
</html>
