Title: [278718] trunk/Source/WebCore
Revision
278718
Author
[email protected]
Date
2021-06-10 12:08:52 -0700 (Thu, 10 Jun 2021)

Log Message

iOS - VoiceOver reads the programmatically associated label instead of the accessible name provided via the aria-label or aria-labelledby attribute
https://bugs.webkit.org/show_bug.cgi?id=226534
rdar://65935211

Reviewed by Chris Fleizach.

The problem is due to VoiceOver retrieving the titleUIElement for the
given object, and using the label of that title element as the label of
the object in question. The solution in this patch is to only return a
title element if the object can have title elements (if exposesTitleUIElement
is true). This check was missing in AccessibilityRenderObject::titleUIElement.

* accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::exposesTitleUIElement const):
This method is no longer necessary in the AXCoreObject interface,
instead is a virtual in the AXObject class hierarchy.

* accessibility/AccessibilityObjectInterface.h:
* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::titleUIElement const):
Checks whether this object can have a title element.

(WebCore::AccessibilityRenderObject::computeAccessibilityIsIgnored const):
(WebCore::AccessibilityRenderObject::accessibilityHitTest const):
* accessibility/AccessibilityRenderObject.h:
* accessibility/atk/WebKitAccessibleUtil.cpp:
(accessibilityTitle):
* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeAttributeData):
No need to cache this value any more.

* accessibility/isolatedtree/AXIsolatedObject.h:
* accessibility/isolatedtree/AXIsolatedTree.h:
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
* accessibility/win/AccessibilityObjectWrapperWin.cpp:
(WebCore::AccessibilityObjectWrapper::accessibilityAttributeValue):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (278717 => 278718)


--- trunk/Source/WebCore/ChangeLog	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/ChangeLog	2021-06-10 19:08:52 UTC (rev 278718)
@@ -1,3 +1,43 @@
+2021-06-10  Andres Gonzalez  <[email protected]>
+
+        iOS - VoiceOver reads the programmatically associated label instead of the accessible name provided via the aria-label or aria-labelledby attribute
+        https://bugs.webkit.org/show_bug.cgi?id=226534
+        rdar://65935211
+
+        Reviewed by Chris Fleizach.
+
+        The problem is due to VoiceOver retrieving the titleUIElement for the
+        given object, and using the label of that title element as the label of
+        the object in question. The solution in this patch is to only return a
+        title element if the object can have title elements (if exposesTitleUIElement
+        is true). This check was missing in AccessibilityRenderObject::titleUIElement.
+
+        * accessibility/AccessibilityObject.h:
+        (WebCore::AccessibilityObject::exposesTitleUIElement const):
+        This method is no longer necessary in the AXCoreObject interface,
+        instead is a virtual in the AXObject class hierarchy.
+
+        * accessibility/AccessibilityObjectInterface.h:
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::titleUIElement const):
+        Checks whether this object can have a title element.
+
+        (WebCore::AccessibilityRenderObject::computeAccessibilityIsIgnored const):
+        (WebCore::AccessibilityRenderObject::accessibilityHitTest const):
+        * accessibility/AccessibilityRenderObject.h:
+        * accessibility/atk/WebKitAccessibleUtil.cpp:
+        (accessibilityTitle):
+        * accessibility/isolatedtree/AXIsolatedObject.cpp:
+        (WebCore::AXIsolatedObject::initializeAttributeData):
+        No need to cache this value any more.
+
+        * accessibility/isolatedtree/AXIsolatedObject.h:
+        * accessibility/isolatedtree/AXIsolatedTree.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+        * accessibility/win/AccessibilityObjectWrapperWin.cpp:
+        (WebCore::AccessibilityObjectWrapper::accessibilityAttributeValue):
+
 2021-06-10  Ben Nham  <[email protected]>
 
         Only cache GET requests in the memory cache

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (278717 => 278718)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.h	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h	2021-06-10 19:08:52 UTC (rev 278718)
@@ -363,7 +363,6 @@
     AccessibilityObject* observableObject() const override { return nullptr; }
     void linkedUIElements(AccessibilityChildrenVector&) const override { }
     AccessibilityObject* titleUIElement() const override { return nullptr; }
