Title: [295446] trunk
Revision
295446
Author
tyle...@apple.com
Date
2022-06-09 23:25:28 -0700 (Thu, 09 Jun 2022)

Log Message

AX: Update the isolated tree in response to dynamic changes to aria-live, aria-relevant, and aria-atomic
https://bugs.webkit.org/show_bug.cgi?id=241444

Reviewed by Chris Fleizach.

With this patch, we now update the isolated tree in response to dynamic
aria-live, aria-relevant, and aria-atomic changes.

This patch also makes liveRegionStatus, liveRegionRelevant, and
liveRegionAtomic work on node-only objects (like those with display:contents).

* LayoutTests/accessibility/aria-busy-updates-after-dynamic-change-expected.txt: Removed.
* LayoutTests/accessibility/aria-busy-updates-after-dynamic-change.html: Removed.
* LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change-expected.txt: Added.
* LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change.html: Added.
* LayoutTests/platform/glib/TestExpectations:
* LayoutTests/platform/ios/TestExpectations:
* LayoutTests/platform/win/TestExpectations:
* Source/WebCore/accessibility/AXLogger.cpp:
(WebCore::operator<<):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::handleAttributeChange):
(WebCore::AXObjectCache::updateIsolatedTree):
* Source/WebCore/accessibility/AXObjectCache.h:
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::liveRegionStatus const):
(WebCore::AccessibilityNodeObject::liveRegionRelevant const):
(WebCore::AccessibilityNodeObject::liveRegionAtomic const):
* Source/WebCore/accessibility/AccessibilityNodeObject.h:
* Source/WebCore/accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::liveRegionStatus const): Deleted.
(WebCore::AccessibilityRenderObject::liveRegionRelevant const): Deleted.
(WebCore::AccessibilityRenderObject::liveRegionAtomic const): Deleted.
* Source/WebCore/accessibility/AccessibilityRenderObject.h:
* Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp:
(WebCore::AXObjectCache::postPlatformNotification):
* Tools/DumpRenderTree/AccessibilityUIElement.cpp:
(getLiveRegionRelevantCallback):
(getLiveRegionStatusCallback):
(getIsAtomicLiveRegionCallback):
(AccessibilityUIElement::getJSClass):
* Tools/DumpRenderTree/AccessibilityUIElement.h:
* Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
(AccessibilityUIElement::liveRegionRelevant const):
(AccessibilityUIElement::liveRegionStatus const):
(AccessibilityUIElement::isAtomicLiveRegion const):
* Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp
(AccessibilityUIElement::liveRegionRelevant const):
(AccessibilityUIElement::liveRegionStatus const):
(AccessibilityUIElement::isAtomicLiveRegion const):
* Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm:
(AccessibilityUIElement::liveRegionRelevant const):
(AccessibilityUIElement::liveRegionStatus const):
(AccessibilityUIElement::isAtomicLiveRegion const):
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
* Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
* Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
(WTR::AccessibilityUIElement::liveRegionRelevant const):
(WTR::AccessibilityUIElement::liveRegionStatus const):
(WTR::AccessibilityUIElement::isAtomicLiveRegion const):
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
(WTR::AccessibilityUIElement::liveRegionStatus const):
(WTR::AccessibilityUIElement::liveRegionRelevant const):
(WTR::AccessibilityUIElement::isAtomicLiveRegion const):
* Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp
* Tools/WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp

Canonical link: https://commits.webkit.org/251452@main

Modified Paths

Added Paths

Removed Paths

Diff

Deleted: trunk/LayoutTests/accessibility/aria-busy-updates-after-dynamic-change-expected.txt (295445 => 295446)


--- trunk/LayoutTests/accessibility/aria-busy-updates-after-dynamic-change-expected.txt	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/LayoutTests/accessibility/aria-busy-updates-after-dynamic-change-expected.txt	2022-06-10 06:25:28 UTC (rev 295446)
@@ -1,24 +0,0 @@
-This test ensures that an element's busy state updates aria-busy changes.
-
-Verifying initial busy state:
-
-#clock is busy: false
-#clock-display-contents is busy: false
-
-Setting aria-busy to true.
-
-#clock is busy: true
-#clock-display-contents is busy: true
-
-Setting aria-busy to false.
-
-#clock is busy: false
-#clock-display-contents is busy: false
-
-
-PASS successfullyParsed is true
-
-TEST COMPLETE
-2:30pm
-4:30pm
-

