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

<!-- Testcase for element with renderer. -->
<button id="button">Click me</button>

<!-- Testcase for element with no renderer. -->
<canvas id="canvas" tabindex="0">
    <div aria-label="Some canvas fallback content" role="group">
        Foo
    </div>
</canvas>

<!-- When the bug preventing display:contents elements from gaining focus is fixed, we should add a testcase for that too. -->

<script>
    var testOutput = "This test ensures you can set focus to AX elements via the AX API (not the DOM).\n\n";

    function checkFocusState() {
        testOutput += `#button isFocused: ${accessibilityController.accessibleElementById("button").isFocused}\n`;
        testOutput += `#canvas isFocused: ${accessibilityController.accessibleElementById("canvas").isFocused}\n`;
    }

    async function waitForFocusOf(id) {
        testOutput += `\nFocusing #${id}.\n`;
        const axElement = accessibilityController.accessibleElementById(id);
        axElement.takeFocus();
        await waitFor(() => {
            const focusedElement = accessibilityController.focusedElement;
            return focusedElement && focusedElement.domIdentifier == axElement.domIdentifier;
        });
        checkFocusState();
    }

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

        testOutput += "Checking initial button focus state.\n";
        checkFocusState();

        setTimeout(async function() {
            await waitForFocusOf("button");
            await waitForFocusOf("canvas");

            debug(testOutput);
            finishJSTest();
        }, 0);
    }
</script>
</body>
</html>

