Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
aria-checked doesn't work for role="treeitem" elements with display:c…
…ontents

https://bugs.webkit.org/show_bug.cgi?id=257444
rdar://problem/109955788

Reviewed by Chris Fleizach.

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:

Canonical link: https://commits.webkit.org/264761@main
  • Loading branch information
twilco committed May 31, 2023
1 parent 9add686 commit 2860da7
Show file tree
Hide file tree
Showing 42 changed files with 530 additions and 328 deletions.

This file was deleted.

This file was deleted.

76 changes: 0 additions & 76 deletions LayoutTests/accessibility/display-contents-search-traversal.html

This file was deleted.

71 changes: 71 additions & 0 deletions 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>

@@ -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>

Expand Down
@@ -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>

Expand Down
@@ -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>


0 comments on commit 2860da7

Please sign in to comment.