Deleted: trunk/LayoutTests/accessibility/aria-busy-updates-after-dynamic-change.html (295445 => 295446)


--- trunk/LayoutTests/accessibility/aria-busy-updates-after-dynamic-change.html	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/LayoutTests/accessibility/aria-busy-updates-after-dynamic-change.html	2022-06-10 06:25:28 UTC (rev 295446)
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-<head>
-<script src=""
-<script src=""
-</head>
-<body>
-
-<div id="clock" role="timer" aria-live="polite" aria-atomic="true">2:30pm</div>
-<div id="clock-display-contents" style="display: contents" role="timer" aria-live="polite" aria-atomic="true">4:30pm</div>
-
-<script>
-    var testOutput = "This test ensures that an element's busy state updates aria-busy changes.\n\n";
-
-    var axClock, axClockWithDisplayContents;
-    function verifyElements() {
-        testOutput += `#clock is busy: ${axClock.isBusy}\n`;
-        testOutput += `#clock-display-contents is busy: ${axClockWithDisplayContents.isBusy}\n\n`;
-    }
-
-    if (window.accessibilityController) {
-        window.jsTestIsAsync = true;
-        axClock = accessibilityController.accessibleElementById("clock");
-        axClockWithDisplayContents = accessibilityController.accessibleElementById("clock-display-contents");
-
-        testOutput += "Verifying initial busy state:\n\n";
-        verifyElements();
-
-        const clock = document.getElementById("clock");
-        const clockWithDisplayContents = document.getElementById("clock-display-contents");
-
-        testOutput += "Setting aria-busy to true.\n\n";
-        clock.ariaBusy = "true";
-        clockWithDisplayContents.ariaBusy = "true";
-        setTimeout(async function() {
-            await waitFor(() => { return axClock.isBusy && axClockWithDisplayContents.isBusy });
-            verifyElements();
-
-            testOutput += "Setting aria-busy to false.\n\n";
-            clock.ariaBusy = "false";
-            clockWithDisplayContents.ariaBusy = "false";
-            await waitFor(() => { return !axClock.isBusy && !axClockWithDisplayContents.isBusy });
-            verifyElements();
-
-            debug(testOutput);
-            finishJSTest();
-        }, 0);
-    }
-</script>
-</body>
-</html>
-

Added: trunk/LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change-expected.txt (0 => 295446)


--- trunk/LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change-expected.txt	2022-06-10 06:25:28 UTC (rev 295446)
@@ -0,0 +1,48 @@
+This test ensures that an element's busy state updates aria-busy changes.
+
+Verifying initial states:
+
+#clock is atomic: true
+#clock-display-contents is atomic: true
+
+#clock is busy: false
+#clock-display-contents is busy: false
+
+#clock relevant: additions text
+#clock-display-contents relevant: additions text
+
+#clock live region status: polite
+#clock-display-contents live region status: polite
+
+Setting aria-busy to true.
+
+#clock is busy: true
+#clock-display-contents is busy: true
+
+Setting aria-busy to false.
+
+#clock is busy: false
+#clock-display-contents is busy: false
+
+Setting aria-atomic to false.
+
+#clock is atomic: false
+#clock-display-contents is atomic: false
+
+Setting aria-relevant to removals.
+
+#clock relevant: removals
+#clock-display-contents relevant: removals
+
+Setting aria-live to assertive.
+
+#clock live region status: assertive
+#clock-display-contents live region status: assertive
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+2:30pm
+4:30pm
+

Added: trunk/LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change.html (0 => 295446)


