AX: iOS: VoiceOver gets hung on some websites consistently.
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 8 Dec 2014 16:12:39 +0000 (16:12 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 8 Dec 2014 16:12:39 +0000 (16:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=139331

Reviewed by Mario Sanchez Prada.

iFrames are attachments on iOS, but they do not have attachment views. As a result,
WebCore would return incorrect information for the element count and index of children elements.

No tests. Bug only manifests itself when iOS accessibility frameworks call into WebCore.

* accessibility/AccessibilityMockObject.h:
(WebCore::AccessibilityMockObject::isDetachedFromParent):
* accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::isDetachedFromParent):
* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper accessibilityElementCount]):
(-[WebAccessibilityObjectWrapper accessibilityElementAtIndex:]):
(-[WebAccessibilityObjectWrapper indexOfAccessibilityElement:]):
(-[WebAccessibilityObjectWrapper accessibilityContainer]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@176948 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityMockObject.h
Source/WebCore/accessibility/AccessibilityObject.h
Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm

index b98f8ee..50e9865 100644 (file)
@@ -1,3 +1,25 @@
+2014-12-08  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: iOS: VoiceOver gets hung on some websites consistently.
+        https://bugs.webkit.org/show_bug.cgi?id=139331
+
+        Reviewed by Mario Sanchez Prada.
+
+        iFrames are attachments on iOS, but they do not have attachment views. As a result, 
+        WebCore would return incorrect information for the element count and index of children elements.
+
+        No tests. Bug only manifests itself when iOS accessibility frameworks call into WebCore.
+
+        * accessibility/AccessibilityMockObject.h:
+        (WebCore::AccessibilityMockObject::isDetachedFromParent):
+        * accessibility/AccessibilityObject.h:
+        (WebCore::AccessibilityObject::isDetachedFromParent):
+        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityElementCount]):
+        (-[WebAccessibilityObjectWrapper accessibilityElementAtIndex:]):
+        (-[WebAccessibilityObjectWrapper indexOfAccessibilityElement:]):
+        (-[WebAccessibilityObjectWrapper accessibilityContainer]):
+
 2014-12-08  Doron Wloschowsky  <doron_wloschowsky@scee.net>
 
         Webkit using Harfbuzz does not display Arabic script correctly
index 393d9d2..a3aa2d8 100644 (file)
@@ -49,6 +49,7 @@ protected:
 
 private:
     virtual bool isMockObject() const override final { return true; }
+    virtual bool isDetachedFromParent() { return !m_parent; }
 
     virtual bool computeAccessibilityIsIgnored() const override;
 };
index f33a608..7e80bac 100644 (file)
@@ -758,6 +758,7 @@ public:
 #else
     virtual void detachFromParent() { }
 #endif
+    virtual bool isDetachedFromParent() { return false; }
 
     virtual void selectedChildren(AccessibilityChildrenVector&) { }
     virtual void visibleChildren(AccessibilityChildrenVector&) { }
index 392ff6c..dd48dcc 100644 (file)
@@ -360,7 +360,7 @@ static AccessibilityObjectWrapper* AccessibilityUnignoredAncestor(AccessibilityO
     if (![self _prepareAccessibilityCall])
         return 0;
 
-    if ([self isAttachment])
+    if ([self isAttachment] && [self attachmentView])
         return [[self attachmentView] accessibilityElementCount];
     
     return m_object->children().size();
@@ -371,7 +371,7 @@ static AccessibilityObjectWrapper* AccessibilityUnignoredAncestor(AccessibilityO
     if (![self _prepareAccessibilityCall])
         return nil;
 
-    if ([self isAttachment])
+    if ([self isAttachment] && [self attachmentView])
         return [[self attachmentView] accessibilityElementAtIndex:index];
     
     const auto& children = m_object->children();
@@ -391,7 +391,7 @@ static AccessibilityObjectWrapper* AccessibilityUnignoredAncestor(AccessibilityO
     if (![self _prepareAccessibilityCall])
         return NSNotFound;
     
-    if ([self isAttachment])
+    if ([self isAttachment] && [self attachmentView])
         return [[self attachmentView] indexOfAccessibilityElement:element];
     
     const auto& children = m_object->children();
@@ -1270,7 +1270,11 @@ static void appendStringToResult(NSMutableString *result, NSString *string)
     if (parent)
         return parent->wrapper();
 
-    // The only object without a parent wrapper should be a scroll view.
+    // Mock objects can have their parents detached but still exist in the cache.
+    if (m_object->isDetachedFromParent())
+        return nil;
+    
+    // The only object without a parent wrapper at this point should be a scroll view.
     ASSERT(m_object->isAccessibilityScrollView());
     
     // Verify this is the top document. If not, we might need to go through the platform widget.