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

<div id="content">

<div hidden aria-hidden="false" aria-label="group0">
   <div aria-hidden="true" aria-label="group1">
      ignore me
   </div>
   <div aria-hidden="false" role="group" aria-label="group2">
     <div aria-hidden="false" role="button" aria-label="button1">button</div>
     don't ignore me
  </div>
</div>

<!-- The text node should be visible because it inherits from the parent -->
<div id="group3" hidden aria-hidden="false">
text3
</div>

<!-- The text node should be visible because it inherits from the parent, and all parents need aria-hidden=false -->
<div id="group4" hidden aria-hidden="false">
  <div role="group" hidden aria-hidden="false">
    text4
  </div>
</div>

<!-- The text node should NOT be visible because it inherits from the parent, and all parents need aria-hidden=false -->
<div id="group5" role="group">
  <div hidden>
    <div role="group" hidden aria-hidden="false">
      text5
    </div>
  </div>
</div>

<!-- The button inside should NOT be visible because it is not marked as aria-hidden -->
<div id="group6" hidden aria-hidden="false">
  <div aria-hidden="false">
     <button>button</button>
  </div>
</div>

<!-- The button inside should be visible because it is marked as aria-hidden and all its parents are too -->
<div id="group7" hidden aria-hidden="false">
  <div aria-hidden="false">
     <button aria-hidden="false">button</button>
  </div>
</div>

<div id="iframe">
<iframe onload="testiFrameContent();" aria-hidden="false" src="resources/cake.png">hidden content</iframe>
</div>

</div>

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

<script>
    description("This tests that a sub-tree within a node marked with aria-hidden=false will be exposed in the AX tree.");

    var iframeChild;
    function testiFrameContent() {
        // Test that aria-hidden=false does NOT expose iframe fallback text.
        var iframe = accessibilityController.accessibleElementById("iframe").childAtIndex(0).childAtIndex(0);

        debug("Non-rendered iframe content should not be visible when aria-hidden=true. The first child should be a group and NOT static text.");
        iframeChild = iframe.childAtIndex(0);
        debug("iFrame child role: " + iframeChild.role);

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

        finishJSTest();
    }

    function dumpAccessibilityChildren(element, level) {
        if (!element) {
            return;
        }
        var indent = "";
        for (var k = 0; k < level; k++) { indent += "  "; }
        debug(indent + element.role + "\n" + indent + element.description + "\n");
        var childrenCount = element.childrenCount;
        for (var k = 0; k < childrenCount; k++) {
            dumpAccessibilityChildren(element.childAtIndex(k), level+1);
        }
    }
 
    if (window.accessibilityController) {
        window.jsTestIsAsync = true;

        var root = accessibilityController.rootElement.childAtIndex(0).childAtIndex(0); 
        dumpAccessibilityChildren(root, 0);

        // Text inside aria-hidden=false inherits from parent.
        var object = accessibilityController.accessibleElementById("group3").childAtIndex(0);
        shouldBe("object.role", "'AXRole: AXStaticText'");
        var stringValue = object.stringValue.replace(/\n/g, '');
        shouldBe("stringValue", "'AXValue: text3'");

        // Text inside nested aria-hidden=false inherits from parent.
        object = accessibilityController.accessibleElementById("group4").childAtIndex(0).childAtIndex(0);
        shouldBe("object.role", "'AXRole: AXStaticText'");
        stringValue = object.stringValue.replace(/\n/g, '');
        shouldBe("stringValue", "'AXValue:     text4  '");

        // When not all the parents have aria-hidden=false, element should not be visible.
        object = accessibilityController.accessibleElementById("group5").childAtIndex(0);
        shouldBeTrue("!object || !object.isValid");

        // Objects that don't have aria-hidden=false are not visible when the parents have that attribute.
        object = accessibilityController.accessibleElementById("group6").childAtIndex(0);
        shouldBe("object.role", "'AXRole: AXGroup'");
        shouldBe("object.childrenCount", "0");

        // When all objects have aria-hidden=false, then the elements are visible.
        object = accessibilityController.accessibleElementById("group7").childAtIndex(0);
        shouldBe("object.role", "'AXRole: AXGroup'");
        shouldBe("object.childrenCount", "1");
        shouldBe("object.childAtIndex(0).role", "'AXRole: AXButton'");
    }

</script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
