<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../resources/accessibility-helper.js"></script>
</head>
<body>

<div id="container" role="group">
    <div>Foo text, before modal</div>

    <div id="modal" role="dialog" aria-modal="true">
        <!-- Wrap the aria-hidden content in arbitrary div layers to ensure we don't consider the arbitrary divs accessible content. -->
        <div>
            <div>
                <div aria-hidden="true">
                     <button>Hidden button (inside modal)</button>
                </div>
                <div style="display: none;">
                     Text inside display: none
                </div>
            </div>
        </div>
    </div>

    <div>Foo text, after modal</div>
</div>

<script>
    var testOutput = "This test ensures that we ignore modals that don't have any accessible content.\n";

    async function findTextInsideId(id) {
        const containerElement = accessibilityController.accessibleElementById(id);
        testOutput += `\nBeginning search from #${id} element.\n`;

        let searchResult = null;
        while (true) {
            searchResult = containerElement.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false);
            if (!searchResult)
                break;

            if (searchResult.role.includes("StaticText")) {
                testOutput += `\n${searchResult.role}`;
                const textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue;
                testOutput += `\n${textContent}\n`;
            }
        }
    }

    if (window.accessibilityController) {
        window.jsTestIsAsync = true;

        setTimeout(async function() {
            await findTextInsideId("container");

            testOutput += "\nAppending a text node to modal to make it accessible.";
            let text = document.createTextNode("Foo text, inside modal");
            document.getElementById("modal").appendChild(text);

            await waitFor(() => {
                let innerModalGroup = accessibilityController.accessibleElementById("modal").childAtIndex(0);
                // Wait for text node to be added as an AX child.
                return innerModalGroup && innerModalGroup.childAtIndex(0);
            });

            let containerElement = accessibilityController.accessibleElementById("container");
            if (containerElement)
                testOutput += "\nFAIL: #container AX element was still accessible after adding accessible content to modal.\n";
            else
                testOutput += "\nPASS: #container AX element is no longer accessible after adding accessible content to modal.\n";

            await findTextInsideId("modal");

            document.getElementById("container").style.visibility = "hidden";
            debug(testOutput);
            finishJSTest();
        }, 0);
    }
</script>
</body>
</html>
