<!DOCTYPE HTML>
<html>
<body>
<script src="../resources/js-test.js"></script>

<div id="myContainer" tabindex="-1">
  <a href="#">Link</a>
  <button>Button</button>
  <input type="text">
  <input type="checkbox">
  <input type="radio">
  <input type="submit">
  <select><option>1<option>2</select>
  <span tabindex="0" role="button">ARIA button</span>
  <span tabindex="0" role="link">ARIA link</span>
</div>

<canvas id="myCanvas" width="300" height="300" tabindex="-1">
  <a href="#">Link</a>
  <button>Button</button>
  <input type="text">
  <input type="checkbox">
  <input type="radio">
  <input type="submit">
  <select><option>1<option>2</select>
  <span tabindex="0" role="button">ARIA button</span>
  <span tabindex="0" role="link">ARIA link</span>
</canvas>

<div id="console"></div>
<script>
description("This test makes sure that AccessibilityNodeObjects are created for elements in a canvas subtree.");

if (window.testRunner && window.accessibilityController) {
    testRunner.dumpAsText();

    function appendFocusableDescendants(axObject, axFocusableList) {
        for (var i = 0; i < axObject.childrenCount; i++) {
            var axChild = axObject.childAtIndex(i);
            if (axChild.isFocusable)
                axFocusableList.push(axChild);
            appendFocusableDescendants(axChild, axFocusableList);
        }
    }

    var container = document.getElementById("myContainer");
    container.focus();
    var axContainer = accessibilityController.focusedElement;

    var canvas = document.getElementById("myCanvas");
    canvas.focus();
    var axCanvas = accessibilityController.focusedElement;

    var axLayoutObjects = [];
    var axNodeObjects = [];

    appendFocusableDescendants(axContainer, axLayoutObjects);
    appendFocusableDescendants(axCanvas, axNodeObjects);

    shouldBe("axLayoutObjects.length", "axNodeObjects.length");

    for (var i = 0; i < axLayoutObjects.length; i++) {
        var axLayoutObject = axLayoutObjects[i];
        var axNodeObject = axNodeObjects[i];
        shouldBe("i == " + i + "; axLayoutObject.role == axNodeObject.role", "true");
    }
}

</script>

</body>
</html>
