Changeset 256347 in webkit
- Timestamp:
- Feb 11, 2020 1:33:41 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r256311 r256347 1 2020-02-11 Andres Gonzalez <andresg_22@apple.com> 2 3 Fix for crashes in WebAccessibilityObjectWrapper after notification updates in IsolatedTree mode. 4 https://bugs.webkit.org/show_bug.cgi?id=207558 5 6 Reviewed by Chris Fleizach. 7 8 - Accessibility methods invoked in the secondary thread that Return id 9 values retrieved from the main thread, need to retain/autorelease the 10 returned ids. 11 - When serving a request on the AX thread that requires retrieving a 12 value from the main thread, the backing obbject on the main thread may 13 have gone away, so need to check for nullity of the backing object also 14 on the main thread. 15 16 * accessibility/AccessibilityObjectInterface.h: 17 (WebCore::Accessibility::retrieveAutoreleasedValueFromMainThread): 18 * accessibility/mac/WebAccessibilityObjectWrapperMac.mm: 19 (-[WebAccessibilityObjectWrapper attachmentView]): 20 (-[WebAccessibilityObjectWrapper textMarkerRangeFromRange:]): 21 (-[WebAccessibilityObjectWrapper renderWidgetChildren]): 22 (-[WebAccessibilityObjectWrapper associatedPluginParent]): 23 (-[WebAccessibilityObjectWrapper scrollViewParent]): 24 (-[WebAccessibilityObjectWrapper windowElement:]): 25 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]): 26 1 27 2020-02-11 Zalan Bujtas <zalan@apple.com> 2 28 -
trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h
r255381 r256347 1208 1208 } 1209 1209 1210 #if PLATFORM(COCOA) 1211 template<typename T, typename U> inline T retrieveAutoreleasedValueFromMainThread(U&& lambda) 1212 { 1213 if (isMainThread()) 1214 return lambda().autorelease(); 1215 1216 RetainPtr<T> value; 1217 callOnMainThreadAndWait([&value, &lambda] { 1218 value = lambda(); 1219 }); 1220 return value.autorelease(); 1221 } 1222 #endif 1223 1210 1224 } // namespace Accessibility 1211 1225 -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
r255044 r256347 558 558 ASSERT(self.axBackingObject->isAttachment()); 559 559 560 return Accessibility::retrieve ValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{560 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 561 561 auto* widget = protectedSelf.get().axBackingObject->widgetForAttachmentView(); 562 562 if (!widget) … … 800 800 - (id)textMarkerRangeFromRange:(const RefPtr<Range>)range 801 801 { 802 return textMarkerRangeFromRange(self.axBackingObject->axObjectCache(), range); 802 if (auto* backingObject = self.axBackingObject) 803 return textMarkerRangeFromRange(backingObject->axObjectCache(), range); 804 return nil; 803 805 } 804 806 … … 1896 1898 { 1897 1899 return Accessibility::retrieveValueFromMainThread<NSArray *>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> NSArray * { 1898 Widget* widget = protectedSelf.get().axBackingObject->widget(); 1900 auto* backingObject = protectedSelf.get().axBackingObject; 1901 if (!backingObject) 1902 return nil; 1903 1904 Widget* widget = backingObject->widget(); 1899 1905 if (!widget) 1900 1906 return nil; … … 1948 1954 - (id)associatedPluginParent 1949 1955 { 1950 return Accessibility::retrieve ValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{1956 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 1951 1957 if (!protectedSelf.get().axBackingObject || !protectedSelf.get().axBackingObject->hasApplePDFAnnotationAttribute()) 1952 1958 return nil; … … 2299 2305 - (id)scrollViewParent 2300 2306 { 2301 return Accessibility::retrieve ValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{2307 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 2302 2308 if (!is<AccessibilityScrollView>(protectedSelf.get().axBackingObject)) 2303 2309 return nil; … … 2344 2350 - (id)windowElement:(NSString*)attributeName 2345 2351 { 2346 return Accessibility::retrieve ValueFromMainThread<id>([attributeName, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{2352 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([attributeName, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 2347 2353 id remoteParent = [protectedSelf remoteAccessibilityParentObject]; 2348 2354 if (remoteParent) { … … 2352 2358 } 2353 2359 2354 if (auto* fv = protectedSelf.get().axBackingObject->documentFrameView()) 2360 auto* backingObject = protectedSelf.get().axBackingObject; 2361 if (!backingObject) 2362 return nil; 2363 2364 if (auto* fv = backingObject->documentFrameView()) 2355 2365 return [fv->platformWidget() window]; 2356 2366 … … 3958 3968 3959 3969 if ([attribute isEqualToString:NSAccessibilityEndTextMarkerForBoundsParameterizedAttribute]) { 3960 return Accessibility::retrieve ValueFromMainThread<id>([&rect, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{3970 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&rect, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 3961 3971 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 3962 3972 if (!cache) … … 3970 3980 3971 3981 if ([attribute isEqualToString:NSAccessibilityStartTextMarkerForBoundsParameterizedAttribute]) { 3972 return Accessibility::retrieve ValueFromMainThread<id>([&rect, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{3982 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&rect, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 3973 3983 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 3974 3984 if (!cache) … … 4015 4025 4016 4026 if ([attribute isEqualToString:@"AXTextMarkerRangeForUIElement"]) { 4017 return Accessibility::retrieve ValueFromMainThread<id>([&uiElement, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4027 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&uiElement, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4018 4028 RefPtr<Range> range = uiElement.get()->elementRange(); 4019 4029 return [protectedSelf textMarkerRangeFromRange:range]; … … 4043 4053 return nil; 4044 4054 4045 return Accessibility::retrieve ValueFromMainThread<id>([&webCorePoint, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4055 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&webCorePoint, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4046 4056 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4047 4057 if (!cache) … … 4062 4072 if ([attribute isEqualToString:NSAccessibilityBoundsForRangeParameterizedAttribute]) { 4063 4073 NSRect rect = Accessibility::retrieveValueFromMainThread<NSRect>([&range, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> NSRect { 4064 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4074 auto* backingObject = protectedSelf.get().axBackingObject; 4075 if (!backingObject) 4076 return CGRectZero; 4077 4078 auto* cache = backingObject->axObjectCache(); 4065 4079 if (!cache) 4066 4080 return CGRectZero; 4067 4081 4068 CharacterOffset start = cache->characterOffsetForIndex(range.location, protectedSelf.get().axBackingObject);4069 CharacterOffset end = cache->characterOffsetForIndex(range.location+range.length, protectedSelf.get().axBackingObject);4082 CharacterOffset start = cache->characterOffsetForIndex(range.location, backingObject); 4083 CharacterOffset end = cache->characterOffsetForIndex(range.location+range.length, backingObject); 4070 4084 if (start.isNull() || end.isNull()) 4071 4085 return CGRectZero; 4072 4086 4073 4087 RefPtr<Range> range = cache->rangeForUnorderedCharacterOffsets(start, end); 4074 auto bounds = FloatRect( protectedSelf.get().axBackingObject->boundsForRange(range));4088 auto bounds = FloatRect(backingObject->boundsForRange(range)); 4075 4089 return [protectedSelf convertRectToSpace:bounds space:AccessibilityConversionSpace::Screen]; 4076 4090 }); … … 4128 4142 return nil; 4129 4143 4130 return Accessibility::retrieve ValueFromMainThread<id>([textMarker1, textMarker2, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4144 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker1, textMarker2, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4131 4145 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4132 4146 if (!cache) … … 4151 4165 4152 4166 if ([attribute isEqualToString:@"AXLeftWordTextMarkerRangeForTextMarker"]) { 4153 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4167 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4154 4168 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4155 4169 if (!cache) … … 4163 4177 4164 4178 if ([attribute isEqualToString:@"AXRightWordTextMarkerRangeForTextMarker"]) { 4165 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4179 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4166 4180 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4167 4181 if (!cache) … … 4187 4201 4188 4202 if ([attribute isEqualToString:@"AXSentenceTextMarkerRangeForTextMarker"]) { 4189 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4203 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4190 4204 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4191 4205 if (!cache) … … 4199 4213 4200 4214 if ([attribute isEqualToString:@"AXParagraphTextMarkerRangeForTextMarker"]) { 4201 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4215 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4202 4216 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4203 4217 if (!cache) … … 4211 4225 4212 4226 if ([attribute isEqualToString:@"AXNextWordEndTextMarkerForTextMarker"]) { 4213 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4227 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4214 4228 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4215 4229 if (!cache) … … 4223 4237 4224 4238 if ([attribute isEqualToString:@"AXPreviousWordStartTextMarkerForTextMarker"]) { 4225 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4239 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4226 4240 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4227 4241 if (!cache) … … 4245 4259 4246 4260 if ([attribute isEqualToString:@"AXNextSentenceEndTextMarkerForTextMarker"]) { 4247 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4261 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4248 4262 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4249 4263 if (!cache) … … 4257 4271 4258 4272 if ([attribute isEqualToString:@"AXPreviousSentenceStartTextMarkerForTextMarker"]) { 4259 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4273 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4260 4274 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4261 4275 if (!cache) … … 4269 4283 4270 4284 if ([attribute isEqualToString:@"AXNextParagraphEndTextMarkerForTextMarker"]) { 4271 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4285 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4272 4286 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4273 4287 if (!cache) … … 4281 4295 4282 4296 if ([attribute isEqualToString:@"AXPreviousParagraphStartTextMarkerForTextMarker"]) { 4283 return Accessibility::retrieve ValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> id{4297 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4284 4298 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4285 4299 if (!cache)
Note: See TracChangeset
for help on using the changeset viewer.