Diff
Modified: trunk/LayoutTests/accessibility/aria-orientation-expected.txt (295491 => 295492)
--- trunk/LayoutTests/accessibility/aria-orientation-expected.txt 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/LayoutTests/accessibility/aria-orientation-expected.txt 2022-06-13 17:16:47 UTC (rev 295492)
@@ -1,42 +1,28 @@
-Implicit defaults
+This test ensures that aria-orientation works correctly and the implicit defaults are defined on different roles.
-Option
-Menu item 1
-menubar
-radio 1
-item one
-tree item
-cell
-cell2
+PASS: slider.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: combobox.orientation === 'AXOrientation: AXUnknownOrientation'
+PASS: listbox.orientation === 'AXOrientation: AXVerticalOrientation'
+PASS: menu.orientation === 'AXOrientation: AXVerticalOrientation'
+PASS: menubar.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: radiogroup.orientation === 'AXOrientation: AXUnknownOrientation'
+PASS: separator.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: tablist.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: toolbar.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: tree.orientation === 'AXOrientation: AXVerticalOrientation'
+PASS: treegrid.orientation === 'AXOrientation: AXUnknownOrientation'
+PASS: radiogroup2.orientation === 'AXOrientation: AXVerticalOrientation'
+PASS: treegrid2.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: separator2.orientation === 'AXOrientation: AXUnknownOrientation'
+PASS: slider2.orientation === 'AXOrientation: AXUnknownOrientation'
+PASS: listbox2.orientation === 'AXOrientation: AXHorizontalOrientation'
+PASS: listboxDisplayContents.orientation === 'AXOrientation: AXVerticalOrientation'
-Authored orientation
-radio 1
-cell
-cell2
-X
-Option
-This test makes sure that aria-orientation works correctly and the implicit defaults are defined on different roles.
+Updating #listbox-display-contents aria-orientation to horizontal.
+PASS: listboxDisplayContents.orientation === 'AXOrientation: AXHorizontalOrientation'
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS slider.orientation is 'AXOrientation: AXHorizontalOrientation'
-PASS combobox.orientation is 'AXOrientation: AXUnknownOrientation'
-PASS listbox.orientation is 'AXOrientation: AXVerticalOrientation'
-PASS menu.orientation is 'AXOrientation: AXVerticalOrientation'
-PASS menubar.orientation is 'AXOrientation: AXHorizontalOrientation'
-PASS radiogroup.orientation is 'AXOrientation: AXUnknownOrientation'
-PASS separator.orientation is 'AXOrientation: AXHorizontalOrientation'
-PASS tablist.orientation is 'AXOrientation: AXHorizontalOrientation'
-PASS toolbar.orientation is 'AXOrientation: AXHorizontalOrientation'
-PASS tree.orientation is 'AXOrientation: AXVerticalOrientation'
-PASS treegrid.orientation is 'AXOrientation: AXUnknownOrientation'
-PASS radiogroup2.orientation is 'AXOrientation: AXVerticalOrientation'
-PASS treegrid2.orientation is 'AXOrientation: AXHorizontalOrientation'
-PASS separator2.orientation is 'AXOrientation: AXUnknownOrientation'
-PASS slider2.orientation is 'AXOrientation: AXUnknownOrientation'
-PASS listbox2.orientation is 'AXOrientation: AXHorizontalOrientation'
PASS successfullyParsed is true
TEST COMPLETE
+
Modified: trunk/LayoutTests/accessibility/aria-orientation.html (295491 => 295492)
--- trunk/LayoutTests/accessibility/aria-orientation.html 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/LayoutTests/accessibility/aria-orientation.html 2022-06-13 17:16:47 UTC (rev 295492)
@@ -1,114 +1,130 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
-<script src=""
+<script src=""
+<script src=""
</head>
-<body id="body">
+<body>
-<div>Implicit defaults</div>
-<input type="range" id="slider">
-<input id="combo" type="text" role="combobox" placeholder="Placeholder" value="text">
-<div id="listbox" role="listbox">
- <div id="option1" role="option" aria-selected="true">Option</div>
-</div>
-<div id="menu" role="menu">
- <div role="menuitem" id="item1" tabindex="0">Menu item 1</div>
-</div>
-<div id="menubar" role="menubar">menubar</div>
-<div role="radiogroup" id="radiogroup">
- <div role="radio" aria-label="radio 1" aria-checked="false">radio 1</div>
-</div>
-<div role="separator" id="separator"></div>
-<div role="tablist" id="tablist">
-<div role="toolbar" id="toolbar" aria-label="test toolbar"><li>item one</div>
-<ul id="tree" role="tree">
- <li id="treeitem1" role="treeitem">tree item</li>
-</ul>
-<table id="treegrid" role="treegrid">
-<tbody>
- <tr><td role="gridcell" colspan="3">cell</tr>
- <tr><td role="gridcell" colspan="3">cell2</tr>
-</tbody>
-</table>
+<div id="content">
+ <div>Implicit defaults</div>
+ <input type="range" id="slider">
+ <input id="combo" type="text" role="combobox" placeholder="Placeholder" value="text">
+ <div id="listbox" role="listbox">
+ <div id="option1" role="option" aria-selected="true">Option</div>
+ </div>
+ <div id="menu" role="menu">
+ <div role="menuitem" id="item1" tabindex="0">Menu item 1</div>
+ </div>
+ <div id="menubar" role="menubar">menubar</div>
+ <div role="radiogroup" id="radiogroup">
+ <div role="radio" aria-label="radio 1" aria-checked="false">radio 1</div>
+ </div>
+ <div role="separator" id="separator"></div>
+ <div role="tablist" id="tablist">
+ <div role="toolbar" id="toolbar" aria-label="test toolbar"><li>item one</div>
+ <ul id="tree" role="tree">
+ <li id="treeitem1" role="treeitem">tree item</li>
+ </ul>
+ <table id="treegrid" role="treegrid">
+ <tbody>
+ <tr><td role="gridcell" colspan="3">cell</tr>
+ <tr><td role="gridcell" colspan="3">cell2</tr>
+ </tbody>
+ </table>
-<br>
-<div>Authored orientation</div>
-<div role="radiogroup" id="radiogroup2" aria-orientation="vertical">
- <div role="radio" aria-label="radio 1" aria-checked=false>radio 1</div>
+ <br>
+ <div>Authored orientation</div>
+ <div role="radiogroup" id="radiogroup2" aria-orientation="vertical">
+ <div role="radio" aria-label="radio 1" aria-checked=false>radio 1</div>
+ </div>
+ <table id="treegrid2" role="treegrid" aria-orientation="horizontal">
+ <tbody>
+ <tr><td role="gridcell" colspan="3">cell</tr>
+ <tr><td role="gridcell" colspan="3">cell2</tr>
+ </tbody>
+ </table>
+ <div role="separator" id="separator2" aria-orientation="undefined"></div>
+ <span role="slider" id="slider2" aria-orientation="undefined" aria-valuenow=5 aria-valuemin=0 aria-valuemax=10>X</span>
+ <div role="listbox" id="listbox2" aria-orientation="horizontal">
+ <div id="option2" role="option" aria-selected="true">Option</div>
+ </div>
+ <div role="listbox" id="listbox-display-contents" style="display:contents" aria-orientation="vertical">
+ <div id="option-within-display-contents" role="option" aria-selected="true">Option</div>
+ </div>
</div>
-<table id="treegrid2" role="treegrid" aria-orientation="horizontal">
-<tbody>
- <tr><td role="gridcell" colspan="3">cell</tr>
- <tr><td role="gridcell" colspan="3">cell2</tr>
-</tbody>
-</table>
-<div role="separator" id="separator2" aria-orientation="undefined"></div>
-<span role="slider" id="slider2" aria-orientation="undefined" aria-valuenow=5 aria-valuemin=0 aria-valuemax=10>X</span>
-<div role="listbox" id="listbox2" aria-orientation="horizontal">
- <div id="option2" role="option" aria-selected="true">Option</div>
-</div>
-<p id="description"></p>
-<div id="console"></div>
-
<script>
+ var testOutput = "This test ensures that aria-orientation works correctly and the implicit defaults are defined on different roles.\n\n";
- description("This test makes sure that aria-orientation works correctly and the implicit defaults are defined on different roles.");
-
if (window.accessibilityController) {
- // Test implicit defaults on some roles.
- var slider = accessibilityController.accessibleElementById("slider");
- shouldBe("slider.orientation", "'AXOrientation: AXHorizontalOrientation'");
-
- var combobox = accessibilityController.accessibleElementById("combo");
- shouldBe("combobox.orientation", "'AXOrientation: AXUnknownOrientation'");
-
- var listbox = accessibilityController.accessibleElementById("listbox");
- shouldBe("listbox.orientation", "'AXOrientation: AXVerticalOrientation'");
-
- var menu = accessibilityController.accessibleElementById("menu");
- shouldBe("menu.orientation", "'AXOrientation: AXVerticalOrientation'");
-
- var menubar = accessibilityController.accessibleElementById("menubar");
- shouldBe("menubar.orientation", "'AXOrientation: AXHorizontalOrientation'");
+ window.jsTestIsAsync = true;
- var radiogroup = accessibilityController.accessibleElementById("radiogroup");
- shouldBe("radiogroup.orientation", "'AXOrientation: AXUnknownOrientation'");
+ // Test implicit defaults on some roles.
+ var slider = accessibilityController.accessibleElementById("slider");
+ testOutput += expect("slider.orientation", "'AXOrientation: AXHorizontalOrientation'");
- var separator = accessibilityController.accessibleElementById("separator");
- shouldBe("separator.orientation", "'AXOrientation: AXHorizontalOrientation'");
-
- var tablist = accessibilityController.accessibleElementById("tablist");
- shouldBe("tablist.orientation", "'AXOrientation: AXHorizontalOrientation'");
-
- var toolbar = accessibilityController.accessibleElementById("toolbar");
- shouldBe("toolbar.orientation", "'AXOrientation: AXHorizontalOrientation'");
-
- var tree = accessibilityController.accessibleElementById("tree");
- shouldBe("tree.orientation", "'AXOrientation: AXVerticalOrientation'");
+ var combobox = accessibilityController.accessibleElementById("combo");
+ testOutput += expect("combobox.orientation", "'AXOrientation: AXUnknownOrientation'");
- var treegrid = accessibilityController.accessibleElementById("treegrid");
- shouldBe("treegrid.orientation", "'AXOrientation: AXUnknownOrientation'");
-
- // Test authored aria-orientation are correct.
- var radiogroup2 = accessibilityController.accessibleElementById("radiogroup2");
- shouldBe("radiogroup2.orientation", "'AXOrientation: AXVerticalOrientation'");
-
- var treegrid2 = accessibilityController.accessibleElementById("treegrid2");
- shouldBe("treegrid2.orientation", "'AXOrientation: AXHorizontalOrientation'");
+ var listbox = accessibilityController.accessibleElementById("listbox");
+ testOutput += expect("listbox.orientation", "'AXOrientation: AXVerticalOrientation'");
- var separator2 = accessibilityController.accessibleElementById("separator2");
- shouldBe("separator2.orientation", "'AXOrientation: AXUnknownOrientation'");
-
- var slider2 = accessibilityController.accessibleElementById("slider2");
- shouldBe("slider2.orientation", "'AXOrientation: AXUnknownOrientation'");
+ var menu = accessibilityController.accessibleElementById("menu");
+ testOutput += expect("menu.orientation", "'AXOrientation: AXVerticalOrientation'");
- var listbox2 = accessibilityController.accessibleElementById("listbox2");
- shouldBe("listbox2.orientation", "'AXOrientation: AXHorizontalOrientation'");
+ var menubar = accessibilityController.accessibleElementById("menubar");
+ testOutput += expect("menubar.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ var radiogroup = accessibilityController.accessibleElementById("radiogroup");
+ testOutput += expect("radiogroup.orientation", "'AXOrientation: AXUnknownOrientation'");
+
+ var separator = accessibilityController.accessibleElementById("separator");
+ testOutput += expect("separator.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ var tablist = accessibilityController.accessibleElementById("tablist");
+ testOutput += expect("tablist.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ var toolbar = accessibilityController.accessibleElementById("toolbar");
+ testOutput += expect("toolbar.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ var tree = accessibilityController.accessibleElementById("tree");
+ testOutput += expect("tree.orientation", "'AXOrientation: AXVerticalOrientation'");
+
+ var treegrid = accessibilityController.accessibleElementById("treegrid");
+ testOutput += expect("treegrid.orientation", "'AXOrientation: AXUnknownOrientation'");
+
+ // Test authored aria-orientation are correct.
+ var radiogroup2 = accessibilityController.accessibleElementById("radiogroup2");
+ testOutput += expect("radiogroup2.orientation", "'AXOrientation: AXVerticalOrientation'");
+
+ var treegrid2 = accessibilityController.accessibleElementById("treegrid2");
+ testOutput += expect("treegrid2.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ var separator2 = accessibilityController.accessibleElementById("separator2");
+ testOutput += expect("separator2.orientation", "'AXOrientation: AXUnknownOrientation'");
+
+ var slider2 = accessibilityController.accessibleElementById("slider2");
+ testOutput += expect("slider2.orientation", "'AXOrientation: AXUnknownOrientation'");
+
+ var listbox2 = accessibilityController.accessibleElementById("listbox2");
+ testOutput += expect("listbox2.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ var listboxDisplayContents = accessibilityController.accessibleElementById("listbox-display-contents");
+ testOutput += expect("listboxDisplayContents.orientation", "'AXOrientation: AXVerticalOrientation'");
+
+ testOutput += "\nUpdating #listbox-display-contents aria-orientation to horizontal.\n"
+ document.getElementById("listbox-display-contents").setAttribute("aria-orientation", "horizontal");
+ setTimeout(async function() {
+ await waitFor(() => listboxDisplayContents.orientation.includes("AXHorizontalOrientation"));
+ testOutput += expect("listboxDisplayContents.orientation", "'AXOrientation: AXHorizontalOrientation'");
+
+ document.getElementById("content").style.visibility = "hidden";
+ debug(testOutput);
+ finishJSTest();
+ }, 0);
}
-
</script>
-
-<script src=""
</body>
</html>
+
Modified: trunk/Source/WebCore/accessibility/AXLogger.cpp (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AXLogger.cpp 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AXLogger.cpp 2022-06-13 17:16:47 UTC (rev 295492)
@@ -433,6 +433,9 @@
case AXObjectCache::AXNotification::AXNewDocumentLoadComplete:
stream << "AXNewDocumentLoadComplete";
break;
+ case AXObjectCache::AXNotification::AXOrientationChanged:
+ stream << "AXOrientationChanged";
+ break;
case AXObjectCache::AXNotification::AXPageScrolled:
stream << "AXPageScrolled";
break;
Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp 2022-06-13 17:16:47 UTC (rev 295492)
@@ -1971,6 +1971,8 @@
}
else if (attrName == aria_multiselectableAttr)
postNotification(element, AXMultiSelectableStateChanged);
+ else if (attrName == aria_orientationAttr)
+ postNotification(element, AXOrientationChanged);
else if (attrName == aria_posinsetAttr)
postNotification(element, AXPositionInSetChanged);
else if (attrName == aria_relevantAttr)
@@ -3535,6 +3537,9 @@
tree->updateNodeProperty(*notification.first, AXPropertyName::MinValueForRange);
tree->updateNodeProperty(*notification.first, AXPropertyName::ValueForRange);
break;
+ case AXOrientationChanged:
+ tree->updateNodeProperty(*notification.first, AXPropertyName::Orientation);
+ break;
case AXPositionInSetChanged:
tree->updateNodeProperty(*notification.first, AXPropertyName::PosInSet);
tree->updateNodeProperty(*notification.first, AXPropertyName::SupportsPosInSet);
Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AXObjectCache.h 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h 2022-06-13 17:16:47 UTC (rev 295492)
@@ -313,6 +313,7 @@
AXMenuOpened,
AXMinimumValueChanged,
AXMultiSelectableStateChanged,
+ AXOrientationChanged,
AXRowCountChanged,
AXRowCollapsed,
AXRowExpanded,
Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2022-06-13 17:16:47 UTC (rev 295492)
@@ -980,6 +980,31 @@
return getAttribute(stepAttr).toFloat();
}
+AccessibilityOrientation AccessibilityNodeObject::orientation() const
+{
+ const AtomString& ariaOrientation = getAttribute(aria_orientationAttr);
+ if (equalLettersIgnoringASCIICase(ariaOrientation, "horizontal"_s))
+ return AccessibilityOrientation::Horizontal;
+ if (equalLettersIgnoringASCIICase(ariaOrientation, "vertical"_s))
+ return AccessibilityOrientation::Vertical;
+ if (equalLettersIgnoringASCIICase(ariaOrientation, "undefined"_s))
+ return AccessibilityOrientation::Undefined;
+
+ // In ARIA 1.1, the implicit value of aria-orientation changed from horizontal
+ // to undefined on all roles that don't have their own role-specific values. In
+ // addition, the implicit value of combobox became undefined.
+ if (isComboBox() || isRadioGroup() || isTreeGrid())
+ return AccessibilityOrientation::Undefined;
+
+ if (isScrollbar() || isListBox() || isMenu() || isTree())
+ return AccessibilityOrientation::Vertical;
+
+ if (isMenuBar() || isSplitter() || isTabList() || isToolbar() || isSlider())
+ return AccessibilityOrientation::Horizontal;
+
+ return AccessibilityObject::orientation();
+}
+
bool AccessibilityNodeObject::isHeading() const
{
return roleValue() == AccessibilityRole::Heading;
Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h 2022-06-13 17:16:47 UTC (rev 295492)
@@ -101,6 +101,8 @@
float minValueForRange() const override;
float stepValueForRange() const override;
+ AccessibilityOrientation orientation() const override;
+
AXCoreObject* selectedRadioButton() override;
AXCoreObject* selectedTabItem() override;
AccessibilityButtonState checkboxOrRadioValue() const override;
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2022-06-13 17:16:47 UTC (rev 295492)
@@ -2842,31 +2842,6 @@
return AccessibilityRole::Unknown;
}
-AccessibilityOrientation AccessibilityRenderObject::orientation() const
-{
- const AtomString& ariaOrientation = getAttribute(aria_orientationAttr);
- if (equalLettersIgnoringASCIICase(ariaOrientation, "horizontal"_s))
- return AccessibilityOrientation::Horizontal;
- if (equalLettersIgnoringASCIICase(ariaOrientation, "vertical"_s))
- return AccessibilityOrientation::Vertical;
- if (equalLettersIgnoringASCIICase(ariaOrientation, "undefined"_s))
- return AccessibilityOrientation::Undefined;
-
- // In ARIA 1.1, the implicit value of aria-orientation changed from horizontal
- // to undefined on all roles that don't have their own role-specific values. In
- // addition, the implicit value of combobox became undefined.
- if (isComboBox() || isRadioGroup() || isTreeGrid())
- return AccessibilityOrientation::Undefined;
-
- if (isScrollbar() || isListBox() || isMenu() || isTree())
- return AccessibilityOrientation::Vertical;
-
- if (isMenuBar() || isSplitter() || isTabList() || isToolbar() || isSlider())
- return AccessibilityOrientation::Horizontal;
-
- return AccessibilityObject::orientation();
-}
-
bool AccessibilityRenderObject::inheritsPresentationalRole() const
{
// ARIA states if an item can get focus, it should not be presentational.
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h (295491 => 295492)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h 2022-06-13 17:16:47 UTC (rev 295492)
@@ -142,7 +142,6 @@
void setSelectedTextRange(const PlainTextRange&) override;
bool setValue(const String&) override;
void setSelectedRows(AccessibilityChildrenVector&) override;
- AccessibilityOrientation orientation() const override;
void addChildren() override;
bool canHaveChildren() const override;
Modified: trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp (295491 => 295492)
--- trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp 2022-06-13 17:16:47 UTC (rev 295492)
@@ -219,6 +219,8 @@
break;
case AXLiveRegionStatusChanged:
break;
+ case AXOrientationChanged:
+ break;
}
}
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp (295491 => 295492)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp 2022-06-13 17:15:16 UTC (rev 295491)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp 2022-06-13 17:16:47 UTC (rev 295492)
@@ -397,6 +397,9 @@
case AXPropertyName::MinValueForRange:
propertyMap.set(AXPropertyName::MinValueForRange, axObject.minValueForRange());
break;
+ case AXPropertyName::Orientation:
+ propertyMap.set(AXPropertyName::Orientation, static_cast<int>(axObject.orientation()));
+ break;
case AXPropertyName::PosInSet:
propertyMap.set(AXPropertyName::PosInSet, axObject.posInSet());
break;