| <!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" role="group"> |
| |
| <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> |
| |
| <script> |
| description("This tests that a sub-tree within a node marked with aria-hidden=false will be exposed in the AX tree."); |
| |
| function testiFrameContent() { |
| setTimeout(async () => { |
| // Test that aria-hidden=false does NOT expose iframe fallback text. |
| let 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."); |
| let iframeChild = null; |
| await waitFor(() => { |
| return iframeChild = iframe.childAtIndex(0); |
| }); |
| debug("iFrame child role: " + iframeChild.role); |
| |
| document.getElementById("content").style.visibility = "hidden"; |
| finishJSTest(); |
| }, 0); |
| } |
| |
| function dumpAccessibilityChildren(element, level) { |
| if (!element) { |
| return; |
| } |
| var indent = ""; |
| for (var k = 0; k < level; k++) { indent += " "; } |
| debug(indent + element.role + "\n" + indent + platformValueForW3CName(element, true) + "\n"); |
| var childrenCount = element.childrenCount; |
| for (var k = 0; k < childrenCount; k++) { |
| dumpAccessibilityChildren(element.childAtIndex(k), level+1); |
| } |
| } |
| |
| if (window.accessibilityController) { |
| window.jsTestIsAsync = true; |
| |
| setTimeout(async () => { |
| let root = accessibilityController.accessibleElementById("content").childAtIndex(0); |
| dumpAccessibilityChildren(root, 0); |
| |
| // Text inside aria-hidden=false inherits from parent. |
| window.object = null; |
| if (accessibilityController.platformName == "atspi") { |
| object = accessibilityController.accessibleElementById("group3"); |
| shouldBe("object.role", "'AXRole: AXSection'"); |
| } else { |
| object = accessibilityController.accessibleElementById("group3").childAtIndex(0); |
| shouldBe("object.role", "'AXRole: AXStaticText'"); |
| } |
| window.stringValue = object.stringValue.replace(/\n/g, ''); |
| shouldBe("stringValue", "'AXValue: text3'"); |
| |
| // Text inside nested aria-hidden=false inherits from parent. |
| if (accessibilityController.platformName == "atspi") { |
| object = accessibilityController.accessibleElementById("group4").childAtIndex(0); |
| shouldBe("object.role", "'AXRole: AXGroup'"); |
| } else { |
| object = accessibilityController.accessibleElementById("group4").childAtIndex(0).childAtIndex(0); |
| shouldBe("object.role", "'AXRole: AXStaticText'"); |
| } |
| stringValue = object.stringValue.replace(/\n/g, ''); |
| if (accessibilityController.platformName == "atspi") |
| shouldBe("stringValue", "'AXValue: text4'"); |
| else |
| 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); |
| if (accessibilityController.platformName == "atspi") |
| shouldBe("object.role", "'AXRole: AXSection'"); |
| else |
| 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); |
| if (accessibilityController.platformName == "atspi") |
| shouldBe("object.role", "'AXRole: AXSection'"); |
| else |
| shouldBe("object.role", "'AXRole: AXGroup'"); |
| shouldBe("object.childrenCount", "1"); |
| shouldBe("object.childAtIndex(0).role", "'AXRole: AXButton'"); |
| }, 0); |
| } |
| </script> |
| </body> |
| </html> |