Changeset 258673 in webkit
- Timestamp:
- Mar 18, 2020 7:09:44 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r258666 r258673 1 2020-03-18 Andres Gonzalez <andresg_22@apple.com> 2 3 Several TextMarker attributes need to run on the main thread. 4 https://bugs.webkit.org/show_bug.cgi?id=209247 5 6 Reviewed by Chris Fleizach. 7 8 - Dispatch several TextMarker parameterized attributes to the main 9 thread. 10 - Added helper methods to return TextMarkers and TextMarkerRanges for 11 diffferent units of text such as word or sentence. 12 - Added a helper function, retainWrapper to make code a bit more 13 readable in lambda definitions. 14 15 * accessibility/mac/AXObjectCacheMac.mm: 16 (WebCore::textMarkerForVisiblePosition): 17 (WebCore::textMarkerRangeFromVisiblePositions): 18 * accessibility/mac/WebAccessibilityObjectWrapperMac.mm: 19 (retainWrapper): 20 (-[WebAccessibilityObjectWrapper attachmentView]): 21 (-[WebAccessibilityObjectWrapper doAXAttributedStringForTextMarkerRange:spellCheck:]): 22 (-[WebAccessibilityObjectWrapper textMarkerRangeFromVisiblePositions:endPosition:]): 23 (-[WebAccessibilityObjectWrapper associatedPluginParent]): 24 (-[WebAccessibilityObjectWrapper windowElement:]): 25 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]): 26 (-[WebAccessibilityObjectWrapper accessibilityShowContextMenu]): 27 (-[WebAccessibilityObjectWrapper textMarkerRangeAtTextMarker:forUnit:]): 28 (-[WebAccessibilityObjectWrapper lineTextMarkerRangeForTextMarker:forUnit:]): 29 (-[WebAccessibilityObjectWrapper textMarkerForTextMarker:atUnit:]): 30 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]): 31 1 32 2020-03-18 Zalan Bujtas <zalan@apple.com> 2 33 -
trunk/Source/WebCore/accessibility/mac/AXObjectCacheMac.mm
r258108 r258673 568 568 id textMarkerForVisiblePosition(AXObjectCache* cache, const VisiblePosition& visiblePos) 569 569 { 570 ASSERT(isMainThread()); 570 571 ASSERT(cache); 571 572 if (!cache) … … 581 582 id textMarkerRangeFromVisiblePositions(AXObjectCache* cache, const VisiblePosition& startPosition, const VisiblePosition& endPosition) 582 583 { 584 ASSERT(isMainThread()); 583 585 if (!cache) 584 586 return nil; -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
r258525 r258673 554 554 } 555 555 556 static inline RetainPtr<WebAccessibilityObjectWrapper> retainWrapper(WebAccessibilityObjectWrapper* wrapper) 557 { 558 return RetainPtr<WebAccessibilityObjectWrapper>(wrapper); 559 } 560 556 561 - (id)attachmentView 557 562 { 558 563 ASSERT(self.axBackingObject->isAttachment()); 559 564 560 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {565 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 561 566 auto* widget = protectedSelf.get().axBackingObject->widgetForAttachmentView(); 562 567 if (!widget) … … 1248 1253 - (NSAttributedString*)doAXAttributedStringForTextMarkerRange:(id)textMarkerRange spellCheck:(BOOL)spellCheck 1249 1254 { 1250 return Accessibility::retrieveValueFromMainThread<NSAttributedString *>([&textMarkerRange, &spellCheck, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> NSAttributedString * {1255 return Accessibility::retrieveValueFromMainThread<NSAttributedString *>([&textMarkerRange, &spellCheck, protectedSelf = retainWrapper(self)] () -> NSAttributedString * { 1251 1256 auto* backingObject = protectedSelf.get().axBackingObject; 1252 1257 if (!backingObject) … … 1294 1299 - (id)textMarkerRangeFromVisiblePositions:(const VisiblePosition&)startPosition endPosition:(const VisiblePosition&)endPosition 1295 1300 { 1296 auto* backingObject = self.axBackingObject; 1297 if (!backingObject) 1298 return nil; 1299 1300 return textMarkerRangeFromVisiblePositions(backingObject->axObjectCache(), startPosition, endPosition); 1301 return Accessibility::retrieveValueFromMainThread<NSAttributedString *>([&startPosition, &endPosition, protectedSelf = retainWrapper(self)] () -> id { 1302 auto* backingObject = protectedSelf.get().axBackingObject; 1303 if (!backingObject) 1304 return nil; 1305 1306 return textMarkerRangeFromVisiblePositions(backingObject->axObjectCache(), startPosition, endPosition); 1307 }); 1301 1308 } 1302 1309 … … 1913 1920 - (id)associatedPluginParent 1914 1921 { 1915 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {1922 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 1916 1923 auto* backingObject = protectedSelf.get().axBackingObject; 1917 1924 if (!backingObject || !backingObject->hasApplePDFAnnotationAttribute()) … … 2283 2290 - (id)windowElement:(NSString*)attributeName 2284 2291 { 2285 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([attributeName, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {2292 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([attributeName, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 2286 2293 id remoteParent = [protectedSelf remoteAccessibilityParentObject]; 2287 2294 if (remoteParent) { … … 2818 2825 2819 2826 if ([attributeName isEqualToString:@"AXSelectedTextMarkerRange"]) { 2820 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {2827 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 2821 2828 return [protectedSelf textMarkerRangeForSelection]; 2822 2829 }); … … 2824 2831 2825 2832 if ([attributeName isEqualToString:@"AXStartTextMarker"]) { 2826 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {2833 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 2827 2834 if (auto* backingObject = protectedSelf.get().axBackingObject) 2828 2835 return [protectedSelf textMarkerForVisiblePosition:startOfDocument(backingObject->document())]; … … 2832 2839 2833 2840 if ([attributeName isEqualToString:@"AXEndTextMarker"]) { 2834 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {2841 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 2835 2842 if (auto* backingObject = protectedSelf.get().axBackingObject) 2836 2843 return [protectedSelf textMarkerForVisiblePosition:endOfDocument(backingObject->document())]; … … 3400 3407 - (void)accessibilityShowContextMenu 3401 3408 { 3402 Accessibility::performFunctionOnMainThread([protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] {3409 Accessibility::performFunctionOnMainThread([protectedSelf = retainWrapper(self)] { 3403 3410 [protectedSelf _accessibilityShowContextMenu]; 3404 3411 }); … … 3757 3764 #endif 3758 3765 3766 enum class TextUnit { 3767 LeftWord = 1, 3768 RightWord, 3769 NextWordEnd, 3770 PreviousWordStart, 3771 Sentence, 3772 NextSentenceEnd, 3773 PreviousSentenceStart, 3774 Paragraph, 3775 NextParagraphEnd, 3776 PreviousParagraphStart, 3777 Line, 3778 LeftLine, 3779 RightLine, 3780 NextLineEnd, 3781 PreviousLineStart, 3782 }; 3783 3784 - (id)textMarkerRangeAtTextMarker:(id)textMarker forUnit:(TextUnit)textUnit 3785 { 3786 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, &textUnit, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 3787 auto* backingObject = protectedSelf.get().axBackingObject; 3788 if (!backingObject) 3789 return nil; 3790 3791 auto* cache = backingObject->axObjectCache(); 3792 if (!cache) 3793 return nil; 3794 3795 auto characterOffset = characterOffsetForTextMarker(cache, textMarker); 3796 RefPtr<Range> range; 3797 switch (textUnit) { 3798 case TextUnit::LeftWord: 3799 range = cache->leftWordRange(characterOffset); 3800 break; 3801 case TextUnit::RightWord: 3802 range = cache->rightWordRange(characterOffset); 3803 break; 3804 case TextUnit::Sentence: 3805 range = cache->sentenceForCharacterOffset(characterOffset); 3806 break; 3807 case TextUnit::Paragraph: 3808 range = cache->paragraphForCharacterOffset(characterOffset); 3809 break; 3810 default: 3811 ASSERT_NOT_REACHED(); 3812 break; 3813 } 3814 3815 return textMarkerRangeFromRange(cache, range); 3816 }); 3817 } 3818 3819 - (id)lineTextMarkerRangeForTextMarker:(id)textMarker forUnit:(TextUnit)textUnit 3820 { 3821 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, &textUnit, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 3822 auto* backingObject = protectedSelf.get().axBackingObject; 3823 if (!backingObject) 3824 return nil; 3825 3826 auto* cache = backingObject->axObjectCache(); 3827 if (!cache) 3828 return nil; 3829 3830 auto visiblePosition = visiblePositionForTextMarker(cache, textMarker); 3831 VisiblePositionRange visiblePositionRange; 3832 switch (textUnit) { 3833 case TextUnit::Line: 3834 visiblePositionRange = backingObject->lineRangeForPosition(visiblePosition); 3835 break; 3836 case TextUnit::LeftLine: 3837 visiblePositionRange = backingObject->leftLineVisiblePositionRange(visiblePosition); 3838 break; 3839 case TextUnit::RightLine: 3840 visiblePositionRange = backingObject->rightLineVisiblePositionRange(visiblePosition); 3841 break; 3842 default: 3843 ASSERT_NOT_REACHED(); 3844 break; 3845 } 3846 3847 return textMarkerRangeFromVisiblePositions(backingObject->axObjectCache(), visiblePositionRange.start, visiblePositionRange.end); 3848 }); 3849 } 3850 3851 - (id)textMarkerForTextMarker:(id)textMarker atUnit:(TextUnit)textUnit 3852 { 3853 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, &textUnit, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 3854 auto* backingObject = protectedSelf.get().axBackingObject; 3855 if (!backingObject) 3856 return nil; 3857 3858 auto* cache = backingObject->axObjectCache(); 3859 if (!cache) 3860 return nil; 3861 3862 CharacterOffset oldOffset = characterOffsetForTextMarker(cache, textMarker); 3863 CharacterOffset newOffset; 3864 switch (textUnit) { 3865 case TextUnit::NextWordEnd: 3866 newOffset = cache->nextWordEndCharacterOffset(oldOffset); 3867 break; 3868 case TextUnit::PreviousWordStart: 3869 newOffset = cache->previousWordStartCharacterOffset(oldOffset); 3870 break; 3871 case TextUnit::NextSentenceEnd: 3872 newOffset = cache->nextSentenceEndCharacterOffset(oldOffset); 3873 break; 3874 case TextUnit::PreviousSentenceStart: 3875 newOffset = cache->previousSentenceStartCharacterOffset(oldOffset); 3876 break; 3877 case TextUnit::NextParagraphEnd: 3878 newOffset = cache->nextParagraphEndCharacterOffset(oldOffset); 3879 break; 3880 case TextUnit::PreviousParagraphStart: 3881 newOffset = cache->previousParagraphStartCharacterOffset(oldOffset); 3882 break; 3883 case TextUnit::NextLineEnd: { 3884 auto visiblePosition = visiblePositionForTextMarker(cache, textMarker); 3885 return textMarkerForVisiblePosition(cache, backingObject->nextLineEndPosition(visiblePosition)); 3886 } 3887 case TextUnit::PreviousLineStart: { 3888 auto visiblePosition = visiblePositionForTextMarker(cache, textMarker); 3889 return textMarkerForVisiblePosition(cache, backingObject->previousLineStartPosition(visiblePosition)); 3890 } 3891 default: 3892 ASSERT_NOT_REACHED(); 3893 break; 3894 } 3895 3896 return textMarkerForCharacterOffset(cache, newOffset); 3897 }); 3898 } 3899 3759 3900 ALLOW_DEPRECATED_IMPLEMENTATIONS_BEGIN 3760 3901 - (id)accessibilityAttributeValue:(NSString*)attribute forParameter:(id)parameter … … 3812 3953 if ([attribute isEqualToString:NSAccessibilitySelectTextWithCriteriaParameterizedAttribute]) { 3813 3954 // To be deprecated. 3814 auto result = Accessibility::retrieveValueFromMainThread<Vector<String>>([dictionary, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> Vector<String> {3955 auto result = Accessibility::retrieveValueFromMainThread<Vector<String>>([dictionary, protectedSelf = retainWrapper(self)] () -> Vector<String> { 3815 3956 auto* backingObject = protectedSelf.get().axBackingObject; 3816 3957 if (!backingObject) … … 3830 3971 if ([attribute isEqualToString:NSAccessibilitySearchTextWithCriteriaParameterizedAttribute]) { 3831 3972 auto criteria = accessibilitySearchTextCriteriaForParameterizedAttribute(dictionary); 3832 return Accessibility::retrieve ValueFromMainThread<NSArray *>([&criteria, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> NSArray *{3973 return Accessibility::retrieveAutoreleasedValueFromMainThread<NSArray *>([&criteria, protectedSelf = retainWrapper(self)] () -> RetainPtr<NSArray> { 3833 3974 auto* backingObject = protectedSelf.get().axBackingObject; 3834 3975 if (!backingObject) … … 3848 3989 3849 3990 if ([attribute isEqualToString:NSAccessibilityTextOperationParameterizedAttribute]) { 3850 auto operationResult = Accessibility::retrieveValueFromMainThread<Vector<String>>([dictionary, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> Vector<String> {3991 auto operationResult = Accessibility::retrieveValueFromMainThread<Vector<String>>([dictionary, protectedSelf = retainWrapper(self)] () -> Vector<String> { 3851 3992 auto* backingObject = protectedSelf.get().axBackingObject; 3852 3993 if (!backingObject) … … 3879 4020 3880 4021 if ([attribute isEqualToString:NSAccessibilityEndTextMarkerForBoundsParameterizedAttribute]) { 3881 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&rect, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 3882 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4022 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&rect, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4023 auto* backingObject = protectedSelf.get().axBackingObject; 4024 if (!backingObject) 4025 return nil; 4026 4027 auto* cache = backingObject->axObjectCache(); 3883 4028 if (!cache) 3884 4029 return nil; … … 3891 4036 3892 4037 if ([attribute isEqualToString:NSAccessibilityStartTextMarkerForBoundsParameterizedAttribute]) { 3893 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&rect, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 3894 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4038 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&rect, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4039 auto* backingObject = protectedSelf.get().axBackingObject; 4040 if (!backingObject) 4041 return nil; 4042 4043 auto* cache = backingObject->axObjectCache(); 3895 4044 if (!cache) 3896 4045 return nil; … … 3902 4051 } 3903 4052 3904 if ([attribute isEqualToString:NSAccessibilityLineTextMarkerRangeForTextMarkerParameterizedAttribute]) { 3905 VisiblePosition visiblePosition = [self visiblePositionForTextMarker:textMarker]; 3906 VisiblePositionRange visiblePositionRange = backingObject->lineRangeForPosition(visiblePosition); 3907 return [self textMarkerRangeFromVisiblePositions:visiblePositionRange.start endPosition:visiblePositionRange.end]; 3908 } 4053 if ([attribute isEqualToString:NSAccessibilityLineTextMarkerRangeForTextMarkerParameterizedAttribute]) 4054 return [self lineTextMarkerRangeForTextMarker:textMarker forUnit:TextUnit::Line]; 3909 4055 3910 4056 if ([attribute isEqualToString:NSAccessibilityMisspellingTextMarkerRangeParameterizedAttribute]) { 3911 4057 auto criteria = accessibilityMisspellingSearchCriteriaForParameterizedAttribute(self, dictionary); 3912 if (auto misspellingRange = backingObject->getMisspellingRange(criteria.first, criteria.second)) 3913 return [self textMarkerRangeFromRange:misspellingRange]; 3914 return nil; 4058 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&criteria, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4059 auto* backingObject = protectedSelf.get().axBackingObject; 4060 if (!backingObject) 4061 return nil; 4062 4063 if (auto misspellingRange = backingObject->getMisspellingRange(criteria.first, criteria.second)) 4064 return [protectedSelf textMarkerRangeFromRange:misspellingRange]; 4065 return nil; 4066 }); 3915 4067 } 3916 4068 3917 4069 if ([attribute isEqualToString:NSAccessibilityTextMarkerIsValidParameterizedAttribute]) { 3918 VisiblePosition pos = [self visiblePositionForTextMarker:textMarker]; 3919 return [NSNumber numberWithBool:!pos.isNull()]; 3920 } 4070 bool result = Accessibility::retrieveValueFromMainThread<bool>([&textMarker, protectedSelf = retainWrapper(self)] () -> bool { 4071 VisiblePosition pos = [protectedSelf visiblePositionForTextMarker:textMarker]; 4072 return !pos.isNull(); 4073 }); 4074 return [NSNumber numberWithBool:result]; 4075 } 4076 3921 4077 if ([attribute isEqualToString:NSAccessibilityIndexForTextMarkerParameterizedAttribute]) { 3922 return [NSNumber numberWithInteger:[self _indexForTextMarker:textMarker]]; 3923 } 4078 auto result = Accessibility::retrieveValueFromMainThread<NSInteger>([&textMarker, protectedSelf = retainWrapper(self)] () -> NSInteger { 4079 return [protectedSelf _indexForTextMarker:textMarker]; 4080 }); 4081 return [NSNumber numberWithInteger:result]; 4082 } 4083 3924 4084 if ([attribute isEqualToString:NSAccessibilityTextMarkerForIndexParameterizedAttribute]) { 3925 return [self _textMarkerForIndex:[number integerValue]]; 4085 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&number, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4086 return [protectedSelf _textMarkerForIndex:[number integerValue]]; 4087 }); 3926 4088 } 3927 4089 3928 4090 if ([attribute isEqualToString:@"AXUIElementForTextMarker"]) { 3929 AccessibilityObject* axObject = [self accessibilityObjectForTextMarker:textMarker]; 3930 if (!axObject) 3931 return nil; 3932 if (axObject->isAttachment() && [axObject->wrapper() attachmentView]) 3933 return [axObject->wrapper() attachmentView]; 3934 return axObject->wrapper(); 4091 // FIXME: we need to return an IsolatedObject if this is called on the AX thread. 4092 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4093 auto* axObject = [protectedSelf accessibilityObjectForTextMarker:textMarker]; 4094 if (!axObject) 4095 return nil; 4096 if (axObject->isAttachment() && [axObject->wrapper() attachmentView]) 4097 return [axObject->wrapper() attachmentView]; 4098 return axObject->wrapper(); 4099 }); 3935 4100 } 3936 4101 3937 4102 if ([attribute isEqualToString:@"AXTextMarkerRangeForUIElement"]) { 3938 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&uiElement, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4103 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&uiElement, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 3939 4104 RefPtr<Range> range = uiElement.get()->elementRange(); 3940 4105 return [protectedSelf textMarkerRangeFromRange:range]; … … 3943 4108 3944 4109 if ([attribute isEqualToString:@"AXLineForTextMarker"]) { 3945 VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)]; 3946 return [NSNumber numberWithUnsignedInt:backingObject->lineForPosition(visiblePos)]; 4110 int result = Accessibility::retrieveValueFromMainThread<int>([&textMarker, protectedSelf = retainWrapper(self)] () -> int { 4111 auto* backingObject = protectedSelf.get().axBackingObject; 4112 if (!backingObject) 4113 return -1; 4114 4115 VisiblePosition visiblePos = [protectedSelf visiblePositionForTextMarker:textMarker]; 4116 return backingObject->lineForPosition(visiblePos); 4117 }); 4118 return [NSNumber numberWithInt:result]; 3947 4119 } 3948 4120 3949 4121 if ([attribute isEqualToString:@"AXTextMarkerRangeForLine"]) { 3950 VisiblePositionRange vpRange; 3951 if ([number unsignedIntegerValue] != NSNotFound) 3952 vpRange = backingObject->visiblePositionRangeForLine([number unsignedIntValue]); 3953 return [self textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end]; 4122 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&number, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4123 auto* backingObject = protectedSelf.get().axBackingObject; 4124 VisiblePositionRange vpRange; 4125 if (backingObject && [number unsignedIntegerValue] != NSNotFound) 4126 vpRange = backingObject->visiblePositionRangeForLine([number unsignedIntValue]); 4127 return [protectedSelf textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end]; 4128 }); 3954 4129 } 3955 4130 3956 4131 if ([attribute isEqualToString:@"AXStringForTextMarkerRange"]) { 3957 return Accessibility::retrieveValueFromMainThread<String>([&textMarkerRange, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> String {4132 return Accessibility::retrieveValueFromMainThread<String>([&textMarkerRange, protectedSelf = retainWrapper(self)] () -> String { 3958 4133 RefPtr<Range> range = [protectedSelf rangeForTextMarkerRange:textMarkerRange]; 3959 4134 auto* backingObject = protectedSelf.get().axBackingObject; … … 3967 4142 return nil; 3968 4143 3969 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&webCorePoint, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 3970 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4144 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&webCorePoint, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4145 auto* backingObject = protectedSelf.get().axBackingObject; 4146 if (!backingObject) 4147 return nil; 4148 4149 auto* cache = backingObject->axObjectCache(); 3971 4150 if (!cache) 3972 4151 return nil; 3973 4152 3974 CharacterOffset characterOffset = cache->characterOffsetForPoint(webCorePoint, protectedSelf.get().axBackingObject);4153 CharacterOffset characterOffset = cache->characterOffsetForPoint(webCorePoint, backingObject); 3975 4154 return [protectedSelf textMarkerForCharacterOffset:characterOffset]; 3976 4155 }); … … 3978 4157 3979 4158 if ([attribute isEqualToString:@"AXBoundsForTextMarkerRange"]) { 3980 RefPtr<Range> range = [self rangeForTextMarkerRange:textMarkerRange]; 3981 auto bounds = FloatRect(backingObject->boundsForRange(range)); 3982 NSRect rect = [self convertRectToSpace:bounds space:AccessibilityConversionSpace::Screen]; 4159 NSRect rect = Accessibility::retrieveValueFromMainThread<NSRect>([&textMarkerRange, protectedSelf = retainWrapper(self)] () -> NSRect { 4160 auto* backingObject = protectedSelf.get().axBackingObject; 4161 if (!backingObject) 4162 return CGRectZero; 4163 4164 RefPtr<Range> range = [protectedSelf rangeForTextMarkerRange:textMarkerRange]; 4165 auto bounds = FloatRect(backingObject->boundsForRange(range)); 4166 return [protectedSelf convertRectToSpace:bounds space:AccessibilityConversionSpace::Screen]; 4167 }); 3983 4168 return [NSValue valueWithRect:rect]; 3984 4169 } 3985 4170 3986 4171 if ([attribute isEqualToString:NSAccessibilityBoundsForRangeParameterizedAttribute]) { 3987 NSRect rect = Accessibility::retrieveValueFromMainThread<NSRect>([&range, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> NSRect {4172 NSRect rect = Accessibility::retrieveValueFromMainThread<NSRect>([&range, protectedSelf = retainWrapper(self)] () -> NSRect { 3988 4173 auto* backingObject = protectedSelf.get().axBackingObject; 3989 4174 if (!backingObject) … … 4012 4197 } 4013 4198 4014 return Accessibility::retrieveValueFromMainThread<NSString *>([&range, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> NSString * { 4015 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4199 return Accessibility::retrieveValueFromMainThread<String>([&range, protectedSelf = retainWrapper(self)] () -> String { 4200 auto* backingObject = protectedSelf.get().axBackingObject; 4201 if (!backingObject) 4202 return String(); 4203 4204 auto* cache = backingObject->axObjectCache(); 4016 4205 if (!cache) 4017 return nil;4018 4019 CharacterOffset start = cache->characterOffsetForIndex(range.location, protectedSelf.get().axBackingObject);4020 CharacterOffset end = cache->characterOffsetForIndex(range.location + range.length, protectedSelf.get().axBackingObject);4206 return String(); 4207 4208 CharacterOffset start = cache->characterOffsetForIndex(range.location, backingObject); 4209 CharacterOffset end = cache->characterOffsetForIndex(range.location + range.length, backingObject); 4021 4210 if (start.isNull() || end.isNull()) 4022 return nil;4211 return String(); 4023 4212 4024 4213 RefPtr<Range> range = cache->rangeForUnorderedCharacterOffsets(start, end); 4025 return protectedSelf.get().axBackingObject->stringForRange(range);4214 return backingObject->stringForRange(range); 4026 4215 }); 4027 4216 } … … 4056 4245 return nil; 4057 4246 4058 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker1, textMarker2, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4059 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4247 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker1, &textMarker2, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4248 auto* backingObject = protectedSelf.get().axBackingObject; 4249 if (!backingObject) 4250 return nil; 4251 4252 auto* cache = backingObject->axObjectCache(); 4060 4253 if (!cache) 4061 4254 return nil; … … 4069 4262 4070 4263 if ([attribute isEqualToString:@"AXNextTextMarkerForTextMarker"]) { 4071 CharacterOffset characterOffset = [self characterOffsetForTextMarker:textMarker]; 4072 return [self nextTextMarkerForCharacterOffset:characterOffset]; 4264 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4265 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker]; 4266 return [protectedSelf nextTextMarkerForCharacterOffset:characterOffset]; 4267 }); 4073 4268 } 4074 4269 4075 4270 if ([attribute isEqualToString:@"AXPreviousTextMarkerForTextMarker"]) { 4076 CharacterOffset characterOffset = [self characterOffsetForTextMarker:textMarker]; 4077 return [self previousTextMarkerForCharacterOffset:characterOffset]; 4078 } 4079 4080 if ([attribute isEqualToString:@"AXLeftWordTextMarkerRangeForTextMarker"]) { 4081 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4082 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4271 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4272 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker]; 4273 return [protectedSelf previousTextMarkerForCharacterOffset:characterOffset]; 4274 }); 4275 } 4276 4277 if ([attribute isEqualToString:@"AXLeftWordTextMarkerRangeForTextMarker"]) 4278 return [self textMarkerRangeAtTextMarker:textMarker forUnit:TextUnit::LeftWord]; 4279 4280 if ([attribute isEqualToString:@"AXRightWordTextMarkerRangeForTextMarker"]) 4281 return [self textMarkerRangeAtTextMarker:textMarker forUnit:TextUnit::RightWord]; 4282 4283 if ([attribute isEqualToString:@"AXLeftLineTextMarkerRangeForTextMarker"]) 4284 return [self lineTextMarkerRangeForTextMarker:textMarker forUnit:TextUnit::LeftLine]; 4285 4286 if ([attribute isEqualToString:@"AXRightLineTextMarkerRangeForTextMarker"]) 4287 return [self lineTextMarkerRangeForTextMarker:textMarker forUnit:TextUnit::RightLine]; 4288 4289 if ([attribute isEqualToString:@"AXSentenceTextMarkerRangeForTextMarker"]) 4290 return [self textMarkerRangeAtTextMarker:textMarker forUnit:TextUnit::Sentence]; 4291 4292 if ([attribute isEqualToString:@"AXParagraphTextMarkerRangeForTextMarker"]) 4293 return [self textMarkerRangeAtTextMarker:textMarker forUnit:TextUnit::Paragraph]; 4294 4295 if ([attribute isEqualToString:@"AXNextWordEndTextMarkerForTextMarker"]) 4296 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::NextWordEnd]; 4297 4298 if ([attribute isEqualToString:@"AXPreviousWordStartTextMarkerForTextMarker"]) 4299 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::PreviousWordStart]; 4300 4301 if ([attribute isEqualToString:@"AXNextLineEndTextMarkerForTextMarker"]) 4302 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::NextLineEnd]; 4303 4304 if ([attribute isEqualToString:@"AXPreviousLineStartTextMarkerForTextMarker"]) 4305 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::PreviousLineStart]; 4306 4307 if ([attribute isEqualToString:@"AXNextSentenceEndTextMarkerForTextMarker"]) 4308 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::NextSentenceEnd]; 4309 4310 if ([attribute isEqualToString:@"AXPreviousSentenceStartTextMarkerForTextMarker"]) 4311 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::PreviousSentenceStart]; 4312 4313 if ([attribute isEqualToString:@"AXNextParagraphEndTextMarkerForTextMarker"]) 4314 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::NextParagraphEnd]; 4315 4316 if ([attribute isEqualToString:@"AXPreviousParagraphStartTextMarkerForTextMarker"]) 4317 return [self textMarkerForTextMarker:textMarker atUnit:TextUnit::PreviousParagraphStart]; 4318 4319 if ([attribute isEqualToString:@"AXStyleTextMarkerRangeForTextMarker"]) { 4320 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarker, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4321 auto* backingObject = protectedSelf.get().axBackingObject; 4322 if (!backingObject) 4323 return nil; 4324 4325 auto* cache = backingObject->axObjectCache(); 4083 4326 if (!cache) 4084 4327 return nil; 4085 4328 4086 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4087 RefPtr<Range> range = cache->leftWordRange(characterOffset);4088 return [protectedSelf textMarkerRangeFromRange:range];4329 VisiblePosition visiblePos = visiblePositionForTextMarker(cache, textMarker); 4330 VisiblePositionRange vpRange = backingObject->styleRangeForPosition(visiblePos); 4331 return [protectedSelf textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end]; 4089 4332 }); 4090 4333 } 4091 4334 4092 if ([attribute isEqualToString:@"AXRightWordTextMarkerRangeForTextMarker"]) { 4093 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> { 4094 auto* cache = protectedSelf.get().axBackingObject->axObjectCache(); 4095 if (!cache) 4096 return nil; 4097 4098 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker]; 4099 RefPtr<Range> range = cache->rightWordRange(characterOffset); 4100 return [protectedSelf textMarkerRangeFromRange:range]; 4335 if ([attribute isEqualToString:@"AXLengthForTextMarkerRange"]) { 4336 int length = Accessibility::retrieveValueFromMainThread<int>([&textMarkerRange, protectedSelf = retainWrapper(self)] () -> int { 4337 auto* backingObject = protectedSelf.get().axBackingObject; 4338 if (!backingObject) 4339 return 0; 4340 4341 RefPtr<Range> range = [protectedSelf rangeForTextMarkerRange:textMarkerRange]; 4342 return AXObjectCache::lengthForRange(range.get()); 4101 4343 }); 4102 }4103 4104 if ([attribute isEqualToString:@"AXLeftLineTextMarkerRangeForTextMarker"]) {4105 VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];4106 VisiblePositionRange vpRange = backingObject->leftLineVisiblePositionRange(visiblePos);4107 return [self textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end];4108 }4109 4110 if ([attribute isEqualToString:@"AXRightLineTextMarkerRangeForTextMarker"]) {4111 VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];4112 VisiblePositionRange vpRange = backingObject->rightLineVisiblePositionRange(visiblePos);4113 return [self textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end];4114 }4115 4116 if ([attribute isEqualToString:@"AXSentenceTextMarkerRangeForTextMarker"]) {4117 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4118 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4119 if (!cache)4120 return nil;4121 4122 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4123 RefPtr<Range> range = cache->sentenceForCharacterOffset(characterOffset);4124 return [protectedSelf textMarkerRangeFromRange:range];4125 });4126 }4127 4128 if ([attribute isEqualToString:@"AXParagraphTextMarkerRangeForTextMarker"]) {4129 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4130 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4131 if (!cache)4132 return nil;4133 4134 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4135 RefPtr<Range> range = cache->paragraphForCharacterOffset(characterOffset);4136 return [protectedSelf textMarkerRangeFromRange:range];4137 });4138 }4139 4140 if ([attribute isEqualToString:@"AXNextWordEndTextMarkerForTextMarker"]) {4141 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4142 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4143 if (!cache)4144 return nil;4145 4146 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4147 CharacterOffset nextEnd = cache->nextWordEndCharacterOffset(characterOffset);4148 return [protectedSelf textMarkerForCharacterOffset:nextEnd];4149 });4150 }4151 4152 if ([attribute isEqualToString:@"AXPreviousWordStartTextMarkerForTextMarker"]) {4153 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4154 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4155 if (!cache)4156 return nil;4157 4158 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4159 CharacterOffset previousStart = cache->previousWordStartCharacterOffset(characterOffset);4160 return [protectedSelf textMarkerForCharacterOffset:previousStart];4161 });4162 }4163 4164 if ([attribute isEqualToString:@"AXNextLineEndTextMarkerForTextMarker"]) {4165 VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];4166 return [self textMarkerForVisiblePosition:backingObject->nextLineEndPosition(visiblePos)];4167 }4168 4169 if ([attribute isEqualToString:@"AXPreviousLineStartTextMarkerForTextMarker"]) {4170 VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];4171 return [self textMarkerForVisiblePosition:backingObject->previousLineStartPosition(visiblePos)];4172 }4173 4174 if ([attribute isEqualToString:@"AXNextSentenceEndTextMarkerForTextMarker"]) {4175 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4176 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4177 if (!cache)4178 return nil;4179 4180 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4181 CharacterOffset nextEnd = cache->nextSentenceEndCharacterOffset(characterOffset);4182 return [protectedSelf textMarkerForCharacterOffset:nextEnd];4183 });4184 }4185 4186 if ([attribute isEqualToString:@"AXPreviousSentenceStartTextMarkerForTextMarker"]) {4187 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4188 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4189 if (!cache)4190 return nil;4191 4192 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4193 CharacterOffset previousStart = cache->previousSentenceStartCharacterOffset(characterOffset);4194 return [protectedSelf textMarkerForCharacterOffset:previousStart];4195 });4196 }4197 4198 if ([attribute isEqualToString:@"AXNextParagraphEndTextMarkerForTextMarker"]) {4199 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4200 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4201 if (!cache)4202 return nil;4203 4204 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4205 CharacterOffset nextEnd = cache->nextParagraphEndCharacterOffset(characterOffset);4206 return [protectedSelf textMarkerForCharacterOffset:nextEnd];4207 });4208 }4209 4210 if ([attribute isEqualToString:@"AXPreviousParagraphStartTextMarkerForTextMarker"]) {4211 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([textMarker, protectedSelf = RetainPtr<WebAccessibilityObjectWrapper>(self)] () -> RetainPtr<id> {4212 auto* cache = protectedSelf.get().axBackingObject->axObjectCache();4213 if (!cache)4214 return nil;4215 4216 CharacterOffset characterOffset = [protectedSelf characterOffsetForTextMarker:textMarker];4217 CharacterOffset previousStart = cache->previousParagraphStartCharacterOffset(characterOffset);4218 return [protectedSelf textMarkerForCharacterOffset:previousStart];4219 });4220 }4221 4222 if ([attribute isEqualToString:@"AXStyleTextMarkerRangeForTextMarker"]) {4223 VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];4224 VisiblePositionRange vpRange = backingObject->styleRangeForPosition(visiblePos);4225 return [self textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end];4226 }4227 4228 if ([attribute isEqualToString:@"AXLengthForTextMarkerRange"]) {4229 RefPtr<Range> range = [self rangeForTextMarkerRange:textMarkerRange];4230 int length = AXObjectCache::lengthForRange(range.get());4231 4344 if (length < 0) 4232 4345 return nil; … … 4236 4349 // Used only by DumpRenderTree (so far). 4237 4350 if ([attribute isEqualToString:@"AXStartTextMarkerForTextMarkerRange"]) { 4238 RefPtr<Range> range = [self rangeForTextMarkerRange:textMarkerRange]; 4239 return [self startOrEndTextMarkerForRange:range isStart:YES]; 4351 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarkerRange, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4352 RefPtr<Range> range = [protectedSelf rangeForTextMarkerRange:textMarkerRange]; 4353 return [protectedSelf startOrEndTextMarkerForRange:range isStart:YES]; 4354 }); 4240 4355 } 4241 4356 4242 4357 if ([attribute isEqualToString:@"AXEndTextMarkerForTextMarkerRange"]) { 4243 RefPtr<Range> range = [self rangeForTextMarkerRange:textMarkerRange]; 4244 return [self startOrEndTextMarkerForRange:range isStart:NO]; 4358 return Accessibility::retrieveAutoreleasedValueFromMainThread<id>([&textMarkerRange, protectedSelf = retainWrapper(self)] () -> RetainPtr<id> { 4359 RefPtr<Range> range = [protectedSelf rangeForTextMarkerRange:textMarkerRange]; 4360 return [protectedSelf startOrEndTextMarkerForRange:range isStart:NO]; 4361 }); 4245 4362 } 4246 4363
Note: See TracChangeset
for help on using the changeset viewer.