| <!DOCTYPE HTML> |
| <html> |
| <head> |
| <script src="../../resources/accessibility-helper.js"></script> |
| <script src="../../resources/js-test.js"></script> |
| </head> |
| <body> |
| |
| <div id="host" role="group"> |
| <button id="before">Before</button> |
| <iframe id="iframe" role="presentation" src="../resources/presentational-iframe-content.html"></iframe> |
| <button id="after">After</button> |
| </div> |
| |
| <script> |
| var output = "This test ensures the content of a presentational (accessibility-ignored) iframe is hoisted in the accessibility tree, with childrenCount and indexOfChild consistent with the hoisted children, and can reach the root via ancestry walk.\n\n"; |
| |
| var host, root, button; |
| function ancestryReaches(element, target) { |
| for (var ancestor = element; ancestor; ancestor = ancestor.parentElement()) { |
| if (ancestor.isEqual(target)) |
| return true; |
| } |
| return false; |
| } |
| |
| window.jsTestIsAsync = true; |
| |
| async function runTest() { |
| if (!window.accessibilityController) |
| return; |
| |
| // The iframe has more than one top-level child, so its content must be hoisted as multiple children of |
| // the host -- this is what distinguishes the cross-frame-aware count and index paths from the raw stitched |
| // children (where the iframe counts as a single placeholder). |
| button = await waitForElementById("frame-button-1"); |
| await waitFor(() => { |
| if (!button) |
| return false; |
| host = accessibilityController.accessibleElementById("host"); |
| return host && host.childrenCount === 4 && host.childAtIndex(1).isEqual(button); |
| }); |
| |
| root = accessibilityController.rootElement; |
| |
| output += expect("host.childrenCount", "4"); |
| output += expect("host.childAtIndex(0).domIdentifier", "'before'"); |
| output += expect("host.childAtIndex(1).domIdentifier", "'frame-button-1'"); |
| output += expect("host.childAtIndex(1).role", "'AXRole: AXButton'"); |
| output += expect("host.childAtIndex(2).domIdentifier", "'frame-button-2'"); |
| output += expect("host.childAtIndex(3).domIdentifier", "'after'"); |
| |
| // The count, children list, and index lookups must all agree on the hoisted list, otherwise |
| // NSAccessibility drops trailing children or misindexes them. |
| output += expect("host.indexOfChild(host.childAtIndex(1))", "1"); |
| output += expect("host.indexOfChild(host.childAtIndex(2))", "2"); |
| output += expect("host.indexOfChild(host.childAtIndex(3))", "3"); |
| |
| output += expect("(button && host ? ancestryReaches(button, host) : false)", "true"); |
| output += expect("(button && root ? ancestryReaches(button, root) : false)", "true"); |
| |
| debug(output); |
| finishJSTest(); |
| } |
| |
| window.addEventListener("load", runTest); |
| </script> |
| </body> |
| </html> |