AX: Crash at -[WebAccessibilityObjectWrapperBase accessibilityTitle] + 31
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Jan 2015 15:29:09 +0000 (15:29 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Jan 2015 15:29:09 +0000 (15:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=140286

Reviewed by Mario Sanchez Prada.

This is crashing because AppKit is checking if certain method names like "accessibilityTitle" exist,
and then it bypasses accessibilityAttributeValue: to call directly into those methods.

That bypasses are safety checks. I think a safe way to avoid this is rename our methods.

No new tests, problem only occurs when triggered through AppKit.

* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper accessibilityLabel]):
(-[WebAccessibilityObjectWrapper accessibilityHint]):
* accessibility/mac/WebAccessibilityObjectWrapperBase.h:
* accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
(-[WebAccessibilityObjectWrapperBase baseAccessibilityTitle]):
(-[WebAccessibilityObjectWrapperBase baseAccessibilityDescription]):
(-[WebAccessibilityObjectWrapperBase baseAccessibilityHelpText]):
(-[WebAccessibilityObjectWrapperBase accessibilityTitle]): Deleted.
(-[WebAccessibilityObjectWrapperBase accessibilityDescription]): Deleted.
(-[WebAccessibilityObjectWrapperBase accessibilityHelpText]): Deleted.
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):

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

Source/WebCore/ChangeLog
Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

index 4e9678f..bd513ca 100644 (file)
@@ -1,3 +1,31 @@
+2015-01-09  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Crash at -[WebAccessibilityObjectWrapperBase accessibilityTitle] + 31
+        https://bugs.webkit.org/show_bug.cgi?id=140286
+
+        Reviewed by Mario Sanchez Prada.
+
+        This is crashing because AppKit is checking if certain method names like "accessibilityTitle" exist,
+        and then it bypasses accessibilityAttributeValue: to call directly into those methods.
+
+        That bypasses are safety checks. I think a safe way to avoid this is rename our methods.
+
+        No new tests, problem only occurs when triggered through AppKit.
+
+        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityLabel]):
+        (-[WebAccessibilityObjectWrapper accessibilityHint]):
+        * accessibility/mac/WebAccessibilityObjectWrapperBase.h:
+        * accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
+        (-[WebAccessibilityObjectWrapperBase baseAccessibilityTitle]):
+        (-[WebAccessibilityObjectWrapperBase baseAccessibilityDescription]):
+        (-[WebAccessibilityObjectWrapperBase baseAccessibilityHelpText]):
+        (-[WebAccessibilityObjectWrapperBase accessibilityTitle]): Deleted.
+        (-[WebAccessibilityObjectWrapperBase accessibilityDescription]): Deleted.
+        (-[WebAccessibilityObjectWrapperBase accessibilityHelpText]): Deleted.
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
 2015-01-06  Philippe Normand  <pnormand@igalia.com>
 
         [GStreamer][MSE] ASSERT in MediaSourceClientGStreamer::addSourceBuffer
index b2f379d..e59c5df 100644 (file)
@@ -780,8 +780,8 @@ static void appendStringToResult(NSMutableString *result, NSString *string)
 
     // iOS doesn't distinguish between a title and description field,
     // so concatentation will yield the best result.
-    NSString *axTitle = [self accessibilityTitle];
-    NSString *axDescription = [self accessibilityDescription];
+    NSString *axTitle = [self baseAccessibilityTitle];
+    NSString *axDescription = [self baseAccessibilityDescription];
     NSString *landmarkDescription = [self ariaLandmarkRoleDescription];
     
     NSMutableString *result = [NSMutableString string];
@@ -1011,7 +1011,7 @@ static void appendStringToResult(NSMutableString *result, NSString *string)
     if (![self _prepareAccessibilityCall])
         return nil;
 
-    return [self accessibilityHelpText];
+    return [self baseAccessibilityHelpText];
 }
 
 - (NSURL *)accessibilityURL
index f22a92c..5e06c35 100644 (file)
@@ -48,9 +48,10 @@ class VisiblePosition;
 - (WebCore::AccessibilityObject*)accessibilityObject;
 - (BOOL)updateObjectBackingStore;
 
-- (NSString *)accessibilityTitle;
-- (NSString *)accessibilityDescription;
-- (NSString *)accessibilityHelpText;
+// These are pre-fixed with base so that AppKit does not end up calling into these directly (bypassing safety checks).
+- (NSString *)baseAccessibilityTitle;
+- (NSString *)baseAccessibilityDescription;
+- (NSString *)baseAccessibilityHelpText;
 
 - (NSString *)ariaLandmarkRoleDescription;
 
index 1138b33..e1bf3dd 100644 (file)
@@ -147,7 +147,7 @@ static NSArray *convertMathPairsToNSArray(const AccessibilityObject::Accessibili
 
 // This should be the "visible" text that's actually on the screen if possible.
 // If there's alternative text, that can override the title.
-- (NSString *)accessibilityTitle
+- (NSString *)baseAccessibilityTitle
 {
     // Static text objects should not have a title. Its content is communicated in its AXValue.
     if (m_object->roleValue() == StaticTextRole)
@@ -180,7 +180,7 @@ static NSArray *convertMathPairsToNSArray(const AccessibilityObject::Accessibili
     return [NSString string];
 }
 
-- (NSString *)accessibilityDescription
+- (NSString *)baseAccessibilityDescription
 {
     // Static text objects should not have a description. Its content is communicated in its AXValue.
     // One exception is the media control labels that have a value and a description. Those are set programatically.
@@ -212,7 +212,7 @@ static NSArray *convertMathPairsToNSArray(const AccessibilityObject::Accessibili
     return [NSString string];
 }
 
-- (NSString *)accessibilityHelpText
+- (NSString *)baseAccessibilityHelpText
 {
     Vector<AccessibilityText> textOrder;
     m_object->accessibilityText(textOrder);
index 0999c92..8e2f88a 100644 (file)
@@ -2417,7 +2417,7 @@ static NSString* roleValueToNSString(AccessibilityRole value)
         if (m_object->isMeter())
             return [NSString string];
         
-        return [self accessibilityTitle];
+        return [self baseAccessibilityTitle];
     }
     
     if ([attributeName isEqualToString: NSAccessibilityDescriptionAttribute]) {
@@ -2425,7 +2425,7 @@ static NSString* roleValueToNSString(AccessibilityRole value)
             if ([[[self attachmentView] accessibilityAttributeNames] containsObject:NSAccessibilityDescriptionAttribute])
                 return [[self attachmentView] accessibilityAttributeValue:NSAccessibilityDescriptionAttribute];
         }
-        return [self accessibilityDescription];
+        return [self baseAccessibilityDescription];
     }
     
     if ([attributeName isEqualToString: NSAccessibilityValueAttribute]) {
@@ -2490,7 +2490,7 @@ static NSString* roleValueToNSString(AccessibilityRole value)
         return [NSNumber numberWithFloat:m_object->maxValueForRange()];
     
     if ([attributeName isEqualToString: NSAccessibilityHelpAttribute])
-        return [self accessibilityHelpText];
+        return [self baseAccessibilityHelpText];
     
     if ([attributeName isEqualToString: NSAccessibilityFocusedAttribute])
         return [NSNumber numberWithBool: m_object->isFocused()];
@@ -2794,7 +2794,7 @@ static NSString* roleValueToNSString(AccessibilityRole value)
     
     if ([attributeName isEqualToString:NSAccessibilityValueDescriptionAttribute]) {
         if (m_object->isMeter())
-            return [self accessibilityTitle];
+            return [self baseAccessibilityTitle];
         
         return m_object->valueDescription();
     }