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();