--- trunk/LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change.html	                        (rev 0)
+++ trunk/LayoutTests/accessibility/live-region-attributes-update-after-dynamic-change.html	2022-06-10 06:25:28 UTC (rev 295446)
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+
+<div id="clock" role="timer" aria-live="polite" aria-atomic="true" aria-relevant="additions text">2:30pm</div>
+<div id="clock-display-contents" style="display: contents" role="timer" aria-live="polite" aria-atomic="true" aria-relevant="additions text">4:30pm</div>
+
+<script>
+    var testOutput = "This test ensures that an element's busy state updates aria-busy changes.\n\n";
+
+    var axClock, axClockWithDisplayContents;
+    function verifyIsBusy() {
+        testOutput += `#clock is busy: ${axClock.isBusy}\n`;
+        testOutput += `#clock-display-contents is busy: ${axClockWithDisplayContents.isBusy}\n\n`;
+    }
+    function verifyIsAtomic() {
+        testOutput += `#clock is atomic: ${axClock.isAtomicLiveRegion}\n`;
+        testOutput += `#clock-display-contents is atomic: ${axClockWithDisplayContents.isAtomicLiveRegion}\n\n`;
+    }
+    function verifyLiveRegionRelevant() {
+        testOutput += `#clock relevant: ${axClock.liveRegionRelevant}\n`;
+        testOutput += `#clock-display-contents relevant: ${axClockWithDisplayContents.liveRegionRelevant}\n\n`;
+    }
+    function verifyLiveRegionStatus() {
+        testOutput += `#clock live region status: ${axClock.liveRegionStatus}\n`;
+        testOutput += `#clock-display-contents live region status: ${axClockWithDisplayContents.liveRegionStatus}\n\n`;
+    }
+
+    if (window.accessibilityController) {
+        window.jsTestIsAsync = true;
+        axClock = accessibilityController.accessibleElementById("clock");
+        axClockWithDisplayContents = accessibilityController.accessibleElementById("clock-display-contents");
+
+        testOutput += "Verifying initial states:\n\n";
+        verifyIsAtomic();
+        verifyIsBusy();
+        verifyLiveRegionRelevant();
+        verifyLiveRegionStatus();
+
+        const clock = document.getElementById("clock");
+        const clockWithDisplayContents = document.getElementById("clock-display-contents");
+
+        testOutput += "Setting aria-busy to true.\n\n";
+        clock.ariaBusy = "true";
+        clockWithDisplayContents.ariaBusy = "true";
+        setTimeout(async function() {
+            await waitFor(() => axClock.isBusy && axClockWithDisplayContents.isBusy);
+            verifyIsBusy();
+
+            testOutput += "Setting aria-busy to false.\n\n";
+            clock.ariaBusy = "false";
+            clockWithDisplayContents.ariaBusy = "false";
+            await waitFor(() => !axClock.isBusy && !axClockWithDisplayContents.isBusy);
+            verifyIsBusy();
+
+            testOutput += "Setting aria-atomic to false.\n\n";
+            clock.ariaAtomic = "false";
+            clockWithDisplayContents.ariaAtomic = "false";
+            await waitFor(() => !axClock.isAtomicLiveRegion && !axClockWithDisplayContents.isAtomicLiveRegion);
+            verifyIsAtomic();
+
+            testOutput += "Setting aria-relevant to removals.\n\n";
+            clock.ariaRelevant = "removals";
+            clockWithDisplayContents.ariaRelevant = "removals";
+            await waitFor(() => axClock.liveRegionRelevant.includes("removals") && axClockWithDisplayContents.liveRegionRelevant.includes("removals"));
+            verifyLiveRegionRelevant();
+
+            testOutput += "Setting aria-live to assertive.\n\n";
+            clock.ariaLive = "assertive";
+            clockWithDisplayContents.ariaLive = "assertive";
+            await waitFor(() => axClock.liveRegionStatus.includes("assertive") && axClockWithDisplayContents.liveRegionStatus.includes("assertive"));
+            verifyLiveRegionStatus();
+
+            debug(testOutput);
+            finishJSTest();
+        }, 0);
+    }
+</script>
+</body>
+</html>
+

Modified: trunk/LayoutTests/platform/glib/TestExpectations (295445 => 295446)


--- trunk/LayoutTests/platform/glib/TestExpectations	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/LayoutTests/platform/glib/TestExpectations	2022-06-10 06:25:28 UTC (rev 295446)
@@ -344,8 +344,8 @@
 # Need to implement AccessibilityUIElement::domIdentifier() for this test to pass after webkit.org/b/234198.
 accessibility/focusable-div.html [ Skip ]
 
