Title: [278907] trunk/Source/WebCore
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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to