<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->

<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <style>
        body {
            height: 1500px;
        }
        #container {
            position: fixed;
            top: 10px;
            left: 10px;
            bottom: 30px;
            right: 10px;
            background-color: rgba(0, 0, 0, 0.5);
            padding: 10px;
            box-sizing: border-box;
            border: 5px solid black;
        }
        
        select {
            display: block;
            margin: 500px 200px 20px 20px;
        }
        
        button {
            display: block;
        }
        
    </style>
    <script src="../../../../fast/forms/ios/resources/zooming-test-utils.js"></script>
    <script src="../../../../resources/basic-gestures.js"></script>
    <script>
        if (window.testRunner)
            testRunner.waitUntilDone();

        function getScrollDownUIScript(x, y)
        {
            return `
                (function() {
                    uiController.didEndScrollingCallback = function() {
                        uiController.uiScriptComplete();
                    };

                    uiController.scrollToOffset(${x}, ${y});
                })();`
        }

        function getTapOnSelectUIScript(x, y)
        {
            return `
                (function() {
                    uiController.didStartFormControlInteractionCallback = function() {
                        uiController.selectFormAccessoryPickerRow(5);
                    };

                    uiController.didEndFormControlInteractionCallback = function() {
                        uiController.uiScriptComplete();
                    };

                    uiController.singleTapAtPoint(${x}, ${y}, function() {
                    });
                })();`
        }

        var clicked = false;
        var timeoutID;
        function buttonClicked()
        {
            window.clearTimeout(timeoutID);
            if (!clicked) {
                clicked = true;
                document.getElementById('result').textContent = 'PASS: hit testing found #target after select interaction';
                if (window.testRunner)
                    testRunner.notifyDone();
            }
        }

        async function tryTapOnButton()
        {
            var point = getPointInsideElement(document.getElementById('target'), 10, 10);
            await tapAtPoint(point.x, point.y);

            // We have to keep retrying, because the dimming view behind the popover animates out,
            // and we currently have no callback when that animation completes.
            if (!clicked)
                timeoutID = window.setTimeout(tryTapOnButton, 100);
        }

        function doTest()
        {
            if (!window.testRunner)
                return;
            testRunner.waitUntilDone();
            testRunner.dumpAsText();

            testRunner.runUIScript(getScrollDownUIScript(0, 500), function() {
                var selectElement = document.getElementsByTagName('select')[0];
                var point = getPointInsideElement(selectElement, 10, 10);
                testRunner.runUIScript(getTapOnSelectUIScript(point.x, point.y), function() {
                    document.getElementById('select-value').textContent = selectElement.value;
                    tryTapOnButton();
                });
            });
        }
        
        window.addEventListener('load', doTest, false);
        
    </script>
</head>
<body>
    <p>This is the top</p>
    <div id="container">
        <button id="target" onclick="buttonClicked()">Click Me</button>
        <select>
            <option>January</option>
            <option>February</option>
            <option>March</option>
            <option>April</option>
            <option>May</option>
            <option>June</option>
            <option>July</option>
            <option>August</option>
            <option>September</option>
        </select>
        <span id="select-value">Value goes here</span>
        <div id="result">FAIL: should have hit-tested and found #target element</div>
    </div>
    
</div>
</body>
</html>
