Changeset 219426 in webkit


Ignore:
Timestamp:
Jul 12, 2017 3:20:43 PM (7 years ago)
Author:
n_wang@apple.com
Message:

AX: [iOS] Implement a way to retrieve a text marker range with desired text that is closest to a position
https://bugs.webkit.org/show_bug.cgi?id=174393
<rdar://problem/33248006>

Reviewed by Chris Fleizach.

Source/WebCore:

Used the existing findClosestPlainText function to search the range on iOS.
Also exposed a function on the iOS wrapper to return the selection rects of
the result range from the searching.

Test: accessibility/ios-simulator/text-marker-range-matches-text.html

  • accessibility/AXObjectCache.cpp:

(WebCore::visiblePositionForPositionWithOffset):
(WebCore::AXObjectCache::rangeMatchesTextNearRange):

  • accessibility/AXObjectCache.h:
  • accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:

(-[WebAccessibilityObjectWrapper rangeFromMarkers:withText:]):
(-[WebAccessibilityObjectWrapper textMarkerRangeFromMarkers:withText:]):
(-[WebAccessibilityObjectWrapper textRectsFromMarkers:withText:]):
(-[WebAccessibilityObjectWrapper rectsForSelectionRects:]):

Tools:

  • DumpRenderTree/AccessibilityUIElement.cpp:

(textMarkerRangeMatchesTextNearMarkersCallback):
(AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):
(AccessibilityUIElement::getJSClass):

  • DumpRenderTree/AccessibilityUIElement.h:
  • DumpRenderTree/ios/AccessibilityUIElementIOS.mm:

(AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):

  • WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:

(WTR::AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):

  • WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
  • WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
  • WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:

(WTR::AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):

LayoutTests:

  • accessibility/ios-simulator/text-marker-range-matches-text-expected.txt: Added.
  • accessibility/ios-simulator/text-marker-range-matches-text.html: Added.