-# Missing AccessibilityUIElement::isBusy implementation.
-accessibility/aria-busy-updates-after-dynamic-change.html [ Skip ]
+# Missing AccessibilityUIElement::{isBusy, isAtomicLiveRegion, liveRegionStatus, liveRegionRelevant} implementations.
+accessibility/live-region-attributes-update-after-dynamic-change.html [ Skip ]
 
 # Timing out since it was added in https://bugs.webkit.org/show_bug.cgi?id=239434.
 accessibility/text-updates-after-dynamic-change.html [ Skip ]

Modified: trunk/LayoutTests/platform/ios/TestExpectations (295445 => 295446)


--- trunk/LayoutTests/platform/ios/TestExpectations	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/LayoutTests/platform/ios/TestExpectations	2022-06-10 06:25:28 UTC (rev 295446)
@@ -2115,7 +2115,6 @@
 fast/dom/linkify-phone-numbers.html [ Pass ]
 
 accessibility/table-exposure-updates-dynamically.html [ Pass ]
-accessibility/aria-busy-updates-after-dynamic-change.html [ Pass ]
 accessibility/aria-describedby-on-input.html [ Pass ]
 accessibility/aria-hidden-display-contents-element.html [ Pass ]
 accessibility/aria-multiline.html [ Pass ]
@@ -2126,6 +2125,7 @@
 accessibility/element-haspopup.html [ Pass ]
 accessibility/heading-level.html [ Pass ]
 accessibility/list-with-dynamically-changing-content.html [ Pass ]
+accessibility/live-region-attributes-update-after-dynamic-change.html [ Pass ]
 accessibility/node-only-inert-object.html [ Pass ]
 accessibility/node-only-object-element-rect.html [ Pass ]
 accessibility/text-updates-after-dynamic-change.html [ Pass ]

Modified: trunk/LayoutTests/platform/win/TestExpectations (295445 => 295446)


--- trunk/LayoutTests/platform/win/TestExpectations	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/LayoutTests/platform/win/TestExpectations	2022-06-10 06:25:28 UTC (rev 295446)
@@ -501,8 +501,8 @@
 accessibility/aria-readonly-updates-after-dynamic-change.html [ Skip ]
 # Missing AccessibilityUIElement::isRequired implementation.
 accessibility/aria-required-updates-after-dynamic-change.html [ Skip ]
-# Missing AccessibilityUIElement::isBusy implementation.
-accessibility/aria-busy-updates-after-dynamic-change.html [ Skip ]
+# Missing AccessibilityUIElement::{isBusy, isAtomicLiveRegion, liveRegionStatus, liveRegionRelevant} implementations.
+accessibility/live-region-attributes-update-after-dynamic-change.html [ Skip ]
 
 # TODO Conic gradients
 http/wpt/css/css-images-4/conic-gradient-parsing.html [ Skip ]

