<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
<script src="../resources/accessibility-helper.js"></script>

<style>
myelement {
  display: block;
}
</style>
</head>
<body>

<div>
  <a id="link1" href="#">Link</a>
  <button id="button1">Button</button>
  <input id="text1" type="text">
  <input id="checkbox1" type="checkbox">
  <input id="radio1" type="radio">
  <input id="submit1" type="submit">
  <select id="combobox1"><option>1<option>2</select>
  <myelement id="focusable1" tabindex="0">Focusable</myelement>
  <div id="aria-button1" tabindex="0" role="button">ARIA button</div>
  <div id="aria-link1" tabindex="0" role="link">ARIA link</div>
</div>

<canvas id="myCanvas" width="300" height="300">
  <a id="link2" href="#">Link</a>
  <button id="button2">Button</button>
  <input id="text2" type="text">
  <input id="checkbox2" type="checkbox">
  <input id="radio2" type="radio">
  <input id="submit2" type="submit">
  <select id="combobox2"><option>1<option>2</select>
  <myelement id="focusable2" tabindex="0">Focusable</myelement>
  <div id="aria-button2" tabindex="0" role="button">ARIA button</div>
  <div id="aria-link2" tabindex="0" role="link">ARIA link</div>
</canvas>

<div id="console"></div>

<script>
    description("This test makes sure that focusable elements in canvas fallback content are accessible.");

    if (window.testRunner && window.accessibilityController) {
        window.jsTestIsAsync = true;
        window.testRunner.dumpAsText();

        var comboBoxRole = platformRoleForComboBox(accessibilityController.platformName);

        function check(id, expectedRole) {
            window.element = document.getElementById(id);
            element.focus();

            window.axElement = accessibilityController.focusedElement;
            if (axElement.role == expectedRole) {
                // Do all the logging here and return true.
                debug(id);
                shouldBe("document.activeElement == element", "true");
                shouldBe("axElement.role", "\"" + expectedRole + "\"");
                debug("");
                return true;
            }

            return false;
        }

        setTimeout(async function() {
            // Check rendered controls.
            await waitFor(() => {
                return check("link1", "AXRole: AXLink");
            });

            await waitFor(() => {
                return check("button1", "AXRole: AXButton");
            });

            await waitFor(() => {
                return check("text1", "AXRole: AXTextField");
            });

            await waitFor(() => {
                return check("checkbox1", "AXRole: AXCheckBox");
            });

            await waitFor(() => {
                return check("radio1", "AXRole: AXRadioButton");
            });

            await waitFor(() => {
                return check("submit1", "AXRole: AXButton");
            });

            await waitFor(() => {
                return check("combobox1", comboBoxRole);
            });

            await waitFor(() => {
                return check("focusable1", "AXRole: AXGroup");
            });

            await waitFor(() => {
                return check("aria-button1", "AXRole: AXButton");
            });

            await waitFor(() => {
                return check("aria-link1", "AXRole: AXLink");
            });

            // Check unrendered controls inside a canvas.
            await waitFor(() => {
                return check("link2", "AXRole: AXLink");
            });

            await waitFor(() => {
                return check("button2", "AXRole: AXButton");
            });

            await waitFor(() => {
                return check("text2", "AXRole: AXTextField");
            });

            await waitFor(() => {
                return check("checkbox2", "AXRole: AXCheckBox");
            });

            await waitFor(() => {
                return check("radio2", "AXRole: AXRadioButton");
            });

            await waitFor(() => {
                return check("submit2", "AXRole: AXButton");
            });

            await waitFor(() => {
                return check("combobox2", comboBoxRole);
            });

            await waitFor(() => {
                return check("focusable2", "AXRole: AXGroup");
            });

            await waitFor(() => {
                return check("aria-button2", "AXRole: AXButton");
            });

            await waitFor(() => {
                return check("aria-link2", "AXRole: AXLink");
            });

            // Check that the role is updated when the element changes.
            document.getElementById('focusable1').setAttribute('role', 'button');
            await waitFor(() => {
                return check("focusable1", "AXRole: AXButton");
            });

            document.getElementById('focusable2').setAttribute('role', 'button');
            await waitFor(() => {
                return check("focusable2", "AXRole: AXButton");
            });

            finishJSTest();
        }, 0);
    }
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>