Location:
trunk
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r219424 r219426  
     12017-07-12  Nan Wang  <n_wang@apple.com>
     2
     3        AX: [iOS] Implement a way to retrieve a text marker range with desired text that is closest to a position
     4        https://bugs.webkit.org/show_bug.cgi?id=174393
     5        <rdar://problem/33248006>
     6
     7        Reviewed by Chris Fleizach.
     8
     9        * accessibility/ios-simulator/text-marker-range-matches-text-expected.txt: Added.
     10        * accessibility/ios-simulator/text-marker-range-matches-text.html: Added.
     11
    1122017-07-12  Matt Lewis  <jlewis3@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r219424 r219426  
     12017-07-12  Nan Wang  <n_wang@apple.com>
     2
     3        AX: [iOS] Implement a way to retrieve a text marker range with desired text that is closest to a position
     4        https://bugs.webkit.org/show_bug.cgi?id=174393
     5        <rdar://problem/33248006>
     6
     7        Reviewed by Chris Fleizach.
     8
     9        Used the existing findClosestPlainText function to search the range on iOS.
     10        Also exposed a function on the iOS wrapper to return the selection rects of
     11        the result range from the searching.
     12
     13        Test: accessibility/ios-simulator/text-marker-range-matches-text.html
     14
     15        * accessibility/AXObjectCache.cpp:
     16        (WebCore::visiblePositionForPositionWithOffset):
     17        (WebCore::AXObjectCache::rangeMatchesTextNearRange):
     18        * accessibility/AXObjectCache.h:
     19        * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
     20        (-[WebAccessibilityObjectWrapper rangeFromMarkers:withText:]):
     21        (-[WebAccessibilityObjectWrapper textMarkerRangeFromMarkers:withText:]):
     22        (-[WebAccessibilityObjectWrapper textRectsFromMarkers:withText:]):
     23        (-[WebAccessibilityObjectWrapper rectsForSelectionRects:]):
     24
    1252017-07-12  Matt Lewis  <jlewis3@apple.com>
    226
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r219424 r219426  
    17271727    return WTFMove(range);
    17281728}
     1729   
     1730static VisiblePosition visiblePositionForPositionWithOffset(const VisiblePosition& position, int32_t offset)
     1731{
     1732    RefPtr<ContainerNode> root;
     1733    unsigned startIndex = indexForVisiblePosition(position, root);
     1734    return visiblePositionForIndex(startIndex + offset, root.get());
     1735}
     1736   
     1737RefPtr<Range> AXObjectCache::rangeMatchesTextNearRange(RefPtr<Range> originalRange, const String& matchText)
     1738{
     1739    if (!originalRange)
     1740        return nullptr;
     1741   
     1742    // Create a large enough range for searching the text within.
     1743    unsigned textLength = matchText.length();
     1744    auto startPosition = visiblePositionForPositionWithOffset(originalRange->startPosition(), -textLength);
     1745    auto endPosition = visiblePositionForPositionWithOffset(originalRange->startPosition(), 2 * textLength);
     1746   
     1747    if (startPosition.isNull())
     1748        startPosition = firstPositionInOrBeforeNode(&originalRange->startContainer());
     1749    if (endPosition.isNull())
     1750        endPosition = lastPositionInOrAfterNode(&originalRange->endContainer());
     1751   
     1752    RefPtr<Range> searchRange = Range::create(m_document, startPosition, endPosition);
     1753    if (!searchRange || searchRange->collapsed())
     1754        return nullptr;
     1755   
     1756    RefPtr<Range> range = Range::create(m_document, startPosition, originalRange->startPosition());
     1757    unsigned targetOffset = TextIterator::rangeLength(range.get(), true);
     1758    return findClosestPlainText(*searchRange.get(), matchText, 0, targetOffset);
     1759}
    17291760
    17301761static bool isReplacedNodeOrBR(Node* node)
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r219424 r219426  
    333333    void deferTextChangedIfNeeded(Node*);
    334334    void performDeferredCacheUpdate();
     335   
     336    RefPtr<Range> rangeMatchesTextNearRange(RefPtr<Range>, const String&);
     337   
    335338
    336339protected:
  • trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm

    r219424 r219426  
    5353#import "SVGNames.h"
    5454#import "SVGElement.h"
     55#import "SelectionRect.h"
    5556#import "TextIterator.h"
    5657#import "WAKScrollView.h"
     
    25892590}
    25902591
     2592- (RefPtr<Range>)rangeFromMarkers:(NSArray *)markers withText:(NSString *)text
     2593{
     2594    RefPtr<Range> originalRange = [self rangeForTextMarkers:markers];
     2595    if (!originalRange)
     2596        return nil;
     2597   
     2598    AXObjectCache* cache = m_object->axObjectCache();
     2599    if (!cache)
     2600        return nil;
     2601   
     2602    return cache->rangeMatchesTextNearRange(originalRange, text);
     2603}
     2604
     2605// This is only used in the layout test.
     2606- (NSArray *)textMarkerRangeFromMarkers:(NSArray *)markers withText:(NSString *)text
     2607{
     2608    return [self textMarkersForRange:[self rangeFromMarkers:markers withText:text]];
     2609}
     2610
     2611- (NSArray *)textRectsFromMarkers:(NSArray *)markers withText:(NSString *)text
     2612{
     2613    if (![self _prepareAccessibilityCall])
     2614        return nil;
     2615   
     2616    RefPtr<Range> range = [self rangeFromMarkers:markers withText:text];
     2617    if (!range || range->collapsed())
     2618        return nil;
     2619   
     2620    Vector<WebCore::SelectionRect> selectionRects;
     2621    range->collectSelectionRectsWithoutUnionInteriorLines(selectionRects);
     2622    return [self rectsForSelectionRects:selectionRects];
     2623}
     2624
     2625- (NSArray *)rectsForSelectionRects:(const Vector<WebCore::SelectionRect>&)selectionRects
     2626{
     2627    unsigned size = selectionRects.size();
     2628    if (!size)
     2629        return nil;
     2630   
     2631    NSMutableArray *rects = [NSMutableArray arrayWithCapacity:size];
     2632    for (unsigned i = 0; i < size; i++) {
     2633        const WebCore::SelectionRect& coreRect = selectionRects[i];
     2634        IntRect selectionRect = coreRect.rect();
     2635        CGRect rect = [self convertRectToScreenSpace:selectionRect];
     2636        [rects addObject:[NSValue valueWithRect:rect]];
     2637    }
     2638   
     2639    return rects;
     2640}
     2641
    25912642- (WebAccessibilityTextMarker *)textMarkerForPoint:(CGPoint)point
    25922643{
  • trunk/Tools/ChangeLog

    r219424 r219426  
     12017-07-12  Nan Wang  <n_wang@apple.com>
     2
     3        AX: [iOS] Implement a way to retrieve a text marker range with desired text that is closest to a position
     4        https://bugs.webkit.org/show_bug.cgi?id=174393
     5        <rdar://problem/33248006>
     6
     7        Reviewed by Chris Fleizach.
     8
     9        * DumpRenderTree/AccessibilityUIElement.cpp:
     10        (textMarkerRangeMatchesTextNearMarkersCallback):
     11        (AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):
     12        (AccessibilityUIElement::getJSClass):
     13        * DumpRenderTree/AccessibilityUIElement.h:
     14        * DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
     15        (AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):
     16        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
     17        (WTR::AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):
     18        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
     19        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
     20        * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
     21        (WTR::AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers):
     22
    1232017-07-12  Matt Lewis  <jlewis3@apple.com>
    224
  • trunk/Tools/DumpRenderTree/AccessibilityUIElement.cpp

    r219424 r219426  
    928928static JSValueRef textMarkerRangeForMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    929929{
    930     AccessibilityTextMarker* startMarker = 0;
    931     AccessibilityTextMarker* endMarker = 0;
     930    AccessibilityTextMarker* startMarker = nullptr;
     931    AccessibilityTextMarker* endMarker = nullptr;
    932932    if (argumentCount == 2) {
    933933        startMarker = toTextMarker(JSValueToObject(context, arguments[0], exception));
     
    14821482{
    14831483    return JSValueMakeBoolean(context, toAXElement(thisObject)->hasContainedByFieldsetTrait());
     1484}
     1485
     1486static JSValueRef textMarkerRangeMatchesTextNearMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     1487{
     1488    JSStringRef searchText = nullptr;
     1489    AccessibilityTextMarker* startMarker = nullptr;
     1490    AccessibilityTextMarker* endMarker = nullptr;
     1491    if (argumentCount == 3) {
     1492        searchText = JSValueToStringCopy(context, arguments[0], exception);
     1493        startMarker = toTextMarker(JSValueToObject(context, arguments[1], exception));
     1494        endMarker = toTextMarker(JSValueToObject(context, arguments[2], exception));
     1495    }
     1496   
     1497    JSValueRef result = AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeMatchesTextNearMarkers(searchText, startMarker, endMarker));
     1498    if (searchText)
     1499        JSStringRelease(searchText);
     1500    return result;
    14841501}
    14851502
     
    17041721    return nullptr;
    17051722}
     1723
     1724#if PLATFORM(IOS)
     1725AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers(JSStringRef, AccessibilityTextMarker*, AccessibilityTextMarker*)
     1726{
     1727    return nullptr;
     1728}
     1729#endif
    17061730
    17071731#endif
     
    19211945        { "assistiveTechnologySimulatedFocus", assistiveTechnologySimulatedFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    19221946        { "fieldsetAncestorElement", fieldsetAncestorElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     1947        { "textMarkerRangeMatchesTextNearMarkers", textMarkerRangeMatchesTextNearMarkersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    19231948#endif
    19241949        { 0, 0, 0 }
  • trunk/Tools/DumpRenderTree/AccessibilityUIElement.h

    r219424 r219426  
    307307    bool isSearchField() const;
    308308   
     309    AccessibilityTextMarkerRange textMarkerRangeMatchesTextNearMarkers(JSStringRef, AccessibilityTextMarker*, AccessibilityTextMarker*);
     310   
    309311#endif // PLATFORM(IOS)
    310312
  • trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm

    r219424 r219426  
    114114- (id)lineStartMarkerForMarker:(id)marker;
    115115- (id)lineEndMarkerForMarker:(id)marker;
     116- (NSArray *)textMarkerRangeFromMarkers:(NSArray *)markers withText:(NSString *)text;
    116117@end
    117118
     
    621622}
    622623
     624AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers(JSStringRef text, AccessibilityTextMarker* startMarker, AccessibilityTextMarker* endMarker)
     625{
     626    NSArray *textMarkers = nil;
     627    if (startMarker->platformTextMarker() && endMarker->platformTextMarker())
     628        textMarkers = [NSArray arrayWithObjects:(id)startMarker->platformTextMarker(), (id)endMarker->platformTextMarker(), nil];
     629    id textMarkerRange = [m_element textMarkerRangeFromMarkers:textMarkers withText:[NSString stringWithJSStringRef:text]];
     630    return AccessibilityTextMarkerRange(textMarkerRange);
     631}
     632
     633
    623634#endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(IOS)
    624635
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp

    r219424 r219426  
    7575bool AccessibilityUIElement::isSearchField() const { return false; }
    7676bool AccessibilityUIElement::isTextArea() const { return false; }
    77 
     77RefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers(JSStringRef, AccessibilityTextMarker*, AccessibilityTextMarker*) { return nullptr; }
    7878#endif
    7979   
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h

    r219424 r219426  
    290290    RefPtr<AccessibilityTextMarker> nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*);
    291291    RefPtr<AccessibilityTextMarker> previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*);
     292    RefPtr<AccessibilityTextMarkerRange> textMarkerRangeMatchesTextNearMarkers(JSStringRef, AccessibilityTextMarker*, AccessibilityTextMarker*);
    292293
    293294    // Returns an ordered list of supported actions for an element.
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl

    r219424 r219426  
    227227    AccessibilityTextMarker previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    228228    AccessibilityTextMarker nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
     229    AccessibilityTextMarkerRange textMarkerRangeMatchesTextNearMarkers(DOMString text, AccessibilityTextMarker startMarker, AccessibilityTextMarker endMarker);
    229230
    230231    // Returns an ordered list of supported actions for an element.
  • trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm

    r219424 r219426  
    9292- (id)lineStartMarkerForMarker:(id)marker;
    9393- (id)lineEndMarkerForMarker:(id)marker;
     94- (NSArray *)textMarkerRangeFromMarkers:(NSArray *)markers withText:(NSString *)text;
    9495@end
    9596
     
    12001201{
    12011202    return nullptr;
     1203}
     1204   
     1205RefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers(JSStringRef text, AccessibilityTextMarker* startMarker, AccessibilityTextMarker* endMarker)
     1206{
     1207    NSArray *textMarkers = nil;
     1208    if (startMarker->platformTextMarker() && endMarker->platformTextMarker())
     1209        textMarkers = [NSArray arrayWithObjects:(id)startMarker->platformTextMarker(), (id)endMarker->platformTextMarker(), nil];
     1210    id textMarkerRange = [m_element textMarkerRangeFromMarkers:textMarkers withText:[NSString stringWithJSStringRef:text]];
     1211    return AccessibilityTextMarkerRange::create(textMarkerRange);
    12021212}
    12031213
Note: See TracChangeset for help on using the changeset viewer.