Modified: trunk/Source/WebCore/accessibility/AXLogger.cpp (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AXLogger.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AXLogger.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -406,6 +406,9 @@
     case AXObjectCache::AXNotification::AXImageOverlayChanged:
         stream << "AXImageOverlayChanged";
         break;
+    case AXObjectCache::AXNotification::AXIsAtomicChanged:
+        stream << "AXIsAtomicChanged";
+        break;
     case AXObjectCache::AXNotification::AXLanguageChanged:
         stream << "AXLanguageChanged";
         break;
@@ -460,6 +463,12 @@
     case AXObjectCache::AXNotification::AXLiveRegionChanged:
         stream << "AXLiveRegionChanged";
         break;
+    case AXObjectCache::AXNotification::AXLiveRegionRelevantChanged:
+        stream << "AXLiveRegionRelevantChanged";
+        break;
+    case AXObjectCache::AXNotification::AXLiveRegionStatusChanged:
+        stream << "AXLiveRegionStatusChanged";
+        break;
     case AXObjectCache::AXNotification::AXMenuListItemSelected:
         stream << "AXMenuListItemSelected";
         break;

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -1940,6 +1940,8 @@
 
     if (attrName == aria_activedescendantAttr)
         handleActiveDescendantChanged(*element);
+    else if (attrName == aria_atomicAttr)
+        postNotification(element, AXIsAtomicChanged);
     else if (attrName == aria_busyAttr)
         postNotification(element, AXObjectCache::AXElementBusyChanged);
     else if (attrName == aria_valuenowAttr || attrName == aria_valuetextAttr)
@@ -1954,6 +1956,8 @@
         postNotification(element, AXGrabbedStateChanged);
     else if (attrName == aria_levelAttr)
         postNotification(element, AXLevelChanged);
+    else if (attrName == aria_liveAttr)
+        postNotification(element, AXLiveRegionStatusChanged);
     else if (attrName == aria_valuemaxAttr)
         postNotification(element, AXMaximumValueChanged);
     else if (attrName == aria_valueminAttr)
@@ -1969,6 +1973,8 @@
         postNotification(element, AXMultiSelectableStateChanged);
     else if (attrName == aria_posinsetAttr)
         postNotification(element, AXPositionInSetChanged);
+    else if (attrName == aria_relevantAttr)
+        postNotification(element, AXLiveRegionRelevantChanged);
     else if (attrName == aria_selectedAttr)
         selectedStateChanged(element);
     else if (attrName == aria_setsizeAttr)
@@ -3560,7 +3566,10 @@
         case AXGrabbedStateChanged:
         case AXHasPopupChanged:
         case AXInvalidStatusChanged:
+        case AXIsAtomicChanged:
         case AXLevelChanged:
+        case AXLiveRegionStatusChanged:
+        case AXLiveRegionRelevantChanged:
         case AXMenuListValueChanged:
         case AXMultiSelectableStateChanged:
         case AXPressedStateChanged:

Modified: trunk/Source/WebCore/accessibility/AXObjectCache.h (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AXObjectCache.h	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.h	2022-06-10 06:25:28 UTC (rev 295446)
@@ -288,6 +288,7 @@
         AXHasPopupChanged,
         AXIdAttributeChanged,
         AXImageOverlayChanged,
+        AXIsAtomicChanged,
         AXLanguageChanged,
         AXLayoutComplete,
         AXLevelChanged,
@@ -303,6 +304,8 @@
         AXScrolledToAnchor,
         AXLiveRegionCreated,
         AXLiveRegionChanged,
+        AXLiveRegionRelevantChanged,
+        AXLiveRegionStatusChanged,
         AXMaximumValueChanged,
         AXMenuListItemSelected,
         AXMenuListValueChanged,

Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -1304,6 +1304,43 @@
     return equalLettersIgnoringASCIICase(getAttribute(attributeName), "true"_s);
 }
 
+const String AccessibilityNodeObject::liveRegionStatus() const
+{
+    const auto& liveRegionStatus = getAttribute(aria_liveAttr);
+    if (liveRegionStatus.isEmpty())
+        return defaultLiveRegionStatusForRole(roleValue());
+
+    return liveRegionStatus;
+}
+
+const String AccessibilityNodeObject::liveRegionRelevant() const
+{
+    const auto& relevant = getAttribute(aria_relevantAttr);
+    // Default aria-relevant = "additions text".
+    if (relevant.isEmpty())
+        return "additions text"_s;
+
+    return relevant;
+}
+
+bool AccessibilityNodeObject::liveRegionAtomic() const
+{
+    const auto& atomic = getAttribute(aria_atomicAttr);
+    if (equalLettersIgnoringASCIICase(atomic, "true"_s))
+        return true;
+    if (equalLettersIgnoringASCIICase(atomic, "false"_s))
+        return false;
+
+    // WAI-ARIA "alert" and "status" roles have an implicit aria-atomic value of true.
+    switch (roleValue()) {
+    case AccessibilityRole::ApplicationAlert:
+    case AccessibilityRole::ApplicationStatus:
+        return true;
+    default:
+        return false;
+    }
+}
+
 bool AccessibilityNodeObject::isGenericFocusableElement() const
 {
     if (!canSetFocusAttribute())

Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.h	2022-06-10 06:25:28 UTC (rev 295446)
@@ -173,6 +173,10 @@
 
     bool elementAttributeValue(const QualifiedName&) const;
 
+    const String liveRegionStatus() const override;
+    const String liveRegionRelevant() const override;
+    bool liveRegionAtomic() const override;
+
     bool isLabelable() const;
     AccessibilityObject* correspondingControlForLabelElement() const override;
     AccessibilityObject* correspondingLabelForControlElement() const override;

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -3264,46 +3264,6 @@
     return AccessibilityNodeObject::canHaveChildren();
 }
 
-const String AccessibilityRenderObject::liveRegionStatus() const
-{
-    const AtomString& liveRegionStatus = getAttribute(aria_liveAttr);
-    // These roles have implicit live region status.
-    if (liveRegionStatus.isEmpty())
-        return defaultLiveRegionStatusForRole(roleValue());
-
-    return liveRegionStatus;
-}
-
-const String AccessibilityRenderObject::liveRegionRelevant() const
-{
-    static MainThreadNeverDestroyed<const AtomString> defaultLiveRegionRelevant("additions text"_s);
-    const AtomString& relevant = getAttribute(aria_relevantAttr);
-
-    // Default aria-relevant = "additions text".
-    if (relevant.isEmpty())
-        return "additions text"_s;
-    
-    return relevant;
-}
-
-bool AccessibilityRenderObject::liveRegionAtomic() const
-{
-    const AtomString& atomic = getAttribute(aria_atomicAttr);
-    if (equalLettersIgnoringASCIICase(atomic, "true"_s))
-        return true;
-    if (equalLettersIgnoringASCIICase(atomic, "false"_s))
-        return false;
-
-    // WAI-ARIA "alert" and "status" roles have an implicit aria-atomic value of true.
-    switch (roleValue()) {
-    case AccessibilityRole::ApplicationAlert:
-    case AccessibilityRole::ApplicationStatus:
-        return true;
-    default:
-        return false;
-    }
-}
-
 bool AccessibilityRenderObject::canHaveSelectedChildren() const
 {
     switch (roleValue()) {

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h (295445 => 295446)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h	2022-06-10 06:25:28 UTC (rev 295446)
@@ -266,10 +266,6 @@
     
     OptionSet<SpeakAs> speakAsProperty() const override;
     
-    const String liveRegionStatus() const override;
-    const String liveRegionRelevant() const override;
-    bool liveRegionAtomic() const override;
-
     bool inheritsPresentationalRole() const override;
 
     bool shouldGetTextFromNode(AccessibilityTextUnderElementMode) const;

Modified: trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp (295445 => 295446)


--- trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Source/WebCore/accessibility/atspi/AXObjectCacheAtspi.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -213,6 +213,12 @@
         break;
     case AXMultiSelectableStateChanged:
         break;
+    case AXIsAtomicChanged:
+        break;
+    case AXLiveRegionRelevantChanged:
+        break;
+    case AXLiveRegionStatusChanged:
+        break;
     }
 }
 

Modified: trunk/Tools/DumpRenderTree/AccessibilityUIElement.cpp (295445 => 295446)


--- trunk/Tools/DumpRenderTree/AccessibilityUIElement.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/DumpRenderTree/AccessibilityUIElement.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -1244,6 +1244,18 @@
     return JSValueMakeString(context, language.get());
 }
 
