WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-257444-20230528182353.patch (text/plain), 64.68 KB, created by
Tyler Wilcock
on 2023-05-28 18:23:53 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Tyler Wilcock
Created:
2023-05-28 18:23:53 PDT
Size:
64.68 KB
patch
obsolete
>From 5834eb9ee2b554837d24a1df772972a6df985d50 Mon Sep 17 00:00:00 2001 >From: Tyler Wilcock <tyler_w@apple.com> >Date: Sun, 28 May 2023 18:16:44 -0700 >Subject: [PATCH] aria-checked doesn't work for role="treeitem" elements with > display:contents https://bugs.webkit.org/show_bug.cgi?id=257444 > rdar://problem/109955788 > >Reviewed by NOBODY (OOPS!). > >After this patch, we properly create role="tree" and role="treeitem" >elements as AccessibilityTree and AccessibilityTreeItem rather than a >generic AccessibilityNodeObject, fixing aria-checked and other >functionality in these subclasses. > >Testcase accessibility/display-contents/tree-and-treeitems.html added. > >The other major change in this patch is the creation of a new >accessibility/display-contents subfolder as requested in a review comment >for a previous patch. All display:contents related tests are moved into >this folder. > >* LayoutTests/accessibility/aria-hidden-display-contents-element.html: Removed. >* LayoutTests/accessibility/display-contents-dynamically-added-children.html: Removed. >* LayoutTests/accessibility/display-contents-search-traversal.html: Removed. >* LayoutTests/accessibility/display-contents/aria-hidden-expected.txt: Renamed from LayoutTests/accessibility/aria-hidden-display-contents-element-expected.txt. >* LayoutTests/accessibility/display-contents/aria-hidden.html: Added. >* LayoutTests/accessibility/display-contents/aria-owns-expected.txt: Renamed from LayoutTests/accessibility/display-contents-aria-owns-expected.txt. >* LayoutTests/accessibility/display-contents/aria-owns.html: Renamed from LayoutTests/accessibility/display-contents-aria-owns.html. >* LayoutTests/accessibility/display-contents/descendant-menu-item-expected.txt: Renamed from LayoutTests/accessibility/display-contents-descendant-menu-item-expected.txt. >* LayoutTests/accessibility/display-contents/descendant-menu-item.html: Renamed from LayoutTests/accessibility/display-contents-descendant-menu-item.html. >* LayoutTests/accessibility/display-contents/dynamically-added-children-expected.txt: Renamed from LayoutTests/accessibility/display-contents-dynamically-added-children-expected.txt. >* LayoutTests/accessibility/display-contents/dynamically-added-children.html: Added. >* LayoutTests/accessibility/display-contents/element-roles-expected.txt: Renamed from LayoutTests/accessibility/display-contents-element-roles-expected.txt. >* LayoutTests/accessibility/display-contents/element-roles.html: Renamed from LayoutTests/accessibility/display-contents-element-roles.html. >* LayoutTests/accessibility/display-contents/list-expected.txt: Renamed from LayoutTests/accessibility/display-contents-list-expected.txt. >* LayoutTests/accessibility/display-contents/list.html: Renamed from LayoutTests/accessibility/display-contents-list.html. >* LayoutTests/accessibility/display-contents/object-ordering-expected.txt: Renamed from LayoutTests/accessibility/display-contents-object-ordering-expected.txt. >* LayoutTests/accessibility/display-contents/object-ordering.html: Renamed from LayoutTests/accessibility/display-contents-object-ordering.html. >* LayoutTests/accessibility/display-contents/search-traversal-expected.txt: Renamed from LayoutTests/accessibility/display-contents-search-traversal-expected.txt. >* LayoutTests/accessibility/display-contents/search-traversal.html: Added. >* LayoutTests/accessibility/display-contents/text-under-element-expected.txt: Renamed from LayoutTests/accessibility/text-under-display-contents-element-expected.txt. >* LayoutTests/accessibility/display-contents/text-under-element.html: Added. >* LayoutTests/accessibility/display-contents/tree-and-treeitems-expected.txt: Added. >* LayoutTests/accessibility/display-contents/tree-and-treeitems.html: Added. >* LayoutTests/accessibility/text-under-display-contents-element.html: Removed. >* LayoutTests/platform/glib/TestExpectations: >* LayoutTests/platform/glib/accessibility/display-contents/aria-hidden-expected.txt: Renamed from LayoutTests/platform/glib/accessibility/aria-hidden-display-contents-element-expected.txt. >* LayoutTests/platform/glib/accessibility/display-contents/aria-owns-expected.txt: Renamed from LayoutTests/platform/glib/accessibility/display-contents-aria-owns-expected.txt. >* LayoutTests/platform/glib/accessibility/display-contents/element-roles-expected.txt: Renamed from LayoutTests/platform/glib/accessibility/display-contents-element-roles-expected.txt. >* LayoutTests/platform/ios/TestExpectations: >* LayoutTests/platform/ios/accessibility/display-contents/aria-hidden-expected.txt: Renamed from LayoutTests/platform/ios/accessibility/aria-hidden-display-contents-element-expected.txt. >* LayoutTests/platform/ios/accessibility/display-contents/dynamically-added-children-expected.txt: Renamed from LayoutTests/platform/ios/accessibility/display-contents-dynamically-added-children-expected.txt. >* LayoutTests/platform/ios/accessibility/display-contents/element-roles-expected.txt: Renamed from LayoutTests/platform/ios/accessibility/display-contents-element-roles-expected.txt. >* LayoutTests/platform/ios/accessibility/display-contents/object-ordering-expected.txt: Renamed from LayoutTests/platform/ios/accessibility/display-contents-object-ordering-expected.txt. >* LayoutTests/platform/ios/accessibility/display-contents/search-traversal-expected.txt: Renamed from LayoutTests/platform/ios/accessibility/display-contents-search-traversal-expected.txt. >* LayoutTests/platform/ios/accessibility/display-contents/text-under-element-expected.txt: Renamed from LayoutTests/platform/ios/accessibility/text-under-display-contents-element-expected.txt. >* LayoutTests/platform/mac-wk1/TestExpectations: >* Source/WebCore/accessibility/AXObjectCache.cpp: >(WebCore::isAccessibilityTree): >(WebCore::isAccessibilityTreeItem): >(WebCore::AXObjectCache::createObjectFromRenderer): >(WebCore::createFromNode): >* Source/WebCore/accessibility/AccessibilityRenderObject.cpp: >(WebCore::AccessibilityRenderObject::determineAccessibilityRole): >* Source/WebCore/accessibility/AccessibilityTree.cpp: >(WebCore::AccessibilityTree::AccessibilityTree): >(WebCore::AccessibilityTree::create): >* Source/WebCore/accessibility/AccessibilityTree.h: >* Source/WebCore/accessibility/AccessibilityTreeItem.cpp: >(WebCore::AccessibilityTreeItem::AccessibilityTreeItem): >(WebCore::AccessibilityTreeItem::create): >(WebCore::AccessibilityTreeItem::determineAccessibilityRole): >* Source/WebCore/accessibility/AccessibilityTreeItem.h: >--- > .../WebCore/accessibility/AXObjectCache.cpp | 18 ++- > .../AccessibilityRenderObject.cpp | 2 +- > .../accessibility/AccessibilityTree.cpp | 14 ++- > .../WebCore/accessibility/AccessibilityTree.h | 2 + > .../accessibility/AccessibilityTreeItem.cpp | 13 +- > .../accessibility/AccessibilityTreeItem.h | 2 + > .../aria-hidden-display-contents-element.html | 71 ----------- > ...y-contents-dynamically-added-children.html | 59 --------- > .../display-contents-search-traversal.html | 76 ----------- > .../aria-hidden-expected.txt} | 0 > .../display-contents/aria-hidden.html | 71 +++++++++++ > .../aria-owns-expected.txt} | 0 > .../aria-owns.html} | 4 +- > .../descendant-menu-item-expected.txt} | 0 > .../descendant-menu-item.html} | 4 +- > .../dynamically-added-children-expected.txt} | 0 > .../dynamically-added-children.html | 59 +++++++++ > .../element-roles-expected.txt} | 0 > .../element-roles.html} | 62 ++++----- > .../list-expected.txt} | 0 > .../list.html} | 4 +- > .../object-ordering-expected.txt} | 0 > .../object-ordering.html} | 54 ++++---- > .../search-traversal-expected.txt} | 0 > .../display-contents/search-traversal.html | 76 +++++++++++ > .../text-under-element-expected.txt} | 0 > .../display-contents/text-under-element.html | 39 ++++++ > .../tree-and-treeitems-expected.txt | 44 +++++++ > .../display-contents/tree-and-treeitems.html | 119 ++++++++++++++++++ > .../text-under-display-contents-element.html | 39 ------ > LayoutTests/platform/glib/TestExpectations | 6 +- > .../aria-hidden-expected.txt} | 0 > .../aria-owns-expected.txt} | 0 > .../element-roles-expected.txt} | 0 > LayoutTests/platform/ios/TestExpectations | 12 +- > .../aria-hidden-expected.txt} | 0 > .../dynamically-added-children-expected.txt} | 0 > .../element-roles-expected.txt} | 0 > .../object-ordering-expected.txt} | 0 > .../search-traversal-expected.txt} | 0 > .../text-under-element-expected.txt} | 0 > LayoutTests/platform/mac-wk1/TestExpectations | 6 +- > 42 files changed, 528 insertions(+), 328 deletions(-) > delete mode 100644 LayoutTests/accessibility/aria-hidden-display-contents-element.html > delete mode 100644 LayoutTests/accessibility/display-contents-dynamically-added-children.html > delete mode 100644 LayoutTests/accessibility/display-contents-search-traversal.html > rename LayoutTests/accessibility/{aria-hidden-display-contents-element-expected.txt => display-contents/aria-hidden-expected.txt} (100%) > create mode 100644 LayoutTests/accessibility/display-contents/aria-hidden.html > rename LayoutTests/accessibility/{display-contents-aria-owns-expected.txt => display-contents/aria-owns-expected.txt} (100%) > rename LayoutTests/accessibility/{display-contents-aria-owns.html => display-contents/aria-owns.html} (89%) > rename LayoutTests/accessibility/{display-contents-descendant-menu-item-expected.txt => display-contents/descendant-menu-item-expected.txt} (100%) > rename LayoutTests/accessibility/{display-contents-descendant-menu-item.html => display-contents/descendant-menu-item.html} (86%) > rename LayoutTests/accessibility/{display-contents-dynamically-added-children-expected.txt => display-contents/dynamically-added-children-expected.txt} (100%) > create mode 100644 LayoutTests/accessibility/display-contents/dynamically-added-children.html > rename LayoutTests/accessibility/{display-contents-element-roles-expected.txt => display-contents/element-roles-expected.txt} (100%) > rename LayoutTests/accessibility/{display-contents-element-roles.html => display-contents/element-roles.html} (66%) > rename LayoutTests/accessibility/{display-contents-list-expected.txt => display-contents/list-expected.txt} (100%) > rename LayoutTests/accessibility/{display-contents-list.html => display-contents/list.html} (92%) > rename LayoutTests/accessibility/{display-contents-object-ordering-expected.txt => display-contents/object-ordering-expected.txt} (100%) > rename LayoutTests/accessibility/{display-contents-object-ordering.html => display-contents/object-ordering.html} (66%) > rename LayoutTests/accessibility/{display-contents-search-traversal-expected.txt => display-contents/search-traversal-expected.txt} (100%) > create mode 100644 LayoutTests/accessibility/display-contents/search-traversal.html > rename LayoutTests/accessibility/{text-under-display-contents-element-expected.txt => display-contents/text-under-element-expected.txt} (100%) > create mode 100644 LayoutTests/accessibility/display-contents/text-under-element.html > create mode 100644 LayoutTests/accessibility/display-contents/tree-and-treeitems-expected.txt > create mode 100644 LayoutTests/accessibility/display-contents/tree-and-treeitems.html > delete mode 100644 LayoutTests/accessibility/text-under-display-contents-element.html > rename LayoutTests/platform/glib/accessibility/{aria-hidden-display-contents-element-expected.txt => display-contents/aria-hidden-expected.txt} (100%) > rename LayoutTests/platform/glib/accessibility/{display-contents-aria-owns-expected.txt => display-contents/aria-owns-expected.txt} (100%) > rename LayoutTests/platform/glib/accessibility/{display-contents-element-roles-expected.txt => display-contents/element-roles-expected.txt} (100%) > rename LayoutTests/platform/ios/accessibility/{aria-hidden-display-contents-element-expected.txt => display-contents/aria-hidden-expected.txt} (100%) > rename LayoutTests/platform/ios/accessibility/{display-contents-dynamically-added-children-expected.txt => display-contents/dynamically-added-children-expected.txt} (100%) > rename LayoutTests/platform/ios/accessibility/{display-contents-element-roles-expected.txt => display-contents/element-roles-expected.txt} (100%) > rename LayoutTests/platform/ios/accessibility/{display-contents-object-ordering-expected.txt => display-contents/object-ordering-expected.txt} (100%) > rename LayoutTests/platform/ios/accessibility/{display-contents-search-traversal-expected.txt => display-contents/search-traversal-expected.txt} (100%) > rename LayoutTests/platform/ios/accessibility/{text-under-display-contents-element-expected.txt => display-contents/text-under-element-expected.txt} (100%) > >diff --git a/Source/WebCore/accessibility/AXObjectCache.cpp b/Source/WebCore/accessibility/AXObjectCache.cpp >index 58f55631e906..25914daff66c 100644 >--- a/Source/WebCore/accessibility/AXObjectCache.cpp >+++ b/Source/WebCore/accessibility/AXObjectCache.cpp >@@ -605,6 +605,16 @@ static bool isAccessibilityList(Node* node) > || (nodeHasRole(node, nullAtom()) && (node->hasTagName(ulTag) || node->hasTagName(olTag) || node->hasTagName(dlTag) || node->hasTagName(menuTag))))); > } > >+static bool isAccessibilityTree(Node* node) >+{ >+ return nodeHasRole(node, "tree"_s); >+} >+ >+static bool isAccessibilityTreeItem(Node* node) >+{ >+ return nodeHasRole(node, "treeitem"_s); >+} >+ > Ref<AccessibilityObject> AXObjectCache::createObjectFromRenderer(RenderObject* renderer) > { > // FIXME: How could renderer->node() ever not be an Element? >@@ -622,9 +632,9 @@ Ref<AccessibilityObject> AXObjectCache::createObjectFromRenderer(RenderObject* r > return AccessibilityARIAGridCell::create(renderer); > > // aria tree >- if (nodeHasRole(node, "tree"_s)) >+ if (isAccessibilityTree(node)) > return AccessibilityTree::create(renderer); >- if (nodeHasRole(node, "treeitem"_s)) >+ if (isAccessibilityTreeItem(node)) > return AccessibilityTreeItem::create(renderer); > > if (node && is<HTMLLabelElement>(node) && nodeHasRole(node, nullAtom())) >@@ -689,6 +699,10 @@ static Ref<AccessibilityObject> createFromNode(Node& node) > { > if (isAccessibilityList(&node)) > return AccessibilityList::create(node); >+ if (isAccessibilityTree(&node)) >+ return AccessibilityTree::create(node); >+ if (isAccessibilityTreeItem(&node)) >+ return AccessibilityTreeItem::create(node); > return AccessibilityNodeObject::create(node); > } > >diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >index 0852207405f1..bca19057ec60 100644 >--- a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >+++ b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp >@@ -2181,7 +2181,7 @@ bool AccessibilityRenderObject::shouldIgnoreAttributeRole() const > AccessibilityRole AccessibilityRenderObject::determineAccessibilityRole() > { > if (!m_renderer) >- return AccessibilityRole::Unknown; >+ return AccessibilityNodeObject::determineAccessibilityRole(); > > #if ENABLE(APPLE_PAY) > if (isApplePayButton()) >diff --git a/Source/WebCore/accessibility/AccessibilityTree.cpp b/Source/WebCore/accessibility/AccessibilityTree.cpp >index fa189da050f4..3d3a2eb621ea 100644 >--- a/Source/WebCore/accessibility/AccessibilityTree.cpp >+++ b/Source/WebCore/accessibility/AccessibilityTree.cpp >@@ -44,14 +44,24 @@ AccessibilityTree::AccessibilityTree(RenderObject* renderer) > : AccessibilityRenderObject(renderer) > { > } >- >+ >+AccessibilityTree::AccessibilityTree(Node& node) >+ : AccessibilityRenderObject(node) >+{ >+} >+ > AccessibilityTree::~AccessibilityTree() = default; > > Ref<AccessibilityTree> AccessibilityTree::create(RenderObject* renderer) > { > return adoptRef(*new AccessibilityTree(renderer)); > } >- >+ >+Ref<AccessibilityTree> AccessibilityTree::create(Node& node) >+{ >+ return adoptRef(*new AccessibilityTree(node)); >+} >+ > bool AccessibilityTree::computeAccessibilityIsIgnored() const > { > return accessibilityIsIgnoredByDefault(); >diff --git a/Source/WebCore/accessibility/AccessibilityTree.h b/Source/WebCore/accessibility/AccessibilityTree.h >index 80ee3ad1dbc9..f64307648a4f 100644 >--- a/Source/WebCore/accessibility/AccessibilityTree.h >+++ b/Source/WebCore/accessibility/AccessibilityTree.h >@@ -36,10 +36,12 @@ namespace WebCore { > class AccessibilityTree final : public AccessibilityRenderObject { > public: > static Ref<AccessibilityTree> create(RenderObject*); >+ static Ref<AccessibilityTree> create(Node&); > virtual ~AccessibilityTree(); > > private: > explicit AccessibilityTree(RenderObject*); >+ explicit AccessibilityTree(Node&); > bool computeAccessibilityIsIgnored() const override; > AccessibilityRole determineAccessibilityRole() override; > bool isTreeValid() const; >diff --git a/Source/WebCore/accessibility/AccessibilityTreeItem.cpp b/Source/WebCore/accessibility/AccessibilityTreeItem.cpp >index f9ebc5af6536..d196ccab17b7 100644 >--- a/Source/WebCore/accessibility/AccessibilityTreeItem.cpp >+++ b/Source/WebCore/accessibility/AccessibilityTreeItem.cpp >@@ -40,7 +40,12 @@ AccessibilityTreeItem::AccessibilityTreeItem(RenderObject* renderer) > : AccessibilityRenderObject(renderer) > { > } >- >+ >+AccessibilityTreeItem::AccessibilityTreeItem(Node& node) >+ : AccessibilityRenderObject(node) >+{ >+} >+ > AccessibilityTreeItem::~AccessibilityTreeItem() = default; > > Ref<AccessibilityTreeItem> AccessibilityTreeItem::create(RenderObject* renderer) >@@ -48,6 +53,11 @@ Ref<AccessibilityTreeItem> AccessibilityTreeItem::create(RenderObject* renderer) > return adoptRef(*new AccessibilityTreeItem(renderer)); > } > >+Ref<AccessibilityTreeItem> AccessibilityTreeItem::create(Node& node) >+{ >+ return adoptRef(*new AccessibilityTreeItem(node)); >+} >+ > bool AccessibilityTreeItem::supportsCheckedState() const > { > return hasAttribute(aria_checkedAttr); >@@ -55,7 +65,6 @@ bool AccessibilityTreeItem::supportsCheckedState() const > > AccessibilityRole AccessibilityTreeItem::determineAccessibilityRole() > { >- > // Walk the parent chain looking for a parent that is a tree. A treeitem is > // only considered valid if it is in a tree. > AccessibilityObject* parent = nullptr; >diff --git a/Source/WebCore/accessibility/AccessibilityTreeItem.h b/Source/WebCore/accessibility/AccessibilityTreeItem.h >index c484fefd5129..084e2f1cf6cf 100644 >--- a/Source/WebCore/accessibility/AccessibilityTreeItem.h >+++ b/Source/WebCore/accessibility/AccessibilityTreeItem.h >@@ -35,12 +35,14 @@ namespace WebCore { > class AccessibilityTreeItem final : public AccessibilityRenderObject { > public: > static Ref<AccessibilityTreeItem> create(RenderObject*); >+ static Ref<AccessibilityTreeItem> create(Node&); > virtual ~AccessibilityTreeItem(); > > bool supportsCheckedState() const override; > > private: > explicit AccessibilityTreeItem(RenderObject*); >+ explicit AccessibilityTreeItem(Node&); > bool shouldIgnoreAttributeRole() const final { return !m_isTreeItemValid; } > AccessibilityRole determineAccessibilityRole() override; > bool m_isTreeItemValid; >diff --git a/LayoutTests/accessibility/aria-hidden-display-contents-element.html b/LayoutTests/accessibility/aria-hidden-display-contents-element.html >deleted file mode 100644 >index b5a5e706bfba..000000000000 >--- a/LayoutTests/accessibility/aria-hidden-display-contents-element.html >+++ /dev/null >@@ -1,71 +0,0 @@ >-<!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 id="body"> >- >-<main id="main" style="display: contents"> >- <ol id="list"> >- <li>List item one</li> >- <li>List item two</li> >- </ol> >- <p id="paragraph">Content inside main > p tag.<p> >-</main> >- >-<script> >- var testOutput = "This test ensures that an aria-hidden display:contents element behaves as expected."; >- >- function debugElement(id) { >- testOutput += `\n\nTesting element #${id}\n`; >- const axElement = accessibilityController.accessibleElementById(id); >- if (!axElement) { >- debug(`\nFAIL: Couldn't get AX element for #${id}.`); >- return; >- } >- >- testOutput += axElement.role; >- const computedRoleString = axElement.computedRoleString; >- if (computedRoleString) >- testOutput += `\ncomputedRoleString: ${computedRoleString}`; >- >- let subrole = axElement.subrole; >- if (subrole.replace("AXSubrole: ", "")) >- testOutput += `\n${subrole}`; >- } >- >- if (window.accessibilityController) { >- window.jsTestIsAsync = true; >- >- debugElement("main"); >- debugElement("list"); >- debugElement("paragraph"); >- >- testOutput += "\n\nHiding #main with aria-hidden='true'."; >- document.getElementById("main").ariaHidden = "true"; >- setTimeout(async function() { >- await waitFor(() => { >- // Wait for the main to be hidden. >- return !accessibilityController.accessibleElementById("main"); >- }); >- const list = accessibilityController.accessibleElementById("list"); >- const paragraph = accessibilityController.accessibleElementById("paragraph"); >- if (!list && !paragraph) >- testOutput += "\nPASS: All elements are now hidden."; >- else { >- if (list) >- testOutput += "\nFAIL: <ol> was not hidden by aria-hidden."; >- if (paragraph) >- testOutput += "\nFAIL: <p> was not hidden by aria-hidden."; >- } >- >- document.getElementById("main").style.visibility = "hidden"; >- debug(testOutput); >- finishJSTest(); >- }, 0); >- } >-</script> >-</body> >-</html> >- >diff --git a/LayoutTests/accessibility/display-contents-dynamically-added-children.html b/LayoutTests/accessibility/display-contents-dynamically-added-children.html >deleted file mode 100644 >index f703bdb53937..000000000000 >--- a/LayoutTests/accessibility/display-contents-dynamically-added-children.html >+++ /dev/null >@@ -1,59 +0,0 @@ >-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >-<html> >-<head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >-</head> >-<body> >- >-<div id="display-contents-div" aria-label="Div with display:contents" style="display:contents"> >- <div id="div-to-insert-into"> >- </div> >-</div> >- >-<script> >- var testOutput = "This test ensures that we include dynamically added content in the AX tree when said content is added as a subtree of a display:contents element.\n\n"; >- >- var axRoot = accessibilityController.rootElement; >- function traversePage() { >- let searchResult = null; >- while (true) { >- searchResult = axRoot.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false); >- if (!searchResult) >- break; >- const role = searchResult.role; >- testOutput += `\n${role}`; >- if (role.includes("StaticText")) { >- let textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue; >- testOutput += `\n${textContent}`; >- } >- testOutput += "\n"; >- } >- } >- >- if (window.accessibilityController) { >- window.jsTestIsAsync = true; >- >- testOutput += "Traversing page based on initial state.\n"; >- traversePage(); >- >- testOutput += "\nAdding list elements to #div-to-insert-into and performing another page traversal.\n"; >- >- const ul = document.createElement("ul"); >- const li = document.createElement("li"); >- li.innerHTML = "List item one"; >- ul.appendChild(li); >- document.getElementById("div-to-insert-into").appendChild(ul); >- setTimeout(async function() { >- await waitFor(() => axRoot.uiElementForSearchPredicate(axRoot, true, "AXListSearchKey", "", false)); >- traversePage(); >- >- debug(testOutput); >- finishJSTest(); >- }, 0); >- } >-</script> >-</body> >-</html> >- >- >diff --git a/LayoutTests/accessibility/display-contents-search-traversal.html b/LayoutTests/accessibility/display-contents-search-traversal.html >deleted file mode 100644 >index 2d7d1eaf417c..000000000000 >--- a/LayoutTests/accessibility/display-contents-search-traversal.html >+++ /dev/null >@@ -1,76 +0,0 @@ >-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >-<html> >-<head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >-</head> >-<body> >- >-<div id="container" role="group"> >- <p>Content before main.</p> >- >- <main> >- >- <h1>No style changes</h1> >- <div role="toolbar"> >- <div> >- <button>Foo</button> >- </div> >- </div> >- >- <h1>display: contents; on the toolbar</h1> >- <div role="toolbar" style="display: contents;"> >- <div> >- <button>Foo</button> >- </div> >- </div> >- >- <h1>display: contents; on the generic div</h1> >- <div role="toolbar"> >- <div style="display: contents;"> >- <button>Foo</button> >- </div> >- </div> >- >- <h1>display: contents; on the button</h1> >- <div role="toolbar"> >- <div> >- <button style="display: contents;">Foo</button> >- </div> >- </div> >- >- </main> >- >- <p>Content after main.</p> >-</div> >- >-<script> >- var testOutput = "This test ensures we can traverse through basic webpages with multiple display: contents elements via search.\n"; >- >- if (window.accessibilityController) { >- const containerElement = accessibilityController.accessibleElementById("container"); >- >- let elementCount = 0; >- let searchResult = null; >- while (true) { >- searchResult = containerElement.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false); >- if (!searchResult) >- break; >- const role = searchResult.role; >- testOutput += `\n${role}`; >- if (role.includes("StaticText")) { >- let textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue; >- testOutput += `\n${textContent}`; >- } >- >- testOutput += "\n"; >- elementCount += 1; >- } >- testOutput += `\nTraversed ${elementCount} elements.`; >- document.getElementById("container").style.visibility = "hidden"; >- debug(testOutput); >- } >-</script> >-</body> >-</html> >- >diff --git a/LayoutTests/accessibility/aria-hidden-display-contents-element-expected.txt b/LayoutTests/accessibility/display-contents/aria-hidden-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/aria-hidden-display-contents-element-expected.txt >rename to LayoutTests/accessibility/display-contents/aria-hidden-expected.txt >diff --git a/LayoutTests/accessibility/display-contents/aria-hidden.html b/LayoutTests/accessibility/display-contents/aria-hidden.html >new file mode 100644 >index 000000000000..7724fe797def >--- /dev/null >+++ b/LayoutTests/accessibility/display-contents/aria-hidden.html >@@ -0,0 +1,71 @@ >+<!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 id="body"> >+ >+<main id="main" style="display: contents"> >+ <ol id="list"> >+ <li>List item one</li> >+ <li>List item two</li> >+ </ol> >+ <p id="paragraph">Content inside main > p tag.<p> >+</main> >+ >+<script> >+var testOutput = "This test ensures that an aria-hidden display:contents element behaves as expected."; >+ >+function debugElement(id) { >+ testOutput += `\n\nTesting element #${id}\n`; >+ const axElement = accessibilityController.accessibleElementById(id); >+ if (!axElement) { >+ debug(`\nFAIL: Couldn't get AX element for #${id}.`); >+ return; >+ } >+ >+ testOutput += axElement.role; >+ const computedRoleString = axElement.computedRoleString; >+ if (computedRoleString) >+ testOutput += `\ncomputedRoleString: ${computedRoleString}`; >+ >+ let subrole = axElement.subrole; >+ if (subrole.replace("AXSubrole: ", "")) >+ testOutput += `\n${subrole}`; >+} >+ >+if (window.accessibilityController) { >+ window.jsTestIsAsync = true; >+ >+ debugElement("main"); >+ debugElement("list"); >+ debugElement("paragraph"); >+ >+ testOutput += "\n\nHiding #main with aria-hidden='true'."; >+ document.getElementById("main").ariaHidden = "true"; >+ setTimeout(async function() { >+ await waitFor(() => { >+ // Wait for the main to be hidden. >+ return !accessibilityController.accessibleElementById("main"); >+ }); >+ const list = accessibilityController.accessibleElementById("list"); >+ const paragraph = accessibilityController.accessibleElementById("paragraph"); >+ if (!list && !paragraph) >+ testOutput += "\nPASS: All elements are now hidden."; >+ else { >+ if (list) >+ testOutput += "\nFAIL: <ol> was not hidden by aria-hidden."; >+ if (paragraph) >+ testOutput += "\nFAIL: <p> was not hidden by aria-hidden."; >+ } >+ >+ document.getElementById("main").style.visibility = "hidden"; >+ debug(testOutput); >+ finishJSTest(); >+ }, 0); >+} >+</script> >+</body> >+</html> >+ >diff --git a/LayoutTests/accessibility/display-contents-aria-owns-expected.txt b/LayoutTests/accessibility/display-contents/aria-owns-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-aria-owns-expected.txt >rename to LayoutTests/accessibility/display-contents/aria-owns-expected.txt >diff --git a/LayoutTests/accessibility/display-contents-aria-owns.html b/LayoutTests/accessibility/display-contents/aria-owns.html >similarity index 89% >rename from LayoutTests/accessibility/display-contents-aria-owns.html >rename to LayoutTests/accessibility/display-contents/aria-owns.html >index c66cffaffa7a..9a17eb2e5f62 100644 >--- a/LayoutTests/accessibility/display-contents-aria-owns.html >+++ b/LayoutTests/accessibility/display-contents/aria-owns.html >@@ -1,8 +1,8 @@ > <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> > <html> > <head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> > </head> > <body> > >diff --git a/LayoutTests/accessibility/display-contents-descendant-menu-item-expected.txt b/LayoutTests/accessibility/display-contents/descendant-menu-item-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-descendant-menu-item-expected.txt >rename to LayoutTests/accessibility/display-contents/descendant-menu-item-expected.txt >diff --git a/LayoutTests/accessibility/display-contents-descendant-menu-item.html b/LayoutTests/accessibility/display-contents/descendant-menu-item.html >similarity index 86% >rename from LayoutTests/accessibility/display-contents-descendant-menu-item.html >rename to LayoutTests/accessibility/display-contents/descendant-menu-item.html >index 0c2b39cb7209..dd0d31f82601 100644 >--- a/LayoutTests/accessibility/display-contents-descendant-menu-item.html >+++ b/LayoutTests/accessibility/display-contents/descendant-menu-item.html >@@ -1,8 +1,8 @@ > <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> > <html> > <head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> > </head> > <body> > >diff --git a/LayoutTests/accessibility/display-contents-dynamically-added-children-expected.txt b/LayoutTests/accessibility/display-contents/dynamically-added-children-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-dynamically-added-children-expected.txt >rename to LayoutTests/accessibility/display-contents/dynamically-added-children-expected.txt >diff --git a/LayoutTests/accessibility/display-contents/dynamically-added-children.html b/LayoutTests/accessibility/display-contents/dynamically-added-children.html >new file mode 100644 >index 000000000000..8af8f806e214 >--- /dev/null >+++ b/LayoutTests/accessibility/display-contents/dynamically-added-children.html >@@ -0,0 +1,59 @@ >+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >+<html> >+<head> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> >+</head> >+<body> >+ >+<div id="display-contents-div" aria-label="Div with display:contents" style="display:contents"> >+ <div id="div-to-insert-into"> >+ </div> >+</div> >+ >+<script> >+var testOutput = "This test ensures that we include dynamically added content in the AX tree when said content is added as a subtree of a display:contents element.\n\n"; >+ >+var axRoot = accessibilityController.rootElement; >+function traversePage() { >+ let searchResult = null; >+ while (true) { >+ searchResult = axRoot.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false); >+ if (!searchResult) >+ break; >+ const role = searchResult.role; >+ testOutput += `\n${role}`; >+ if (role.includes("StaticText")) { >+ let textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue; >+ testOutput += `\n${textContent}`; >+ } >+ testOutput += "\n"; >+ } >+} >+ >+if (window.accessibilityController) { >+ window.jsTestIsAsync = true; >+ >+ testOutput += "Traversing page based on initial state.\n"; >+ traversePage(); >+ >+ testOutput += "\nAdding list elements to #div-to-insert-into and performing another page traversal.\n"; >+ >+ const ul = document.createElement("ul"); >+ const li = document.createElement("li"); >+ li.innerHTML = "List item one"; >+ ul.appendChild(li); >+ document.getElementById("div-to-insert-into").appendChild(ul); >+ setTimeout(async function() { >+ await waitFor(() => axRoot.uiElementForSearchPredicate(axRoot, true, "AXListSearchKey", "", false)); >+ traversePage(); >+ >+ debug(testOutput); >+ finishJSTest(); >+ }, 0); >+} >+</script> >+</body> >+</html> >+ >+ >diff --git a/LayoutTests/accessibility/display-contents-element-roles-expected.txt b/LayoutTests/accessibility/display-contents/element-roles-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-element-roles-expected.txt >rename to LayoutTests/accessibility/display-contents/element-roles-expected.txt >diff --git a/LayoutTests/accessibility/display-contents-element-roles.html b/LayoutTests/accessibility/display-contents/element-roles.html >similarity index 66% >rename from LayoutTests/accessibility/display-contents-element-roles.html >rename to LayoutTests/accessibility/display-contents/element-roles.html >index b9840ee7daeb..2bb95c24aded 100644 >--- a/LayoutTests/accessibility/display-contents-element-roles.html >+++ b/LayoutTests/accessibility/display-contents/element-roles.html >@@ -1,8 +1,8 @@ > <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> > <html> > <head> >-<script src="../resources/js-test.js"></script> >-<script src="../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> >+<script src="../../resources/accessibility-helper.js"></script> > <style> > .testcase { display: contents }; > </style> >@@ -98,37 +98,37 @@ > </div> > > <script> >- // Buffer test output and dump it at the end to make the test run faster vs. individual `debug` calls. >- var testOutput = "This test ensures elements with CSS display: contents have the correct role.\n\n"; >- >- var axElement; >- function verifyRoles() { >- const testcases = document.getElementsByClassName("testcase"); >- for (const domElement of testcases) { >- const outerHTML = escapeHTML(domElement.cloneNode().outerHTML); >- axElement = accessibilityController.accessibleElementById(domElement.id); >- if (!axElement) { >- testOutput += `FAIL. Couldn't get AX element for #${domElement.id}: ${outerHTML}\n`; >- return; >- } >- testOutput += `${outerHTML}\n`; >- testOutput += ` ${axElement.role}`; >- >- let computedRoleString = axElement.computedRoleString; >- if (computedRoleString) >- testOutput += `\n computedRoleString: ${computedRoleString}`; >- >- let subrole = axElement.subrole; >- if (subrole.replace("AXSubrole: ", "")) >- testOutput += `\n ${subrole}`; >- testOutput += `\n\n`; >+// Buffer test output and dump it at the end to make the test run faster vs. individual `debug` calls. >+var testOutput = "This test ensures elements with CSS display: contents have the correct role.\n\n"; >+ >+var axElement; >+function verifyRoles() { >+ const testcases = document.getElementsByClassName("testcase"); >+ for (const domElement of testcases) { >+ const outerHTML = escapeHTML(domElement.cloneNode().outerHTML); >+ axElement = accessibilityController.accessibleElementById(domElement.id); >+ if (!axElement) { >+ testOutput += `FAIL. Couldn't get AX element for #${domElement.id}: ${outerHTML}\n`; >+ return; > } >- } >+ testOutput += `${outerHTML}\n`; >+ testOutput += ` ${axElement.role}`; >+ >+ let computedRoleString = axElement.computedRoleString; >+ if (computedRoleString) >+ testOutput += `\n computedRoleString: ${computedRoleString}`; > >- if (window.accessibilityController) { >- verifyRoles(); >- document.getElementById("content").style.visibility = "hidden"; >- debug(testOutput); >+ let subrole = axElement.subrole; >+ if (subrole.replace("AXSubrole: ", "")) >+ testOutput += `\n ${subrole}`; >+ testOutput += `\n\n`; > } >+} >+ >+if (window.accessibilityController) { >+ verifyRoles(); >+ document.getElementById("content").style.visibility = "hidden"; >+ debug(testOutput); >+} > </script> > </body> >diff --git a/LayoutTests/accessibility/display-contents-list-expected.txt b/LayoutTests/accessibility/display-contents/list-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-list-expected.txt >rename to LayoutTests/accessibility/display-contents/list-expected.txt >diff --git a/LayoutTests/accessibility/display-contents-list.html b/LayoutTests/accessibility/display-contents/list.html >similarity index 92% >rename from LayoutTests/accessibility/display-contents-list.html >rename to LayoutTests/accessibility/display-contents/list.html >index 50b4b20f8c1a..24cddd771f9a 100644 >--- a/LayoutTests/accessibility/display-contents-list.html >+++ b/LayoutTests/accessibility/display-contents/list.html >@@ -1,8 +1,8 @@ > <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> > <html> > <head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> > </head> > <body> > >diff --git a/LayoutTests/accessibility/display-contents-object-ordering-expected.txt b/LayoutTests/accessibility/display-contents/object-ordering-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-object-ordering-expected.txt >rename to LayoutTests/accessibility/display-contents/object-ordering-expected.txt >diff --git a/LayoutTests/accessibility/display-contents-object-ordering.html b/LayoutTests/accessibility/display-contents/object-ordering.html >similarity index 66% >rename from LayoutTests/accessibility/display-contents-object-ordering.html >rename to LayoutTests/accessibility/display-contents/object-ordering.html >index 3b7c7da049f1..e4fe9b99eb5b 100644 >--- a/LayoutTests/accessibility/display-contents-object-ordering.html >+++ b/LayoutTests/accessibility/display-contents/object-ordering.html >@@ -1,8 +1,8 @@ > <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> > <html> > <head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> > </head> > <body> > >@@ -46,36 +46,36 @@ > </div> > > <script> >- var testOutput = "This test ensures that display:contents elements are inserted in the correct place in the AX tree.\n\n"; >+var testOutput = "This test ensures that display:contents elements are inserted in the correct place in the AX tree.\n\n"; > >- function traverse(containerId) { >- testOutput += `\nPerforming search traversal of #${containerId}.\n`; >- const container = accessibilityController.accessibleElementById(containerId); >- let searchResult = null; >- while (true) { >- searchResult = container.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false); >- if (!searchResult) >- break; >- const role = searchResult.role; >- const id = searchResult.domIdentifier; >- testOutput += `\n${id ? `#${id} ` : ""}${role}`; >- if (role.includes("StaticText")) { >- let textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue; >- testOutput += `\n${textContent}`; >- } >- testOutput += "\n"; >+function traverse(containerId) { >+ testOutput += `\nPerforming search traversal of #${containerId}.\n`; >+ const container = accessibilityController.accessibleElementById(containerId); >+ let searchResult = null; >+ while (true) { >+ searchResult = container.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false); >+ if (!searchResult) >+ break; >+ const role = searchResult.role; >+ const id = searchResult.domIdentifier; >+ testOutput += `\n${id ? `#${id} ` : ""}${role}`; >+ if (role.includes("StaticText")) { >+ let textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue; >+ testOutput += `\n${textContent}`; > } >+ testOutput += "\n"; > } >+} > >- if (window.accessibilityController) { >- traverse("button-container"); >- traverse("heading-container"); >- traverse("mixed-element-container"); >+if (window.accessibilityController) { >+ traverse("button-container"); >+ traverse("heading-container"); >+ traverse("mixed-element-container"); > >- for (const containerId of ["button-container", "heading-container", "mixed-element-container"]) >- document.getElementById(containerId).style.visibility = "hidden"; >- debug(testOutput); >- } >+ for (const containerId of ["button-container", "heading-container", "mixed-element-container"]) >+ document.getElementById(containerId).style.visibility = "hidden"; >+ debug(testOutput); >+} > </script> > </body> > </html> >diff --git a/LayoutTests/accessibility/display-contents-search-traversal-expected.txt b/LayoutTests/accessibility/display-contents/search-traversal-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/display-contents-search-traversal-expected.txt >rename to LayoutTests/accessibility/display-contents/search-traversal-expected.txt >diff --git a/LayoutTests/accessibility/display-contents/search-traversal.html b/LayoutTests/accessibility/display-contents/search-traversal.html >new file mode 100644 >index 000000000000..883f5e6e0b10 >--- /dev/null >+++ b/LayoutTests/accessibility/display-contents/search-traversal.html >@@ -0,0 +1,76 @@ >+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >+<html> >+<head> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> >+</head> >+<body> >+ >+<div id="container" role="group"> >+ <p>Content before main.</p> >+ >+ <main> >+ >+ <h1>No style changes</h1> >+ <div role="toolbar"> >+ <div> >+ <button>Foo</button> >+ </div> >+ </div> >+ >+ <h1>display: contents; on the toolbar</h1> >+ <div role="toolbar" style="display: contents;"> >+ <div> >+ <button>Foo</button> >+ </div> >+ </div> >+ >+ <h1>display: contents; on the generic div</h1> >+ <div role="toolbar"> >+ <div style="display: contents;"> >+ <button>Foo</button> >+ </div> >+ </div> >+ >+ <h1>display: contents; on the button</h1> >+ <div role="toolbar"> >+ <div> >+ <button style="display: contents;">Foo</button> >+ </div> >+ </div> >+ >+ </main> >+ >+ <p>Content after main.</p> >+</div> >+ >+<script> >+var testOutput = "This test ensures we can traverse through basic webpages with multiple display: contents elements via search.\n"; >+ >+if (window.accessibilityController) { >+ const containerElement = accessibilityController.accessibleElementById("container"); >+ >+ let elementCount = 0; >+ let searchResult = null; >+ while (true) { >+ searchResult = containerElement.uiElementForSearchPredicate(searchResult, true, "AXAnyTypeSearchKey", "", false); >+ if (!searchResult) >+ break; >+ const role = searchResult.role; >+ testOutput += `\n${role}`; >+ if (role.includes("StaticText")) { >+ let textContent = accessibilityController.platformName === "ios" ? searchResult.description : searchResult.stringValue; >+ testOutput += `\n${textContent}`; >+ } >+ >+ testOutput += "\n"; >+ elementCount += 1; >+ } >+ testOutput += `\nTraversed ${elementCount} elements.`; >+ document.getElementById("container").style.visibility = "hidden"; >+ debug(testOutput); >+} >+</script> >+</body> >+</html> >+ >diff --git a/LayoutTests/accessibility/text-under-display-contents-element-expected.txt b/LayoutTests/accessibility/display-contents/text-under-element-expected.txt >similarity index 100% >rename from LayoutTests/accessibility/text-under-display-contents-element-expected.txt >rename to LayoutTests/accessibility/display-contents/text-under-element-expected.txt >diff --git a/LayoutTests/accessibility/display-contents/text-under-element.html b/LayoutTests/accessibility/display-contents/text-under-element.html >new file mode 100644 >index 000000000000..f80a127fb0ba >--- /dev/null >+++ b/LayoutTests/accessibility/display-contents/text-under-element.html >@@ -0,0 +1,39 @@ >+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >+<html> >+<head> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> >+</head> >+<body> >+ >+<button id="button" style="display:contents">Click me</button> >+ >+<script> >+var testOutput = "This test ensures that we can get the text under a display:contents element in accessibility requests.\n\n"; >+ >+function textUnderElement(axElement) { >+ if (accessibilityController.platformName === "ios") >+ return axElement.description; >+ return axElement.title; >+} >+ >+if (window.accessibilityController) { >+ window.jsTestIsAsync = true; >+ >+ const axButton = accessibilityController.accessibleElementById("button"); >+ testOutput += `${textUnderElement(axButton)}\n`; >+ >+ document.getElementById("button").innerHTML = ""; >+ testOutput += "\nClearing innerHTML of #button.\n\n"; >+ setTimeout(async function() { >+ await waitFor(() => !textUnderElement(axButton).includes("Click me")); >+ testOutput += `${textUnderElement(axButton)}\n`; >+ >+ debug(testOutput); >+ finishJSTest(); >+ }, 0); >+} >+</script> >+</body> >+</html> >+ >diff --git a/LayoutTests/accessibility/display-contents/tree-and-treeitems-expected.txt b/LayoutTests/accessibility/display-contents/tree-and-treeitems-expected.txt >new file mode 100644 >index 000000000000..3363f545899d >--- /dev/null >+++ b/LayoutTests/accessibility/display-contents/tree-and-treeitems-expected.txt >@@ -0,0 +1,44 @@ >+This tests that aria trees and tree items are converted into AXOutlines and AXRows, with all the right attributes. >+ >+PASS: tree.role === 'AXRole: AXOutline' >+PASS: canSetRows === true >+PASS: tree.childrenCount === 8 >+PASS: treeitem1.role === 'AXRole: AXRow' >+PASS: treeitem1.subrole === 'AXSubrole: AXOutlineRow' >+PASS: treeitem1.isExpanded === true >+PASS: treeitem1.hierarchicalLevel === 0 >+PASS: treeitem1.isAttributeSupported('AXValue') === true >+PASS: canSetDisclosing === true >+PASS: treeitem2.role === 'AXRole: AXRow' >+PASS: treeitem2.subrole === 'AXSubrole: AXOutlineRow' >+PASS: treeitem2.isExpanded === false >+PASS: treeitem2.hierarchicalLevel === 1 >+PASS: treeitem2.disclosedByRow().isEqual(treeitem1) === true >+PASS: canSetDisclosing === false >+PASS: treeitem3.stringValue === 'AXValue: Birds' >+PASS: canSetDisclosing === false >+PASS: treeitem3.role === 'AXRole: AXRow' >+PASS: treeitem3.subrole === 'AXSubrole: AXOutlineRow' >+PASS: treeitem3.isExpanded === true >+PASS: treeitem3.isSelected === false >+PASS: treeitem3.isSelected === true >+PASS: selectedRow.isEqual(treeitem3) === true >+PASS: treeitem4.hierarchicalLevel === 0 >+PASS: treeitem5.hierarchicalLevel === 1 >+PASS: treeitem6.hierarchicalLevel === 1 >+ >+Updating aria-level of #treeitem2 to 3. >+PASS: treeitem2.hierarchicalLevel === 2 >+ >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+Animals >+Birds >+ Cats >+Siamese >+ Tabby >+Vegetables >+Carrots >+ Broccoli >+ >diff --git a/LayoutTests/accessibility/display-contents/tree-and-treeitems.html b/LayoutTests/accessibility/display-contents/tree-and-treeitems.html >new file mode 100644 >index 000000000000..2192e89c0e5c >--- /dev/null >+++ b/LayoutTests/accessibility/display-contents/tree-and-treeitems.html >@@ -0,0 +1,119 @@ >+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >+<html> >+<head> >+<script src="../../resources/accessibility-helper.js"></script> >+<script src="../../resources/js-test.js"></script> >+</head> >+<body> >+ >+<ul id="tree" role="tree" style="display:contents" aria-labelledby="treelabel" aria-activedescendant="tree0_item0_2_0_1" tabindex="0"> >+ <li id="treeitem1" style="display:contents" role="treeitem" aria-level="1" aria-expanded="true" aria-checked="true"> >+ <span> >+ <span class="expander"></span> >+ Animals >+ </span> >+ <ul role="group"> >+ <div id="treeitem2" style="display:contents" role="treeitem" aria-level="2"><span>Birds</span></div> >+ <li id="treeitem3" style="display:contents" role="treeitem" aria-level="2" aria-expanded="true"> >+ <span> >+ <span class="expander"></span> >+ Cats >+ </span> >+ <ul role="group"> >+ <li id="tree0_item0_1_0" role="treeitem" style="display:contents" aria-level="3"><span>Siamese</span></li> >+ <li id="tree0_item0_1_1" role="treeitem" style="display:contents" aria-level="3"><span>Tabby</span></li> >+ </ul> >+ </li> >+ </ul> >+ </span> >+ </li> >+ >+ <li id="treeitem4" role="treeitem" style="display:contents" aria-expanded="true"> >+ <span> >+ <span class="expander"></span> >+ Vegetables >+ </span> >+ <ul role="group"> >+ <div id="treeitem5" style="display:contents" role="treeitem"><span>Carrots</span></div> >+ <div id="treeitem6" style="display:contents" role="treeitem"><span>Broccoli</span></div> >+ </ul> >+ </span> >+ </li> >+</ul> >+ >+<script> >+var output = "This tests that aria trees and tree items are converted into AXOutlines and AXRows, with all the right attributes.\n\n"; >+ >+if (window.accessibilityController) { >+ window.jsTestIsAsync = true; >+ >+ // Test tree attributes. >+ var tree = accessibilityController.accessibleElementById("tree"); >+ output += expect("tree.role", "'AXRole: AXOutline'"); >+ var canSetRows = tree.isAttributeSettable('AXSelectedRows'); >+ output += expect("canSetRows", "true"); >+ output += expect("tree.childrenCount", "8"); >+ >+ // Test tree item attributes. >+ var treeitem1 = tree.childAtIndex(0); >+ output += expect("treeitem1.role", "'AXRole: AXRow'"); >+ output += expect("treeitem1.subrole", "'AXSubrole: AXOutlineRow'"); >+ output += expect("treeitem1.isExpanded", "true"); >+ output += expect("treeitem1.hierarchicalLevel", "0"); >+ output += expect("treeitem1.isAttributeSupported('AXValue')", "true"); >+ var canSetDisclosing = treeitem1.isAttributeSettable('AXDisclosing'); >+ output += expect("canSetDisclosing", "true"); >+ >+ var treeitem2 = treeitem1.disclosedRowAtIndex(0); >+ output += expect("treeitem2.role", "'AXRole: AXRow'"); >+ output += expect("treeitem2.subrole", "'AXSubrole: AXOutlineRow'"); >+ output += expect("treeitem2.isExpanded", "false"); >+ output += expect("treeitem2.hierarchicalLevel", "1"); >+ output += expect("treeitem2.disclosedByRow().isEqual(treeitem1)", "true"); >+ canSetDisclosing = treeitem2.isAttributeSettable('AXDisclosing'); >+ output += expect("canSetDisclosing", "false"); >+ >+ var treeitem3 = treeitem2.childAtIndex(0); >+ output += expect("treeitem3.stringValue", "'AXValue: Birds'"); >+ canSetDisclosing = treeitem3.isAttributeSettable('AXDisclosing'); >+ output += expect("canSetDisclosing", "false"); >+ >+ // Test more AXRow attributes and values as we dive further in. >+ treeitem3 = treeitem1.disclosedRowAtIndex(1); >+ output += expect("treeitem3.role", "'AXRole: AXRow'"); >+ output += expect("treeitem3.subrole", "'AXSubrole: AXOutlineRow'"); >+ output += expect("treeitem3.isExpanded", "true"); >+ >+ // Test that the row can be selected correctly. >+ output += expect("treeitem3.isSelected", "false"); >+ document.getElementById("treeitem3").setAttribute("aria-selected", true); >+ output += expect("treeitem3.isSelected", "true"); >+ >+ // Test that the tree reports the right selected row (treeitem3) >+ var selectedRow = tree.selectedRowAtIndex(0); >+ output += expect("selectedRow.isEqual(treeitem3)", "true"); >+ >+ // Test that hierarchicalLevel can be computed automatically, and that it's consistent with the ARIA level. >+ var treeitem4 = accessibilityController.accessibleElementById("treeitem4"); >+ output += expect("treeitem4.hierarchicalLevel", "0"); >+ >+ var treeitem5 = accessibilityController.accessibleElementById("treeitem5"); >+ output += expect("treeitem5.hierarchicalLevel", "1"); >+ >+ var treeitem6 = accessibilityController.accessibleElementById("treeitem6"); >+ output += expect("treeitem6.hierarchicalLevel", "1"); >+ >+ output += "\nUpdating aria-level of #treeitem2 to 3.\n"; >+ document.getElementById("treeitem2").setAttribute("aria-level", "3"); >+ setTimeout(async function() { >+ await waitFor(() => treeitem2.hierarchicalLevel === 2); >+ output += expect("treeitem2.hierarchicalLevel", "2"); >+ >+ debug(output); >+ finishJSTest(); >+ }, 0); >+} >+</script> >+</body> >+</html> >+ >diff --git a/LayoutTests/accessibility/text-under-display-contents-element.html b/LayoutTests/accessibility/text-under-display-contents-element.html >deleted file mode 100644 >index d5b30df25029..000000000000 >--- a/LayoutTests/accessibility/text-under-display-contents-element.html >+++ /dev/null >@@ -1,39 +0,0 @@ >-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> >-<html> >-<head> >-<script src="../resources/accessibility-helper.js"></script> >-<script src="../resources/js-test.js"></script> >-</head> >-<body> >- >-<button id="button" style="display:contents">Click me</button> >- >-<script> >- var testOutput = "This test ensures that we can get the text under a display:contents element in accessibility requests.\n\n"; >- >- function textUnderElement(axElement) { >- if (accessibilityController.platformName === "ios") >- return axElement.description; >- return axElement.title; >- } >- >- if (window.accessibilityController) { >- window.jsTestIsAsync = true; >- >- const axButton = accessibilityController.accessibleElementById("button"); >- testOutput += `${textUnderElement(axButton)}\n`; >- >- document.getElementById("button").innerHTML = ""; >- testOutput += "\nClearing innerHTML of #button.\n\n"; >- setTimeout(async function() { >- await waitFor(() => !textUnderElement(axButton).includes("Click me")); >- testOutput += `${textUnderElement(axButton)}\n`; >- >- debug(testOutput); >- finishJSTest(); >- }, 0); >- } >-</script> >-</body> >-</html> >- >diff --git a/LayoutTests/platform/glib/TestExpectations b/LayoutTests/platform/glib/TestExpectations >index 3fb26fe80465..b72a28a657ac 100644 >--- a/LayoutTests/platform/glib/TestExpectations >+++ b/LayoutTests/platform/glib/TestExpectations >@@ -497,9 +497,9 @@ accessibility/basic-focusability.html [ Skip ] > # Missing AccessibilityUIElement::uiElementForSearchPredicate implementation. > accessibility/aria-modal-with-text-crash.html [ Skip ] > accessibility/button-inside-label-ax-text.html [ Skip ] >-accessibility/display-contents-dynamically-added-children.html [ Skip ] >-accessibility/display-contents-object-ordering.html [ Skip ] >-accessibility/display-contents-search-traversal.html [ Skip ] >+accessibility/display-contents/dynamically-added-children.html [ Skip ] >+accessibility/display-contents/object-ordering.html [ Skip ] >+accessibility/display-contents/search-traversal.html [ Skip ] > accessibility/empty-text-under-element-cached.html [ Skip ] > accessibility/search-traversal-after-role-change.html [ Skip ] > accessibility/table-search-traversal.html [ Skip ] >diff --git a/LayoutTests/platform/glib/accessibility/aria-hidden-display-contents-element-expected.txt b/LayoutTests/platform/glib/accessibility/display-contents/aria-hidden-expected.txt >similarity index 100% >rename from LayoutTests/platform/glib/accessibility/aria-hidden-display-contents-element-expected.txt >rename to LayoutTests/platform/glib/accessibility/display-contents/aria-hidden-expected.txt >diff --git a/LayoutTests/platform/glib/accessibility/display-contents-aria-owns-expected.txt b/LayoutTests/platform/glib/accessibility/display-contents/aria-owns-expected.txt >similarity index 100% >rename from LayoutTests/platform/glib/accessibility/display-contents-aria-owns-expected.txt >rename to LayoutTests/platform/glib/accessibility/display-contents/aria-owns-expected.txt >diff --git a/LayoutTests/platform/glib/accessibility/display-contents-element-roles-expected.txt b/LayoutTests/platform/glib/accessibility/display-contents/element-roles-expected.txt >similarity index 100% >rename from LayoutTests/platform/glib/accessibility/display-contents-element-roles-expected.txt >rename to LayoutTests/platform/glib/accessibility/display-contents/element-roles-expected.txt >diff --git a/LayoutTests/platform/ios/TestExpectations b/LayoutTests/platform/ios/TestExpectations >index 8f9107332498..30249ba15057 100644 >--- a/LayoutTests/platform/ios/TestExpectations >+++ b/LayoutTests/platform/ios/TestExpectations >@@ -2166,7 +2166,7 @@ accessibility/table-exposure-updates-dynamically.html [ Pass ] > accessibility/accessibility-node-reparent.html [ Pass ] > accessibility/aria-checked-mixed-value.html [ Pass ] > accessibility/aria-describedby-on-input.html [ Pass ] >-accessibility/aria-hidden-display-contents-element.html [ Pass ] >+accessibility/display-contents/aria-hidden.html [ Pass ] > accessibility/aria-multiline.html [ Pass ] > accessibility/aria-readonly-updates-after-dynamic-change.html [ Pass ] > accessibility/aria-required-updates-after-dynamic-change.html [ Pass ] >@@ -2178,9 +2178,9 @@ accessibility/button-inside-label-ax-text.html [ Pass ] > accessibility/changing-aria-hidden-with-display-none-parent.html [ Pass ] > accessibility/checkbox-mixed-value.html [ Pass ] > accessibility/dialog-slotted-content.html [ Pass ] >-accessibility/display-contents-dynamically-added-children.html [ Pass ] >-accessibility/display-contents-element-roles.html [ Pass ] >-accessibility/display-contents-object-ordering.html [ Pass ] >+accessibility/display-contents/dynamically-added-children.html [ Pass ] >+accessibility/display-contents/element-roles.html [ Pass ] >+accessibility/display-contents/object-ordering.html [ Pass ] > accessibility/dynamically-ignored-canvas.html [ Pass ] > accessibility/element-haspopup.html [ Pass ] > accessibility/empty-text-under-element-cached.html [ Pass ] >@@ -2200,7 +2200,7 @@ accessibility/placeholder.html [ Pass ] > accessibility/progress-indeterminate-value.html [ Pass ] > accessibility/slider-with-lost-renderer.html [ Pass ] > accessibility/spinbutton-increment-decrement.html [ Pass ] >-accessibility/text-under-display-contents-element.html [ Pass ] >+accessibility/display-contents/text-under-element.html [ Pass ] > accessibility/text-updates-after-dynamic-change.html [ Pass ] > accessibility/url-test.html [ Pass ] > accessibility/video-element-url-attribute.html [ Pass ] >@@ -2220,7 +2220,7 @@ webkit.org/b/150366 accessibility/aria-table-attributes.html [ Pass ] > > accessibility/aria-modal-with-text-crash.html [ Pass ] > accessibility/aria-labelledby-targeting-slot.html [ Pass ] >-accessibility/display-contents-search-traversal.html [ Pass ] >+accessibility/display-contents/search-traversal.html [ Pass ] > accessibility/search-traversal-after-role-change.html [ Pass ] > accessibility/table-search-traversal.html [ Pass ] > accessibility/dynamically-changing-iframe-remains-accessible.html [ Pass ] >diff --git a/LayoutTests/platform/ios/accessibility/aria-hidden-display-contents-element-expected.txt b/LayoutTests/platform/ios/accessibility/display-contents/aria-hidden-expected.txt >similarity index 100% >rename from LayoutTests/platform/ios/accessibility/aria-hidden-display-contents-element-expected.txt >rename to LayoutTests/platform/ios/accessibility/display-contents/aria-hidden-expected.txt >diff --git a/LayoutTests/platform/ios/accessibility/display-contents-dynamically-added-children-expected.txt b/LayoutTests/platform/ios/accessibility/display-contents/dynamically-added-children-expected.txt >similarity index 100% >rename from LayoutTests/platform/ios/accessibility/display-contents-dynamically-added-children-expected.txt >rename to LayoutTests/platform/ios/accessibility/display-contents/dynamically-added-children-expected.txt >diff --git a/LayoutTests/platform/ios/accessibility/display-contents-element-roles-expected.txt b/LayoutTests/platform/ios/accessibility/display-contents/element-roles-expected.txt >similarity index 100% >rename from LayoutTests/platform/ios/accessibility/display-contents-element-roles-expected.txt >rename to LayoutTests/platform/ios/accessibility/display-contents/element-roles-expected.txt >diff --git a/LayoutTests/platform/ios/accessibility/display-contents-object-ordering-expected.txt b/LayoutTests/platform/ios/accessibility/display-contents/object-ordering-expected.txt >similarity index 100% >rename from LayoutTests/platform/ios/accessibility/display-contents-object-ordering-expected.txt >rename to LayoutTests/platform/ios/accessibility/display-contents/object-ordering-expected.txt >diff --git a/LayoutTests/platform/ios/accessibility/display-contents-search-traversal-expected.txt b/LayoutTests/platform/ios/accessibility/display-contents/search-traversal-expected.txt >similarity index 100% >rename from LayoutTests/platform/ios/accessibility/display-contents-search-traversal-expected.txt >rename to LayoutTests/platform/ios/accessibility/display-contents/search-traversal-expected.txt >diff --git a/LayoutTests/platform/ios/accessibility/text-under-display-contents-element-expected.txt b/LayoutTests/platform/ios/accessibility/display-contents/text-under-element-expected.txt >similarity index 100% >rename from LayoutTests/platform/ios/accessibility/text-under-display-contents-element-expected.txt >rename to LayoutTests/platform/ios/accessibility/display-contents/text-under-element-expected.txt >diff --git a/LayoutTests/platform/mac-wk1/TestExpectations b/LayoutTests/platform/mac-wk1/TestExpectations >index 9377f3b2f965..daae9d626a67 100644 >--- a/LayoutTests/platform/mac-wk1/TestExpectations >+++ b/LayoutTests/platform/mac-wk1/TestExpectations >@@ -812,8 +812,8 @@ accessibility/progress-indeterminate-value.html [ Skip ] > # role="spinbutton" elements (month, day, year). WK1 renders date inputs using a contenteditable div. > accessibility/mac/date-input-increment-decrement.html [ Skip ] > >-accessibility/display-contents-dynamically-added-children.html [ Skip ] >-accessibility/display-contents-aria-owns.html [ Skip ] >+accessibility/display-contents/dynamically-added-children.html [ Skip ] >+accessibility/display-contents/aria-owns.html [ Skip ] > > accessibility/mac/lazy-spellchecking.html [ Skip ] > >@@ -1935,7 +1935,7 @@ accessibility/element-reflection-ariaerrormessage.html [ Skip ] > accessibility/mac/pseudo-element-text-markers.html [ Skip ] > accessibility/nested-textareas-value-changed-notifications.html [ Skip ] > accessibility/selected-state-changed-notifications.html [ Skip ] >-accessibility/display-contents-descendant-menu-item.html [ Skip ] >+accessibility/display-contents/descendant-menu-item.html [ Skip ] > accessibility/element-line-rects-and-text.html [ Skip ] > accessibility/mac/line-index-for-textmarker.html [ Skip ] > accessibility/mac/mathml-elements.html [ Skip ]
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 257444
:
466527
|
466528