<!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="content">
    <!-- A link always gets its accessible text from contents. -->
    <a id="link" href="#">A</a>

    <!-- A generic focusable div should not get its accessible text from contents. -->
    <div id="div" tabindex="0">B</div>
    <div id="div2" tabindex="0"><div></div>C</div>
    <div id="div3" tabindex="0" aria-label="D"></div>

    <!-- A generic focusable div should not get accessible text from children that are focusable or containers. -->
    <div id="div4" tabindex="0"><a href="#">Link</a></div>
    <div id="div5" tabindex="0">Initial text before link<a href="#">Link</a></div>
    <div id="div6" tabindex="0"><ul><li>List item</li></ul></div>
    <div id="div7" tabindex="0">Initial text before list<ul><li>List item</li></ul></div>
</div>

<script>
    description("This test makes sure that a generic focusable div can get accessibility focus. It should not get accessible text from its children automatically though.");

    function lastChar(str) {
        return str.substr(str.length - 1);
    }

    async function waitForFocus(id) {
        document.getElementById(id).focus();
        shouldBe("document.activeElement.id", `"${id}"`);
        let axFocusedElement;
        await waitFor(() => {
            axFocusedElement = accessibilityController.focusedElement;
            return axFocusedElement && axFocusedElement.domIdentifier === id;
        });
        return axFocusedElement;
    }

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

        setTimeout(async function() {
            window.axLink = await waitForFocus("link");
            shouldBe("lastChar(axLink.title)", "\"A\"");

            window.axDiv = await waitForFocus("div");
            shouldBe("lastChar(axDiv.title)", "' '");

            window.axDiv2 = await waitForFocus("div2");
            shouldBe("lastChar(axDiv2.title)", "' '");

            window.accNameForDiv3 = platformValueForW3CName(await waitForFocus("div3"));
            shouldBe("lastChar(accNameForDiv3)", "\"D\"");

            window.axDiv4 = await waitForFocus("div4");
            shouldBe("axDiv4.title.indexOf('Link')", "-1");

            window.axDiv5 = await waitForFocus("div5");
            shouldBe("axDiv5.title.indexOf('Link')", "-1");
            shouldBe("axDiv5.title.indexOf('Initial text before link') >= 0", "false");

            window.axDiv6 = await waitForFocus("div6");
            shouldBe("axDiv6.title.indexOf('List item')", "-1");

            window.axDiv7 = await waitForFocus("div7");
            shouldBe("axDiv7.title.indexOf('List item')", "-1");
            shouldBe("axDiv7.title.indexOf('Initial text before list') >= 0", "false");

            document.getElementById("content").style.visibility = "hidden";

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