Changeset 286116 in webkit
- Timestamp:
- Nov 22, 2021, 12:34:19 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 15 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/accessibility/visible-character-range.html (added)
-
LayoutTests/platform/ios/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/ios/accessibility/visible-character-range-expected.txt (added)
-
LayoutTests/platform/mac-wk1/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/mac/accessibility/visible-character-range-expected.txt (added)
-
LayoutTests/platform/win/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/accessibility/AccessibilityObject.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/AccessibilityObject.h (modified) (2 diffs)
-
Source/WebCore/accessibility/AccessibilityObjectInterface.h (modified) (2 diffs)
-
Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (modified) (10 diffs)
-
Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp (modified) (2 diffs)
-
Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h (modified) (1 diff)
-
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h (modified) (2 diffs)
-
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm (modified) (4 diffs)
-
Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (modified) (23 diffs)
-
Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r286113 r286116 1 2021-11-22 Chris Fleizach <cfleizach@apple.com> 2 3 AX: WebKit: need a method to get visible text and frame of an element on screen 4 https://bugs.webkit.org/show_bug.cgi?id=233336 5 6 Reviewed by Andres Gonzalez. 7 8 * accessibility/ios-simulator/visible-character-range-expected.txt: Added. 9 * accessibility/visible-character-range-expected.txt: Added. 10 * accessibility/visible-character-range.html: Added. 11 * platform/ios/TestExpectations: 12 * platform/mac-wk1/TestExpectations: 13 * platform/win/TestExpectations: 14 1 15 2021-11-22 Antti Koivisto <antti@apple.com> 2 16 -
trunk/LayoutTests/platform/ios/TestExpectations
r286063 r286116 2119 2119 2120 2120 accessibility/video-element-url-attribute.html [ Pass ] 2121 2121 accessibility/visible-character-range.html [ Pass ] 2122 2122 accessibility/ancestor-computation.html [ Pass ] 2123 2123 -
trunk/LayoutTests/platform/mac-wk1/TestExpectations
r285993 r286116 602 602 editing/spelling/spelling-unified-emulation.html [ Failure ] 603 603 604 # Skip due to lack of DumpRenderTree `AccessibilityUIElement::stringDescriptionOfAttributeValue` implementation. 605 accessibility/visible-character-range.html [ Skip ] 606 604 607 # <rdar://problem/26050923> The result is probably still a pass, but we don't have a way 605 608 # to have platform specific results that are different between WK1 and WK2. -
trunk/LayoutTests/platform/win/TestExpectations
r285998 r286116 279 279 accessibility/embedded-image-description.html [ Skip ] 280 280 accessibility/img-no-alt-not-ignored-with-title.html [ Skip ] 281 accessibility/visible-character-range.html [ Skip ] 281 282 282 283 # Need to implement AccessibilityUIElement::hasDocumentRoleAncestor(), AccessibilityUIElement::hasWebApplicationAncestor(), -
trunk/Source/WebCore/ChangeLog
r286115 r286116 1 2021-11-22 Chris Fleizach <cfleizach@apple.com> 2 3 AX: WebKit: need a method to get visible text and frame of an element on screen 4 https://bugs.webkit.org/show_bug.cgi?id=233336 5 6 Reviewed by Andres Gonzalez. 7 8 Implement visibleCharacterRange for static text elements so that Books can determine the visible 9 content on a page. 10 11 Test: accessibility/visible-character-range.html 12 13 * accessibility/AccessibilityObject.cpp: 14 (WebCore::AccessibilityObject::visibleCharacterRange const): 15 (WebCore::AccessibilityObject::unobscuredContentRect const): 16 * accessibility/AccessibilityObject.h: 17 * accessibility/AccessibilityObjectInterface.h: 18 * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm: 19 (-[WebAccessibilityObjectWrapper accessibilityVisibleContentRect]): 20 (accessibleElementsForObjects): 21 (-[WebAccessibilityObjectWrapper accessibilityFindMatchingObjects:]): 22 (-[WebAccessibilityObjectWrapper positionForTextMarker:]): 23 (-[WebAccessibilityObjectWrapper textMarkerForPosition:]): 24 (-[WebAccessibilityObjectWrapper stringForRange:]): 25 (-[WebAccessibilityObjectWrapper frameForRange:]): 26 (-[WebAccessibilityObjectWrapper accessibilityMathRadicand]): 27 (-[WebAccessibilityObjectWrapper _convertToNSRange:]): Deleted. 28 (-[WebAccessibilityObjectWrapper _convertToDOMRange:]): Deleted. 29 * accessibility/isolatedtree/AXIsolatedObject.cpp: 30 (WebCore::AXIsolatedObject::visibleCharacterRange const): 31 (WebCore::AXIsolatedObject::unobscuredContentRect const): 32 * accessibility/isolatedtree/AXIsolatedObject.h: 33 * accessibility/mac/WebAccessibilityObjectWrapperBase.h: 34 * accessibility/mac/WebAccessibilityObjectWrapperBase.mm: 35 (makeNSArray): 36 (-[WebAccessibilityObjectWrapperBase accessibilityVisibleCharacterRange]): 37 (makeNSRange): 38 (makeDOMRange): 39 (-[WebAccessibilityObjectWrapperBase baseUpdateBackingStore]): 40 (-[WebAccessibilityObjectWrapperBase lineRectsAndText]): 41 (convertToNSArray): Deleted. 42 * accessibility/mac/WebAccessibilityObjectWrapperMac.mm: 43 (-[WebAccessibilityObjectWrapper childrenVectorArray]): 44 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]): 45 (-[WebAccessibilityObjectWrapper _indexForTextMarker:]): 46 (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]): 47 (-[WebAccessibilityObjectWrapper _convertToNSRange:]): Deleted. 48 1 49 2021-11-20 Simon Fraser <simon.fraser@apple.com> 2 50 -
trunk/Source/WebCore/accessibility/AccessibilityObject.cpp
r285632 r286116 703 703 return { }; 704 704 return AXObjectCache::rangeForNodeContents(*node); 705 } 706 707 std::optional<SimpleRange> AccessibilityObject::visibleCharacterRange() const 708 { 709 auto range = elementRange(); 710 if (!range) 711 return std::nullopt; 712 713 auto contentRect = unobscuredContentRect(); 714 auto elementRect = snappedIntRect(this->elementRect()); 715 if (!contentRect.intersects(elementRect)) 716 return std::nullopt; 717 718 std::optional<BoundaryPoint> startBoundary = range->start; 719 std::optional<BoundaryPoint> endBoundary = range->end; 720 721 // Origin isn't contained in visible rect, start moving forward by line. 722 while (!contentRect.contains(elementRect.location())) { 723 auto nextLinePosition = nextLineEndPosition(VisiblePosition(makeContainerOffsetPosition(*startBoundary))); 724 std::optional<BoundaryPoint> testStartBoundary = makeBoundaryPoint(nextLinePosition); 725 if (!testStartBoundary || !contains(*range, *testStartBoundary)) 726 break; 727 728 startBoundary = testStartBoundary; 729 elementRect = boundsForRange(SimpleRange(*startBoundary, range->end)); 730 if (elementRect.isEmpty()) 731 break; 732 } 733 734 // End isn't contained in visible rect, start moving backwards by line. 735 while (!contentRect.contains(elementRect.location() + elementRect.size())) { 736 auto previousLinePosition = previousLineStartPosition(VisiblePosition(makeContainerOffsetPosition(*endBoundary))); 737 std::optional<BoundaryPoint> testEndBoundary = makeBoundaryPoint(previousLinePosition); 738 if (!testEndBoundary || !contains(*range, *testEndBoundary)) 739 break; 740 741 endBoundary = testEndBoundary; 742 elementRect = boundsForRange({ *startBoundary, *endBoundary }); 743 if (elementRect.isEmpty()) 744 break; 745 } 746 747 if (!startBoundary || !endBoundary) 748 return std::nullopt; 749 750 return {{ *startBoundary, *endBoundary }}; 705 751 } 706 752 … … 3183 3229 } 3184 3230 3231 FloatRect AccessibilityObject::unobscuredContentRect() const 3232 { 3233 auto document = this->document(); 3234 if (!document || !document->view()) 3235 return { }; 3236 return FloatRect(snappedIntRect(document->view()->unobscuredContentRect())); 3237 } 3238 3185 3239 void AccessibilityObject::scrollToGlobalPoint(const IntPoint& globalPoint) const 3186 3240 { -
trunk/Source/WebCore/accessibility/AccessibilityObject.h
r285991 r286116 809 809 void ariaElementsReferencedByAttribute(AccessibilityChildrenVector&, const QualifiedName&) const; 810 810 virtual bool exposesTitleUIElement() const { return true; } 811 811 FloatRect unobscuredContentRect() const override; 812 812 AccessibilityObject* radioGroupAncestor() const; 813 813 … … 822 822 std::optional<SimpleRange> selectionRange() const; 823 823 std::optional<SimpleRange> findTextRange(const Vector<String>& searchStrings, const SimpleRange& start, AccessibilitySearchTextDirection) const; 824 std::optional<SimpleRange> visibleCharacterRange() const override; 824 825 825 826 protected: // FIXME: Make the data members private. -
trunk/Source/WebCore/accessibility/AccessibilityObjectInterface.h
r285991 r286116 989 989 virtual FloatRect relativeFrame() const = 0; 990 990 virtual FloatRect convertFrameToSpace(const FloatRect&, AccessibilityConversionSpace) const = 0; 991 virtual FloatRect unobscuredContentRect() const = 0; 991 992 virtual bool supportsCheckedState() const = 0; 992 993 … … 998 999 virtual bool hasMisspelling() const = 0; 999 1000 virtual std::optional<SimpleRange> misspellingRange(const SimpleRange& start, AccessibilitySearchDirection) const = 0; 1001 virtual std::optional<SimpleRange> visibleCharacterRange() const = 0; 1000 1002 virtual bool hasPlainText() const = 0; 1001 1003 virtual bool hasSameFont(const AXCoreObject&) const = 0; -
trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
r285589 r286116 53 53 #import "SVGNames.h" 54 54 #import "SelectionGeometry.h" 55 #import "SimpleRange.h" 55 56 #import "TextIterator.h" 56 57 #import "WAKScrollView.h" … … 1695 1696 if (![self _prepareAccessibilityCall]) 1696 1697 return CGRectZero; 1697 1698 auto document = self.axBackingObject->document(); 1699 if (!document || !document->view()) 1700 return CGRectZero; 1701 auto rect = FloatRect(snappedIntRect(document->view()->unobscuredContentRect())); 1702 return [self convertRectToSpace:rect space:AccessibilityConversionSpace::Screen]; 1698 return [self convertRectToSpace:self.axBackingObject->unobscuredContentRect() space:AccessibilityConversionSpace::Screen]; 1703 1699 } 1704 1700 … … 1916 1912 } 1917 1913 1918 return convertToNSArray(accessibleElements);1914 return makeNSArray(accessibleElements); 1919 1915 } 1920 1916 … … 2105 2101 AccessibilityObject::AccessibilityChildrenVector results; 2106 2102 self.axBackingObject->findMatchingObjects(&criteria, results); 2107 return convertToNSArray(results);2103 return makeNSArray(results); 2108 2104 } 2109 2105 … … 2210 2206 } 2211 2207 2212 // FIXME: No reason for this to be a method instead of a function.2213 - (NSRange)_convertToNSRange:(const SimpleRange&)range2214 {2215 auto& document = range.start.document();2216 auto* frame = document.frame();2217 if (!frame)2218 return NSMakeRange(NSNotFound, 0);2219 2220 auto* rootEditableElement = frame->selection().selection().rootEditableElement();2221 auto* scope = rootEditableElement ? rootEditableElement : document.documentElement();2222 if (!scope)2223 return NSMakeRange(NSNotFound, 0);2224 2225 // Mouse events may cause TSM to attempt to create an NSRange for a portion of the view2226 // that is not inside the current editable region. These checks ensure we don't produce2227 // potentially invalid data when responding to such requests.2228 if (!scope->contains(range.start.container.ptr()) || !scope->contains(range.end.container.ptr()))2229 return NSMakeRange(NSNotFound, 0);2230 2231 return NSMakeRange(characterCount({ { *scope, 0 }, range.start }), characterCount(range));2232 }2233 2234 - (std::optional<SimpleRange>)_convertToDOMRange:(NSRange)range2235 {2236 if (range.location == NSNotFound)2237 return std::nullopt;2238 2239 // our critical assumption is that we are only called by input methods that2240 // concentrate on a given area containing the selection2241 // We have to do this because of text fields and textareas. The DOM for those is not2242 // directly in the document DOM, so serialization is problematic. Our solution is2243 // to use the root editable element of the selection start as the positional base.2244 // That fits with AppKit's idea of an input context.2245 auto document = self.axBackingObject->document();2246 auto selectionRoot = document->frame()->selection().selection().rootEditableElement();2247 auto scope = selectionRoot ? selectionRoot : document->documentElement();2248 if (!scope)2249 return std::nullopt;2250 2251 return resolveCharacterRange(makeRangeSelectingNodeContents(*scope), range);2252 }2253 2208 2254 2209 // This method is intended to take a text marker representing a VisiblePosition and convert it … … 2268 2223 if (!range) 2269 2224 return NSNotFound; 2270 return [self _convertToNSRange:*range].location;2225 return makeNSRange(range).location; 2271 2226 } 2272 2227 return NSNotFound; … … 2347 2302 return nil; 2348 2303 2349 auto range = [self _convertToDOMRange:NSMakeRange(position, 0)];2304 auto range = makeDOMRange(self.axBackingObject->document(), NSMakeRange(position, 0)); 2350 2305 if (!range) 2351 2306 return nil; … … 2415 2370 if (![self _prepareAccessibilityCall]) 2416 2371 return nil; 2417 auto webRange = [self _convertToDOMRange:range];2372 auto webRange = makeDOMRange(self.axBackingObject->document(), range); 2418 2373 if (!webRange) 2419 2374 return nil; … … 2599 2554 CharacterOffset start = [marker characterOffset]; 2600 2555 return [self previousMarkerForCharacterOffset:start]; 2556 } 2557 2558 - (CGRect)frameForRange:(NSRange)range 2559 { 2560 if (![self _prepareAccessibilityCall]) 2561 return CGRectZero; 2562 auto webRange = makeDOMRange(self.axBackingObject->document(), range); 2563 if (!webRange) 2564 return CGRectZero; 2565 auto rect = self.axBackingObject->boundsForRange(*webRange); 2566 return [self convertRectToSpace:rect space:AccessibilityConversionSpace::Screen]; 2601 2567 } 2602 2568 … … 2932 2898 2933 2899 auto radicand = self.axBackingObject->mathRadicand(); 2934 return radicand ? convertToNSArray(*radicand) : nil;2900 return radicand ? makeNSArray(*radicand) : nil; 2935 2901 } 2936 2902 -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
r285991 r286116 993 993 } 994 994 995 std::optional<SimpleRange> AXIsolatedObject::visibleCharacterRange() const 996 { 997 ASSERT(isMainThread()); 998 auto* axObject = associatedAXObject(); 999 return axObject ? axObject->visibleCharacterRange() : std::nullopt; 1000 } 1001 995 1002 std::optional<SimpleRange> AXIsolatedObject::rangeForPlainTextRange(const PlainTextRange& axRange) const 996 1003 { … … 1469 1476 if (auto* object = associatedAXObject()) 1470 1477 object->setSelectedVisiblePositionRange(visiblePositionRange); 1478 } 1479 1480 FloatRect AXIsolatedObject::unobscuredContentRect() const 1481 { 1482 return Accessibility::retrieveValueFromMainThread<FloatRect>([this] () -> FloatRect { 1483 if (auto* object = associatedAXObject()) 1484 return object->unobscuredContentRect(); 1485 return { }; 1486 }); 1471 1487 } 1472 1488 -
trunk/Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h
r285991 r286116 442 442 int lineForPosition(const VisiblePosition&) const override; 443 443 PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const override; 444 std::optional<SimpleRange> visibleCharacterRange() const override; 444 445 int index(const VisiblePosition&) const override; 445 446 void lineBreaks(Vector<int>&) const override; 446 447 FloatRect unobscuredContentRect() const override; 448 447 449 // Attribute setters. 448 450 void setARIAGrabbed(bool) override; -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h
r284213 r286116 35 35 namespace WebCore { 36 36 struct AccessibilitySearchCriteria; 37 class Document; 37 38 class IntRect; 38 39 class FloatPoint; … … 112 113 - (NSArray *)accessibilityMathPrescriptPairs; 113 114 115 - (NSRange)accessibilityVisibleCharacterRange; 116 114 117 - (NSDictionary<NSString *, id> *)baseAccessibilityResolvedEditingStyles; 115 118 116 119 extern WebCore::AccessibilitySearchCriteria accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute(const NSDictionary *); 117 120 118 extern NSArray *convertToNSArray(const WebCore::AXCoreObject::AccessibilityChildrenVector&); 121 extern NSArray *makeNSArray(const WebCore::AXCoreObject::AccessibilityChildrenVector&); 122 extern NSRange makeNSRange(std::optional<WebCore::SimpleRange>); 123 extern std::optional<WebCore::SimpleRange> makeDOMRange(WebCore::Document*, NSRange); 119 124 120 125 #if PLATFORM(IOS_FAMILY) -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm
r285991 r286116 262 262 } 263 263 264 NSArray * convertToNSArray(const WebCore::AXCoreObject::AccessibilityChildrenVector& children)264 NSArray *makeNSArray(const WebCore::AXCoreObject::AccessibilityChildrenVector& children) 265 265 { 266 266 return createNSArray(children, [] (const auto& child) -> id { … … 461 461 }); 462 462 return convertedPath.autorelease(); 463 } 464 465 // Determine the visible range by checking intersection of unobscuredContentRect and a range of text by 466 // advancing forward by line from top and backwards by line from the bottom, until we have a visible range. 467 - (NSRange)accessibilityVisibleCharacterRange 468 { 469 return Accessibility::retrieveValueFromMainThread<NSRange>([protectedSelf = retainPtr(self)] () -> NSRange { 470 auto backingObject = protectedSelf.get().baseUpdateBackingStore; 471 if (!backingObject) 472 return NSMakeRange(NSNotFound, 0); 473 474 auto elementRange = makeNSRange(backingObject->elementRange()); 475 if (elementRange.location == NSNotFound) 476 return elementRange; 477 478 auto visibleRange = makeNSRange(backingObject->visibleCharacterRange()); 479 if (visibleRange.location == NSNotFound) 480 return visibleRange; 481 482 return NSMakeRange(visibleRange.location - elementRange.location, visibleRange.length); 483 }); 463 484 } 464 485 … … 624 645 } 625 646 647 NSRange makeNSRange(std::optional<SimpleRange> range) 648 { 649 if (!range) 650 return NSMakeRange(NSNotFound, 0); 651 652 auto& document = range->start.document(); 653 auto* frame = document.frame(); 654 if (!frame) 655 return NSMakeRange(NSNotFound, 0); 656 657 auto* rootEditableElement = frame->selection().selection().rootEditableElement(); 658 auto* scope = rootEditableElement ? rootEditableElement : document.documentElement(); 659 if (!scope) 660 return NSMakeRange(NSNotFound, 0); 661 662 // Mouse events may cause TSM to attempt to create an NSRange for a portion of the view 663 // that is not inside the current editable region. These checks ensure we don't produce 664 // potentially invalid data when responding to such requests. 665 if (!scope->contains(range->start.container.ptr()) || !scope->contains(range->end.container.ptr())) 666 return NSMakeRange(NSNotFound, 0); 667 668 return NSMakeRange(characterCount({ { *scope, 0 }, range->start }), characterCount(*range)); 669 } 670 671 std::optional<SimpleRange> makeDOMRange(Document* document, NSRange range) 672 { 673 if (range.location == NSNotFound) 674 return std::nullopt; 675 676 // our critical assumption is that we are only called by input methods that 677 // concentrate on a given area containing the selection 678 // We have to do this because of text fields and textareas. The DOM for those is not 679 // directly in the document DOM, so serialization is problematic. Our solution is 680 // to use the root editable element of the selection start as the positional base. 681 // That fits with AppKit's idea of an input context. 682 auto selectionRoot = document->frame()->selection().selection().rootEditableElement(); 683 auto scope = selectionRoot ? selectionRoot : document->documentElement(); 684 if (!scope) 685 return std::nullopt; 686 687 return resolveCharacterRange(makeRangeSelectingNodeContents(*scope), range); 688 } 689 626 690 // Returns an array of strings and AXObject wrappers corresponding to the text 627 691 // runs and replacement nodes included in the given range. … … 677 741 } 678 742 679 - ( NSArray<NSDictionary *> *)lineRectsAndText743 - (WebCore::AXCoreObject*)baseUpdateBackingStore 680 744 { 681 745 #if PLATFORM(MAC) 682 746 auto* backingObject = self.updateObjectBackingStore; 683 747 if (!backingObject) 684 return n il;748 return nullptr; 685 749 #else 686 750 if (![self _prepareAccessibilityCall]) 751 return nullptr; 752 auto* backingObject = self.axBackingObject; 753 #endif 754 return backingObject; 755 } 756 757 - (NSArray<NSDictionary *> *)lineRectsAndText 758 { 759 auto backingObject = self.baseUpdateBackingStore; 760 if (!backingObject) 687 761 return nil; 688 auto* backingObject = self.axBackingObject; 689 #endif 690 762 691 763 auto range = backingObject->elementRange(); 692 764 if (!range) -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
r285904 r286116 1796 1796 - (NSArray<WebAccessibilityObjectWrapper *> *)childrenVectorArray 1797 1797 { 1798 return convertToNSArray(self.axBackingObject->children());1798 return makeNSArray(self.axBackingObject->children()); 1799 1799 } 1800 1800 … … 2204 2204 AccessibilityObject::AccessibilityChildrenVector contentCopy; 2205 2205 backingObject->ariaTreeItemContent(contentCopy); 2206 return convertToNSArray(contentCopy);2206 return makeNSArray(contentCopy); 2207 2207 } 2208 2208 … … 2214 2214 AccessibilityObject::AccessibilityChildrenVector selectedChildrenCopy; 2215 2215 backingObject->selectedChildren(selectedChildrenCopy); 2216 return convertToNSArray(selectedChildrenCopy);2216 return makeNSArray(selectedChildrenCopy); 2217 2217 } 2218 2218 return nil; … … 2223 2223 AccessibilityObject::AccessibilityChildrenVector visibleChildrenCopy; 2224 2224 backingObject->visibleChildren(visibleChildrenCopy); 2225 return convertToNSArray(visibleChildrenCopy);2225 return makeNSArray(visibleChildrenCopy); 2226 2226 } 2227 2227 … … 2235 2235 if (backingObject->isWebArea()) { 2236 2236 if ([attributeName isEqualToString:@"AXLinkUIElements"]) 2237 return convertToNSArray(backingObject->documentLinks());2237 return makeNSArray(backingObject->documentLinks()); 2238 2238 2239 2239 if ([attributeName isEqualToString:@"AXLoaded"]) … … 2268 2268 return [NSValue valueWithRange:NSMakeRange(textRange.start, textRange.length)]; 2269 2269 } 2270 // TODO: Get actual visible range. <rdar://problem/4712101>2271 if ([attributeName isEqualToString: NSAccessibilityVisibleCharacterRangeAttribute])2272 return backingObject->isPasswordField() ? nil : [NSValue valueWithRange: NSMakeRange(0, backingObject->textLength())];2273 2274 2270 if ([attributeName isEqualToString:NSAccessibilityInsertionPointLineNumberAttribute]) { 2275 2271 int lineNumber = backingObject->insertionPointLineNumber(); 2276 2272 return lineNumber >= 0 ? @(lineNumber) : nil; 2277 2273 } 2274 } 2275 2276 if ([attributeName isEqualToString: NSAccessibilityVisibleCharacterRangeAttribute]) { 2277 if (backingObject->isPasswordField()) 2278 return nil; 2279 // TODO: Get actual visible range. <rdar://problem/4712101> 2280 if (backingObject->isTextControl()) 2281 return [NSValue valueWithRange:NSMakeRange(0, backingObject->textLength())]; 2282 return [NSValue valueWithRange:[self accessibilityVisibleCharacterRange]]; 2278 2283 } 2279 2284 … … 2381 2386 if ([attributeName isEqualToString:NSAccessibilityImageOverlayElementsAttribute]) { 2382 2387 auto imageOverlayElements = backingObject->imageOverlayElements(); 2383 return imageOverlayElements ? convertToNSArray(*imageOverlayElements) : nil;2388 return imageOverlayElements ? makeNSArray(*imageOverlayElements) : nil; 2384 2389 } 2385 2390 … … 2405 2410 AccessibilityObject::AccessibilityChildrenVector tabsChildren; 2406 2411 backingObject->tabChildren(tabsChildren); 2407 return convertToNSArray(tabsChildren);2412 return makeNSArray(tabsChildren); 2408 2413 } 2409 2414 } 2410 2415 2411 2416 if ([attributeName isEqualToString:NSAccessibilityContentsAttribute]) 2412 return convertToNSArray(backingObject->contents());2417 return makeNSArray(backingObject->contents()); 2413 2418 2414 2419 if (backingObject->isTable() && backingObject->isExposable()) { 2415 2420 if ([attributeName isEqualToString:NSAccessibilityRowsAttribute]) 2416 return convertToNSArray(backingObject->rows());2421 return makeNSArray(backingObject->rows()); 2417 2422 2418 2423 if ([attributeName isEqualToString:NSAccessibilityVisibleRowsAttribute]) 2419 return convertToNSArray(backingObject->visibleRows());2424 return makeNSArray(backingObject->visibleRows()); 2420 2425 2421 2426 // TODO: distinguish between visible and non-visible columns 2422 2427 if ([attributeName isEqualToString:NSAccessibilityColumnsAttribute] 2423 2428 || [attributeName isEqualToString:NSAccessibilityVisibleColumnsAttribute]) 2424 return convertToNSArray(backingObject->columns());2429 return makeNSArray(backingObject->columns()); 2425 2430 2426 2431 if ([attributeName isEqualToString:NSAccessibilitySelectedRowsAttribute]) { 2427 2432 AccessibilityObject::AccessibilityChildrenVector selectedChildrenCopy; 2428 2433 backingObject->selectedChildren(selectedChildrenCopy); 2429 return convertToNSArray(selectedChildrenCopy);2434 return makeNSArray(selectedChildrenCopy); 2430 2435 } 2431 2436 … … 2436 2441 2437 2442 if ([attributeName isEqualToString:NSAccessibilityColumnHeaderUIElementsAttribute]) 2438 return convertToNSArray(backingObject->columnHeaders());2443 return makeNSArray(backingObject->columnHeaders()); 2439 2444 2440 2445 if ([attributeName isEqualToString:NSAccessibilityHeaderAttribute]) { … … 2444 2449 2445 2450 if ([attributeName isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) 2446 return convertToNSArray(backingObject->rowHeaders());2451 return makeNSArray(backingObject->rowHeaders()); 2447 2452 2448 2453 if ([attributeName isEqualToString:NSAccessibilityVisibleCellsAttribute]) 2449 return convertToNSArray(backingObject->cells());2454 return makeNSArray(backingObject->cells()); 2450 2455 2451 2456 if ([attributeName isEqualToString:NSAccessibilityColumnCountAttribute]) … … 2469 2474 if ([attributeName isEqualToString:NSAccessibilityRowsAttribute] 2470 2475 || [attributeName isEqualToString:NSAccessibilityVisibleRowsAttribute]) 2471 return convertToNSArray(backingObject->children());2476 return makeNSArray(backingObject->children()); 2472 2477 2473 2478 if ([attributeName isEqualToString:NSAccessibilityHeaderAttribute]) { … … 2489 2494 2490 2495 if ([attributeName isEqualToString:NSAccessibilityColumnHeaderUIElementsAttribute]) 2491 return convertToNSArray(backingObject->columnHeaders());2496 return makeNSArray(backingObject->columnHeaders()); 2492 2497 2493 2498 if ([attributeName isEqualToString:NSAccessibilityRowHeaderUIElementsAttribute]) 2494 return convertToNSArray(backingObject->rowHeaders());2499 return makeNSArray(backingObject->rowHeaders()); 2495 2500 2496 2501 if ([attributeName isEqualToString:NSAccessibilityARIAColumnIndexAttribute]) … … 2505 2510 AccessibilityObject::AccessibilityChildrenVector selectedChildrenCopy; 2506 2511 backingObject->selectedChildren(selectedChildrenCopy); 2507 return convertToNSArray(selectedChildrenCopy);2512 return makeNSArray(selectedChildrenCopy); 2508 2513 } 2509 2514 if ([attributeName isEqualToString:NSAccessibilityRowsAttribute]) { 2510 2515 AccessibilityObject::AccessibilityChildrenVector rowsCopy; 2511 2516 backingObject->ariaTreeRows(rowsCopy); 2512 return convertToNSArray(rowsCopy);2517 return makeNSArray(rowsCopy); 2513 2518 } 2514 2519 … … 2545 2550 if ([attributeName isEqualToString:NSAccessibilityDisclosedRowsAttribute]) { 2546 2551 if (backingObject->isTreeItem() || backingObject->isARIATreeGridRow()) 2547 return convertToNSArray(backingObject->disclosedRows());2552 return makeNSArray(backingObject->disclosedRows()); 2548 2553 } 2549 2554 … … 2613 2618 AccessibilityObject::AccessibilityChildrenVector linkedUIElements; 2614 2619 backingObject->linkedUIElements(linkedUIElements); 2615 return convertToNSArray(linkedUIElements);2620 return makeNSArray(linkedUIElements); 2616 2621 } 2617 2622 … … 2686 2691 AccessibilityObject::AccessibilityChildrenVector ariaOwns; 2687 2692 backingObject->ariaOwnsElements(ariaOwns); 2688 return convertToNSArray(ariaOwns);2693 return makeNSArray(ariaOwns); 2689 2694 } 2690 2695 … … 2752 2757 if ([attributeName isEqualToString:NSAccessibilityMathRootRadicandAttribute]) { 2753 2758 auto radicand = backingObject->mathRadicand(); 2754 return radicand ? convertToNSArray(*radicand) : nil;2759 return radicand ? makeNSArray(*radicand) : nil; 2755 2760 } 2756 2761 … … 2846 2851 AccessibilityObject::AccessibilityChildrenVector details; 2847 2852 backingObject->ariaDetailsElements(details); 2848 return convertToNSArray(details);2853 return makeNSArray(details); 2849 2854 } 2850 2855 … … 2861 2866 AccessibilityObject::AccessibilityChildrenVector errorMessages; 2862 2867 backingObject->ariaErrorMessageElements(errorMessages); 2863 return convertToNSArray(errorMessages);2868 return makeNSArray(errorMessages); 2864 2869 } 2865 2870 … … 2879 2884 AccessibilityObject::AccessibilityChildrenVector ariaControls; 2880 2885 backingObject->ariaControlsElements(ariaControls); 2881 return convertToNSArray(ariaControls);2886 return makeNSArray(ariaControls); 2882 2887 } 2883 2888 … … 3429 3434 } 3430 3435 3431 // FIXME: No reason for this to be a method instead of a function; can get document from range.3432 - (NSRange)_convertToNSRange:(const SimpleRange&)range3433 {3434 ASSERT(isMainThread());3435 3436 auto document = self.axBackingObject->document();3437 if (!document)3438 return NSMakeRange(NSNotFound, 0);3439 3440 auto documentElement = document->documentElement();3441 if (!documentElement)3442 return NSMakeRange(NSNotFound, 0);3443 3444 return characterRange(makeBoundaryPointBeforeNodeContents(*documentElement), range);3445 }3446 3447 3436 - (NSInteger)_indexForTextMarker:(AXTextMarkerRef)marker 3448 3437 { … … 3461 3450 return NSNotFound; 3462 3451 3463 return [protectedSelf _convertToNSRange:*range].location;3452 return makeNSRange(range).location; 3464 3453 } 3465 3454 … … 3836 3825 backingObject->findMatchingObjects(&criteria, results); 3837 3826 if (widgetChildren) 3838 return [widgetChildren arrayByAddingObjectsFromArray: convertToNSArray(results)];3839 return convertToNSArray(results);3827 return [widgetChildren arrayByAddingObjectsFromArray:makeNSArray(results)]; 3828 return makeNSArray(results); 3840 3829 } 3841 3830 -
trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm
r285859 r286116 109 109 - (id)_accessibilityPhotoDescription; 110 110 - (NSArray *)accessibilityImageOverlayElements; 111 - (NSRange)accessibilityVisibleCharacterRange; 111 112 112 113 // TextMarker related … … 395 396 JSRetainPtr<JSStringRef> AccessibilityUIElement::stringDescriptionOfAttributeValue(JSStringRef attribute) 396 397 { 398 if (JSStringIsEqualToUTF8CString(attribute, "AXVisibleCharacterRange")) 399 return [NSStringFromRange([m_element accessibilityVisibleCharacterRange]) createJSStringRef]; 400 397 401 return createJSString(); 398 402 }
Note:
See TracChangeset
for help on using the changeset viewer.