+static JSValueRef getLiveRegionRelevantCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    auto liveRegionRelevant = toAXElement(thisObject)->liveRegionRelevant();
+    return JSValueMakeString(context, liveRegionRelevant.get());
+}
+
+static JSValueRef getLiveRegionStatusCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    auto liveRegionStatus = toAXElement(thisObject)->liveRegionStatus();
+    return JSValueMakeString(context, liveRegionStatus.get());
+}
+
 static JSValueRef getOrientationCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
 {
     auto orientation = toAXElement(thisObject)->orientation();
@@ -1327,6 +1339,11 @@
     return JSValueMakeString(context, selectedTextRange.get());
 }
 
+static JSValueRef getIsAtomicLiveRegionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
+{
+    return JSValueMakeBoolean(context, toAXElement(thisObject)->isAtomicLiveRegion());
+}
+
 static JSValueRef getIsBusyCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
 {
     return JSValueMakeBoolean(context, toAXElement(thisObject)->isBusy());
@@ -1929,6 +1946,7 @@
         { "columnCount", columnCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "insertionPointLineNumber", getInsertionPointLineNumberCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "selectedTextRange", getSelectedTextRangeCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "isAtomicLiveRegion", getIsAtomicLiveRegionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "isBusy", getIsBusyCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "isEnabled", getIsEnabledCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "isRequired", getIsRequiredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
@@ -1953,6 +1971,8 @@
         { "documentURI", getDocumentURICallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "url", getURLCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "isValid", getIsValidCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "liveRegionRelevant", getLiveRegionRelevantCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
+        { "liveRegionStatus", getLiveRegionStatusCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "orientation", getOrientationCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "ariaIsGrabbed", getARIAIsGrabbedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
         { "ariaDropEffects", getARIADropEffectsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },

Modified: trunk/Tools/DumpRenderTree/AccessibilityUIElement.h (295445 => 295446)


--- trunk/Tools/DumpRenderTree/AccessibilityUIElement.h	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/DumpRenderTree/AccessibilityUIElement.h	2022-06-10 06:25:28 UTC (rev 295446)
@@ -133,6 +133,8 @@
     JSRetainPtr<JSStringRef> accessibilityValue() const;
     void setValue(JSStringRef);
     JSRetainPtr<JSStringRef> helpText() const;
+    JSRetainPtr<JSStringRef> liveRegionRelevant() const;
+    JSRetainPtr<JSStringRef> liveRegionStatus() const;
     JSRetainPtr<JSStringRef> orientation() const;
     double x();
     double y();
@@ -145,6 +147,7 @@
     JSRetainPtr<JSStringRef> valueDescription();
     int insertionPointLineNumber();
     JSRetainPtr<JSStringRef> selectedTextRange();
+    bool isAtomicLiveRegion() const;
     bool isBusy() const;
     bool isEnabled();
     bool isRequired() const;

Modified: trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm (295445 => 295446)


--- trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm	2022-06-10 06:25:28 UTC (rev 295446)
@@ -75,6 +75,9 @@
 - (NSUInteger)accessibilityARIARowIndex;
 - (NSUInteger)accessibilityARIAColumnIndex;
 - (BOOL)accessibilityARIAIsBusy;
+- (BOOL)accessibilityARIALiveRegionIsAtomic;
+- (NSString *)accessibilityARIALiveRegionStatus;
+- (NSString *)accessibilityARIARelevantStatus;
 - (UIAccessibilityTraits)_axContainedByFieldsetTrait;
 - (id)_accessibilityFieldsetAncestor;
 - (BOOL)_accessibilityHasTouchEventListener;
@@ -812,6 +815,16 @@
     return concatenateAttributeAndValue(@"AXLabel", [m_element accessibilityLabel]);
 }
 
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    return [[m_element accessibilityARIARelevantStatus] createJSStringRef];
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    return [[m_element accessibilityARIALiveRegionStatus] createJSStringRef];
+}
+
 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const
 {
     return WTR::createJSString();
@@ -862,6 +875,11 @@
     return -1;
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    return [m_element accessibilityARIALiveRegionIsAtomic];
+}
+
 bool AccessibilityUIElement::isBusy() const
 {
     return [m_element accessibilityARIAIsBusy];

Modified: trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm (295445 => 295446)


--- trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm	2022-06-10 06:25:28 UTC (rev 295446)
@@ -684,6 +684,16 @@
     return stringAttributeValue(NSAccessibilityDOMIdentifierAttribute);
 }
 
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    return stringAttributeValue(@"AXARIARelevant");
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    return stringAttributeValue(@"AXARIALive");
+}
+
 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const
 {
     BEGIN_AX_OBJC_EXCEPTIONS
@@ -852,6 +862,11 @@
     return false;
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    return boolAttributeValue(@"AXARIAAtomic");
+}
+
 bool AccessibilityUIElement::isBusy() const
 {
     return boolAttributeValue(@"AXElementBusy");

Modified: trunk/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp (295445 => 295446)


--- trunk/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -523,6 +523,21 @@
     return 0;
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    return false;
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    return 0;
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    return 0;
+}
+
 double AccessibilityUIElement::intValue() const
 {
     if (!m_element)

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h (295445 => 295446)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h	2022-06-10 06:25:28 UTC (rev 295446)
@@ -156,6 +156,8 @@
     JSRetainPtr<JSStringRef> accessibilityValue() const;
     JSRetainPtr<JSStringRef> helpText() const;
     JSRetainPtr<JSStringRef> orientation() const;
+    JSRetainPtr<JSStringRef> liveRegionRelevant() const;
+    JSRetainPtr<JSStringRef> liveRegionStatus() const;
     double x();
     double y();
     double width();
@@ -168,6 +170,7 @@
     JSRetainPtr<JSStringRef> valueDescription();
     int insertionPointLineNumber();
     JSRetainPtr<JSStringRef> selectedTextRange();
+    bool isAtomicLiveRegion() const;
     bool isBusy() const;
     bool isEnabled();
     bool isRequired() const;

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl (295445 => 295446)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl	2022-06-10 06:25:28 UTC (rev 295446)
@@ -58,6 +58,8 @@
     readonly attribute DOMString valueDescription;
     readonly attribute DOMString url;
     readonly attribute DOMString speakAs;
+    readonly attribute DOMString liveRegionRelevant;
+    readonly attribute DOMString liveRegionStatus;
     readonly attribute DOMString orientation;
     readonly attribute long insertionPointLineNumber;
     readonly attribute DOMString selectedTextRange;
@@ -82,6 +84,7 @@
     readonly attribute long minValue;
     readonly attribute long maxValue;
     
+    readonly attribute boolean isAtomicLiveRegion;
     readonly attribute boolean isBusy;
     readonly attribute boolean isEnabled;
     readonly attribute boolean isRequired;

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp (295445 => 295446)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -881,6 +881,21 @@
     return OpaqueJSString::tryCreate(orientationValue).leakRef();
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    return false;
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    return nullptr;
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    return nullptr;
+}
+
 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringValue()
 {
     m_element->updateBackingStore();

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm (295445 => 295446)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm	2022-06-10 06:25:28 UTC (rev 295446)
@@ -83,6 +83,9 @@
 - (NSUInteger)accessibilityARIARowIndex;
 - (NSUInteger)accessibilityARIAColumnIndex;
 - (BOOL)accessibilityARIAIsBusy;
+- (BOOL)accessibilityARIALiveRegionIsAtomic;
+- (NSString *)accessibilityARIALiveRegionStatus;
+- (NSString *)accessibilityARIARelevantStatus;
 - (NSString *)accessibilityInvalidStatus;
 - (UIAccessibilityTraits)_axContainedByFieldsetTrait;
 - (id)_accessibilityFieldsetAncestor;
@@ -532,6 +535,16 @@
     return concatenateAttributeAndValue(@"AXLabel", [m_element accessibilityLabel]);
 }
 
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    return [[m_element accessibilityARIARelevantStatus] createJSStringRef];
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    return [[m_element accessibilityARIALiveRegionStatus] createJSStringRef];
+}
+
 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const
 {
     return createJSString();
@@ -632,6 +645,11 @@
     return false;
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    return [m_element accessibilityARIALiveRegionIsAtomic];
+}
+
 bool AccessibilityUIElement::isBusy() const
 {
     return [m_element accessibilityARIAIsBusy];

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm (295445 => 295446)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm	2022-06-10 06:25:28 UTC (rev 295446)
@@ -805,6 +805,16 @@
     return nullptr;
 }
 
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    return stringAttributeValue(@"AXARIALive");
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    return stringAttributeValue(@"AXARIARelevant");
+}
+
 JSRetainPtr<JSStringRef> AccessibilityUIElement::orientation() const
 {
     BEGIN_AX_OBJC_EXCEPTIONS
@@ -983,6 +993,11 @@
     return false;
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    return boolAttributeValue(@"AXARIAAtomic");
+}
+
 bool AccessibilityUIElement::isBusy() const
 {
     return boolAttributeValue(@"AXElementBusy");

Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp (295445 => 295446)


--- trunk/Tools/WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp	2022-06-10 04:58:46 UTC (rev 295445)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/win/AccessibilityUIElementWin.cpp	2022-06-10 06:25:28 UTC (rev 295446)
@@ -298,6 +298,24 @@
     return nullptr;
 }
 
+bool AccessibilityUIElement::isAtomicLiveRegion() const
+{
+    notImplemented();
+    return false;
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionRelevant() const
+{
+    notImplemented();
+    return nullptr;
+}
+
+JSRetainPtr<JSStringRef> AccessibilityUIElement::liveRegionStatus() const
+{
+    notImplemented();
+    return nullptr;
+}
+
 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringValue()
 {
     notImplemented();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to