- Revision
- 278907
- Author
- andresg...@apple.com
- Date
- 2021-06-15 15:06:17 -0700 (Tue, 15 Jun 2021)
Log Message
iOS - VoiceOver reads incorrectly in content editable element if role="document".
https://bugs.webkit.org/show_bug.cgi?id=227035
rdar://78776169
Reviewed by Chris Fleizach.
On iOS, VoiceOver was announcing <div contenteditable="true" role="document">
as a landmark and not as editable text. Furthermore, VoiceOver wasn't
echoing keyboard input once the element became interactive.
The solution is to return AccessibilityRole::TextArea for an element
with these attributes instead of Document.
Used shouldIgnoreRoleAttribute to special case this scenario.
* accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::shouldIgnoreAttributeRole const):
* accessibility/AccessibilityObjectInterface.h:
Removed shouldIgnoreRoleAttribute from the AXObject interface since it
doesn't need to be exposed outside the AXObject class hierarchy.
* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::shouldIgnoreAttributeRole const):
* accessibility/AccessibilityRenderObject.h:
* accessibility/AccessibilityTreeItem.h:
* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper _accessibilityTextEntryTraits]): Code cleanup.
* accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::shouldIgnoreAttributeRole const): Deleted.
* accessibility/isolatedtree/AXIsolatedObject.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (278906 => 278907)
--- trunk/Source/WebCore/ChangeLog 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/ChangeLog 2021-06-15 22:06:17 UTC (rev 278907)
@@ -1,3 +1,33 @@
+2021-06-15 Andres Gonzalez <andresg...@apple.com>
+
+ iOS - VoiceOver reads incorrectly in content editable element if role="document".
+ https://bugs.webkit.org/show_bug.cgi?id=227035
+ rdar://78776169
+
+ Reviewed by Chris Fleizach.
+
+ On iOS, VoiceOver was announcing <div contenteditable="true" role="document">
+ as a landmark and not as editable text. Furthermore, VoiceOver wasn't
+ echoing keyboard input once the element became interactive.
+ The solution is to return AccessibilityRole::TextArea for an element
+ with these attributes instead of Document.
+ Used shouldIgnoreRoleAttribute to special case this scenario.
+
+ * accessibility/AccessibilityObject.h:
+ (WebCore::AccessibilityObject::shouldIgnoreAttributeRole const):
+ * accessibility/AccessibilityObjectInterface.h:
+ Removed shouldIgnoreRoleAttribute from the AXObject interface since it
+ doesn't need to be exposed outside the AXObject class hierarchy.
+ * accessibility/AccessibilityRenderObject.cpp:
+ (WebCore::AccessibilityRenderObject::shouldIgnoreAttributeRole const):
+ * accessibility/AccessibilityRenderObject.h:
+ * accessibility/AccessibilityTreeItem.h:
+ * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+ (-[WebAccessibilityObjectWrapper _accessibilityTextEntryTraits]): Code cleanup.
+ * accessibility/isolatedtree/AXIsolatedObject.cpp:
+ (WebCore::AXIsolatedObject::shouldIgnoreAttributeRole const): Deleted.
+ * accessibility/isolatedtree/AXIsolatedObject.h:
+
2021-06-15 Alex Christensen <achristen...@webkit.org>
Allow legacy SecurityOrigin behavior for x-apple-ql-id2 scheme
Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (278906 => 278907)
--- trunk/Source/WebCore/accessibility/AccessibilityObject.h 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h 2021-06-15 22:06:17 UTC (rev 278907)
@@ -487,8 +487,6 @@
void addChild(AXCoreObject*) override;
void insertChild(AXCoreObject*, unsigned) override;
- bool shouldIgnoreAttributeRole() const override { return false; }
-
bool canHaveChildren() const override { return true; }
bool hasChildren() const override { return m_haveChildren; }
void updateChildrenIfNecessary() override;
@@ -777,6 +775,7 @@
ScrollableArea* scrollableAreaAncestor() const;
void scrollAreaAndAncestor(std::pair<ScrollableArea*, AccessibilityObject*>&) const;
+ virtual bool shouldIgnoreAttributeRole() const { return false; }
virtual AccessibilityRole buttonRoleType() const;
String rolePlatformDescription() const;
bool isOnScreen() const override;
Modified: trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h (278906 => 278907)
--- trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h 2021-06-15 22:06:17 UTC (rev 278907)
@@ -1229,8 +1229,6 @@
virtual void insertChild(AXCoreObject*, unsigned) = 0;
Vector<AXID> childrenIDs();
- virtual bool shouldIgnoreAttributeRole() const = 0;
-
virtual bool canHaveChildren() const = 0;
virtual bool hasChildren() const = 0;
virtual void updateChildrenIfNecessary() = 0;
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (278906 => 278907)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2021-06-15 22:06:17 UTC (rev 278907)
@@ -2791,6 +2791,14 @@
return false;
}
+bool AccessibilityRenderObject::shouldIgnoreAttributeRole() const
+{
+ if (m_ariaRole == AccessibilityRole::Document
+ && hasContentEditableAttributeSet())
+ return true;
+ return false;
+}
+
AccessibilityRole AccessibilityRenderObject::determineAccessibilityRole()
{
AXTRACE("AccessibilityRenderObject::determineAccessibilityRole");
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h (278906 => 278907)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.h 2021-06-15 22:06:17 UTC (rev 278907)
@@ -206,6 +206,7 @@
bool isDetached() const override { return !m_renderer; }
+ bool shouldIgnoreAttributeRole() const override;
AccessibilityRole determineAccessibilityRole() override;
bool computeAccessibilityIsIgnored() const override;
Modified: trunk/Source/WebCore/accessibility/AccessibilityTreeItem.h (278906 => 278907)
--- trunk/Source/WebCore/accessibility/AccessibilityTreeItem.h 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/AccessibilityTreeItem.h 2021-06-15 22:06:17 UTC (rev 278907)
@@ -37,11 +37,11 @@
static Ref<AccessibilityTreeItem> create(RenderObject*);
virtual ~AccessibilityTreeItem();
- bool shouldIgnoreAttributeRole() const override { return !m_isTreeItemValid; }
bool supportsCheckedState() const override;
private:
explicit AccessibilityTreeItem(RenderObject*);
+ bool shouldIgnoreAttributeRole() const final { return !m_isTreeItemValid; }
AccessibilityRole determineAccessibilityRole() override;
bool m_isTreeItemValid;
};
Modified: trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (278906 => 278907)
--- trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm 2021-06-15 22:06:17 UTC (rev 278907)
@@ -760,14 +760,24 @@
- (uint64_t)_accessibilityTextEntryTraits
{
uint64_t traits = [self _axTextEntryTrait];
- if (self.axBackingObject->isFocused())
+
+ auto* backingObject = self.axBackingObject;
+ if (backingObject->isFocused())
traits |= ([self _axHasTextCursorTrait] | [self _axTextOperationsAvailableTrait]);
- if (self.axBackingObject->isPasswordField())
+ if (backingObject->isPasswordField())
traits |= [self _axSecureTextFieldTrait];
- if (self.axBackingObject->roleValue() == AccessibilityRole::SearchField)
+
+ switch (backingObject->roleValue()) {
+ case AccessibilityRole::SearchField:
traits |= [self _axSearchFieldTrait];
- if (self.axBackingObject->roleValue() == AccessibilityRole::TextArea)
+ break;
+ case AccessibilityRole::TextArea:
traits |= [self _axTextAreaTrait];
+ break;
+ default:
+ break;
+ }
+
return traits;
}
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (278906 => 278907)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp 2021-06-15 22:06:17 UTC (rev 278907)
@@ -2136,12 +2136,6 @@
ASSERT_NOT_REACHED();
}
-bool AXIsolatedObject::shouldIgnoreAttributeRole() const
-{
- ASSERT_NOT_REACHED();
- return false;
-}
-
bool AXIsolatedObject::canHaveChildren() const
{
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (278906 => 278907)
--- trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h 2021-06-15 22:00:45 UTC (rev 278906)
+++ trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h 2021-06-15 22:06:17 UTC (rev 278907)
@@ -590,7 +590,6 @@
void addChildren() override;
void addChild(AXCoreObject*) override;
void insertChild(AXCoreObject*, unsigned) override;
- bool shouldIgnoreAttributeRole() const override;
bool canHaveChildren() const override;
bool hasChildren() const override { return boolAttributeValue(AXPropertyName::HasChildren); }
void setNeedsToUpdateChildren() override;