-    bool exposesTitleUIElement() const override { return true; }
     AccessibilityObject* correspondingLabelForControlElement() const override { return nullptr; }
     AccessibilityObject* correspondingControlForLabelElement() const override { return nullptr; }
     AccessibilityObject* scrollBar(AccessibilityOrientation) override { return nullptr; }
@@ -786,6 +785,7 @@
     static bool isARIAInput(AccessibilityRole);
     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
     void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
+    virtual bool exposesTitleUIElement() const { return true; }
 
     AccessibilityObject* radioGroupAncestor() const;
 

Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (278717 => 278718)


--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h	2021-06-10 19:08:52 UTC (rev 278718)
@@ -1099,7 +1099,6 @@
     virtual AXCoreObject* observableObject() const = 0;
     virtual void linkedUIElements(AccessibilityChildrenVector&) const = 0;
     virtual AXCoreObject* titleUIElement() const = 0;
-    virtual bool exposesTitleUIElement() const = 0;
     virtual AXCoreObject* correspondingLabelForControlElement() const = 0;
     virtual AXCoreObject* correspondingControlForLabelElement() const = 0;
     virtual AXCoreObject* scrollBar(AccessibilityOrientation) = 0;

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (278717 => 278718)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2021-06-10 19:08:52 UTC (rev 278718)
@@ -1214,9 +1214,9 @@
     
 AccessibilityObject* AccessibilityRenderObject::titleUIElement() const
 {
-    if (!m_renderer)
+    if (!m_renderer || !exposesTitleUIElement())
         return nullptr;
-    
+
     // if isFieldset is true, the renderer is guaranteed to be a RenderFieldset
     if (isFieldset())
         return axObjectCache()->getOrCreate(downcast<RenderBlock>(*m_renderer).findFieldsetLegend(RenderBlock::FieldsetIncludeFloatingOrOutOfFlow));
@@ -1551,8 +1551,8 @@
 
     // Find out if this element is inside of a label element.
     // If so, it may be ignored because it's the label for a checkbox or radio button.
-    AccessibilityObject* controlObject = correspondingControlForLabelElement();
-    if (controlObject && !controlObject->exposesTitleUIElement() && controlObject->isCheckboxOrRadio())
+    auto* controlObject = correspondingControlForLabelElement();
+    if (controlObject && controlObject->isCheckboxOrRadio() && !controlObject->titleUIElement())
         return true;
 
     // By default, objects should be ignored so that the AX hierarchy is not
@@ -2565,8 +2565,8 @@
     
     if (result && result->accessibilityIsIgnored()) {
         // If this element is the label of a control, a hit test should return the control.
-        AXCoreObject* controlObject = result->correspondingControlForLabelElement();
-        if (controlObject && !controlObject->exposesTitleUIElement())
+        auto* controlObject = result->correspondingControlForLabelElement();
+        if (controlObject && !controlObject->titleUIElement())
             return controlObject;
 
         result = result->parentObjectUnignored();

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h (278717 => 278718)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h	2021-06-10 19:08:52 UTC (rev 278718)
@@ -96,7 +96,6 @@
     AccessibilityObject* parentObjectIfExists() const override;
     AccessibilityObject* observableObject() const override;
     void linkedUIElements(AccessibilityChildrenVector&) const override;
-    bool exposesTitleUIElement() const override;
     AccessibilityObject* titleUIElement() const override;
     AccessibilityObject* correspondingControlForLabelElement() const override;
     AccessibilityObject* correspondingLabelForControlElement() const override;
@@ -210,6 +209,8 @@
     AccessibilityRole determineAccessibilityRole() override;
     bool computeAccessibilityIsIgnored() const override;
 
+    bool exposesTitleUIElement() const override;
+
 #if ENABLE(MATHML)
     virtual bool isIgnoredElementWithinMathTree() const;
 #endif

Modified: trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp (278717 => 278718)


--- trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/atk/WebKitAccessibleUtil.cpp	2021-06-10 19:08:52 UTC (rev 278718)
@@ -108,7 +108,7 @@
 
         // If there's an element that labels this object and it's not exposed, then we should use
         // that text as our title.
-        if (text.textSource == AccessibilityTextSource::LabelByElement && !coreObject->exposesTitleUIElement())
+        if (text.textSource == AccessibilityTextSource::LabelByElement && !coreObject->titleUIElement())
             return text.text;
 
         // Elements of role AccessibilityRole::Toolbar will return its title as AccessibilityTextSource::Alternative.

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (278717 => 278718)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp	2021-06-10 19:08:52 UTC (rev 278718)
@@ -191,7 +191,6 @@
     setProperty(AXPropertyName::IsGrabbed, object.isGrabbed());
     setProperty(AXPropertyName::DropEffects, object.determineDropEffects());
     setObjectProperty(AXPropertyName::TitleUIElement, object.titleUIElement());
-    setProperty(AXPropertyName::ExposesTitleUIElement, object.exposesTitleUIElement());
     setObjectProperty(AXPropertyName::VerticalScrollBar, object.scrollBar(AccessibilityOrientation::Vertical));
     setObjectProperty(AXPropertyName::HorizontalScrollBar, object.scrollBar(AccessibilityOrientation::Horizontal));
     setProperty(AXPropertyName::ARIARoleAttribute, static_cast<int>(object.ariaRoleAttribute()));

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (278717 => 278718)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h	2021-06-10 19:08:52 UTC (rev 278718)
@@ -252,7 +252,6 @@
     AXCoreObject* parentObjectUnignored() const override;
     void linkedUIElements(AccessibilityChildrenVector& children) const override { fillChildrenVectorForProperty(AXPropertyName::LinkedUIElements, children); }
     AXCoreObject* titleUIElement() const override { return objectAttributeValue(AXPropertyName::TitleUIElement); }
-    bool exposesTitleUIElement() const override { return boolAttributeValue(AXPropertyName::ExposesTitleUIElement); }
     AXCoreObject* scrollBar(AccessibilityOrientation) override;
     AccessibilityRole ariaRoleAttribute() const override { return static_cast<AccessibilityRole>(intAttributeValue(AXPropertyName::ARIARoleAttribute)); }
     String computedLabel() override { return stringAttributeValue(AXPropertyName::ComputedLabel); }

Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h (278717 => 278718)


--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h	2021-06-10 19:08:52 UTC (rev 278718)
@@ -111,7 +111,6 @@
     EmbeddedImageDescription,
     EstimatedLoadingProgress,
     ExpandedTextValue,
-    ExposesTitleUIElement,
     FileUploadButtonReturnsValueInTitle,
     FocusableAncestor,
     HasARIAValueNow,

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (278717 => 278718)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2021-06-10 19:08:52 UTC (rev 278718)
@@ -2639,13 +2639,8 @@
     }
 
     if ([attributeName isEqualToString:NSAccessibilityTitleUIElementAttribute]) {
-        if (!backingObject->exposesTitleUIElement())
-            return nil;
-
-        AXCoreObject* obj = backingObject->titleUIElement();
-        if (obj)
-            return obj->wrapper();
-        return nil;
+        auto* object = backingObject->titleUIElement();
+        return object ? object->wrapper() : nil;
     }
 
     if ([attributeName isEqualToString:NSAccessibilityValueDescriptionAttribute])

Modified: trunk/Source/WebCore/accessibility/win/AccessibilityObjectWrapperWin.cpp (278717 => 278718)


--- trunk/Source/WebCore/accessibility/win/AccessibilityObjectWrapperWin.cpp	2021-06-10 19:02:51 UTC (rev 278717)
+++ trunk/Source/WebCore/accessibility/win/AccessibilityObjectWrapperWin.cpp	2021-06-10 19:08:52 UTC (rev 278718)
@@ -45,14 +45,10 @@
 
     // Not a real concept on Windows, but used heavily in WebKit accessibility testing.
     if (attributeName == "AXTitleUIElementAttribute") {
-        if (!m_object->exposesTitleUIElement())
-            return;
-
-        AccessibilityObject* obj = m_object->titleUIElement();
-        if (obj) {
+        if (auto* object = m_object->titleUIElement()) {
             ASSERT(V_VT(result) == VT_EMPTY);
             V_VT(result) = VT_UNKNOWN;
-            AccessibilityObjectWrapper* wrapper = obj->wrapper();
+            AccessibilityObjectWrapper* wrapper = object->wrapper();
             V_UNKNOWN(result) = wrapper;
             if (wrapper)
                 wrapper->AddRef();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to