Changeset 196699 in webkit


Ignore:
Timestamp:
Feb 17, 2016 10:16:50 AM (8 years ago)
Author:
n_wang@apple.com
Message:

AX: Implement sentence related text marker functions using TextIterator
https://bugs.webkit.org/show_bug.cgi?id=154312

Reviewed by Chris Fleizach.

Source/WebCore:

Using CharacterOffset to implement sentence related text marker calls. Reused
logic from VisibleUnits class. Also fixed an issue where paragraph navigation
should skip preceding and following BR nodes.

Test: accessibility/mac/text-marker-sentence-nav.html

  • accessibility/AXObjectCache.cpp:

(WebCore::resetNodeAndOffsetForReplacedNode):
(WebCore::setRangeStartOrEndWithCharacterOffset):
(WebCore::AXObjectCache::characterOffsetForNodeAndOffset):
(WebCore::AXObjectCache::previousCharacterOffset):
(WebCore::AXObjectCache::startCharacterOffsetOfWord):
(WebCore::AXObjectCache::endCharacterOffsetOfWord):
(WebCore::AXObjectCache::previousWordStartCharacterOffset):
(WebCore::AXObjectCache::leftWordRange):
(WebCore::AXObjectCache::rightWordRange):
(WebCore::AXObjectCache::characterBefore):
(WebCore::characterOffsetNodeIsBR):
(WebCore::parentEditingBoundary):
(WebCore::AXObjectCache::nextBoundary):
(WebCore::AXObjectCache::previousBoundary):
(WebCore::AXObjectCache::paragraphForCharacterOffset):
(WebCore::AXObjectCache::nextParagraphEndCharacterOffset):
(WebCore::AXObjectCache::previousParagraphStartCharacterOffset):
(WebCore::AXObjectCache::startCharacterOffsetOfSentence):
(WebCore::AXObjectCache::endCharacterOffsetOfSentence):
(WebCore::AXObjectCache::sentenceForCharacterOffset):
(WebCore::AXObjectCache::nextSentenceEndCharacterOffset):
(WebCore::AXObjectCache::previousSentenceStartCharacterOffset):
(WebCore::AXObjectCache::rootAXEditableElement):
(WebCore::startWordBoundary): Deleted.
(WebCore::endWordBoundary): Deleted.
(WebCore::AXObjectCache::nextWordBoundary): Deleted.
(WebCore::AXObjectCache::previousWordBoundary): Deleted.

  • accessibility/AXObjectCache.h:
  • accessibility/mac/WebAccessibilityObjectWrapperMac.mm:

(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]):

  • editing/VisibleUnits.cpp:

(WebCore::startWordBoundary):
(WebCore::startOfWord):
(WebCore::endWordBoundary):
(WebCore::startSentenceBoundary):
(WebCore::startOfSentence):
(WebCore::endSentenceBoundary):

  • editing/VisibleUnits.h:

Tools:

  • DumpRenderTree/AccessibilityUIElement.cpp:

(nextParagraphEndTextMarkerForTextMarkerCallback):
(sentenceTextMarkerRangeForTextMarkerCallback):
(previousSentenceStartTextMarkerForTextMarkerCallback):
(nextSentenceEndTextMarkerForTextMarkerCallback):
(setSelectedVisibleTextRangeCallback):
(AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
(AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
(AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
(AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
(AccessibilityUIElement::getJSClass):

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

(AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
(AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
(AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
(AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):

  • DumpRenderTree/mac/AccessibilityUIElementMac.mm:

(AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
(AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
(AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
(AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
(AccessibilityUIElement::supportedActions):

  • WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:

(WTR::AccessibilityUIElement::paragraphTextMarkerRangeForTextMarker):
(WTR::AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::previousParagraphStartTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
(WTR::AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):

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

(WTR::AccessibilityUIElement::previousParagraphStartTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
(WTR::AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::mathPostscriptsDescription):

  • WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:

(WTR::AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
(WTR::AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
(WTR::AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
(WTR::_convertMathMultiscriptPairsToString):

LayoutTests:

  • accessibility/mac/text-marker-paragraph-nav-expected.txt:
  • accessibility/mac/text-marker-paragraph-nav.html:
  • accessibility/mac/text-marker-sentence-nav-expected.txt: Added.
  • accessibility/mac/text-marker-sentence-nav.html: Added.
Location:
trunk
Files:
2 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r196697 r196699  
     12016-02-17  Nan Wang  <n_wang@apple.com>
     2
     3        AX: Implement sentence related text marker functions using TextIterator
     4        https://bugs.webkit.org/show_bug.cgi?id=154312
     5
     6        Reviewed by Chris Fleizach.
     7
     8        * accessibility/mac/text-marker-paragraph-nav-expected.txt:
     9        * accessibility/mac/text-marker-paragraph-nav.html:
     10        * accessibility/mac/text-marker-sentence-nav-expected.txt: Added.
     11        * accessibility/mac/text-marker-sentence-nav.html: Added.
     12
    1132016-02-17  Ryan Haddad  <ryanhaddad@apple.com>
    214
  • trunk/LayoutTests/accessibility/mac/text-marker-paragraph-nav-expected.txt

    r196546 r196699  
    1111text
    1212this is my first paragraph. Of text. it has some text.
     13
     14
    1315this is my second paragraph. Of text. it has some text.
    1416this is my third paragraph. Of text. it has some text.
     
    6971
    7072Paragraph: this is my first paragraph. Of text. it has some text.
     73Paragraph:
     74Paragraph:
    7175Paragraph: this is my second paragraph. Of text. it has some text.
    7276Paragraph: this is my third paragraph. Of text. it has some text.
    7377Paragraph: this is my third paragraph. Of text. it has some text.
    7478Paragraph: this is my second paragraph. Of text. it has some text.
     79Paragraph:
     80Paragraph:
    7581Paragraph: this is my first paragraph. Of text. it has some text.
    7682Test going forward.
  • trunk/LayoutTests/accessibility/mac/text-marker-paragraph-nav.html

    r196546 r196699  
    4747</div>
    4848
    49 <div id="text9">this is my first paragraph. Of text. it has some text.<br>
     49<div id="text9">this is my first paragraph. Of text. it has some text.<br><br><br>
    5050this is my second paragraph. Of text. it has some text.<br>
    5151this is my third paragraph. Of text. it has some text.<br><br>
     
    122122        startMarker = text.nextTextMarker(startMarker);
    123123        var endMarker = text.endTextMarkerForTextMarkerRange(textMarkerRange);
    124         verifyParagraphs(text, startMarker, 3);
     124        verifyParagraphs(text, startMarker, 5);
    125125       
    126126        // Check the paragraph marker runs from start to end, and backwards.
     
    161161       
    162162        function verifyParagraphs(obj, startMarker, paragraphCount) {
    163             // Move to the end of first paragraph, so the first paragraph
    164             // won't print twice.
    165             var current = obj.nextParagraphEndTextMarkerForTextMarker(startMarker);
     163            var current = startMarker;
    166164            var i = 0;
    167165            while(i < paragraphCount) {
     166                current = obj.nextParagraphEndTextMarkerForTextMarker(current);
    168167                var currRange = obj.paragraphTextMarkerRangeForTextMarker(current);
    169168                var currParagraph = obj.stringForTextMarkerRange(currRange);
    170169                debug("Paragraph: " + currParagraph);
    171                 current = obj.nextParagraphEndTextMarkerForTextMarker(current);
    172170                i++;
    173171            }
    174172           
    175173            // Backwards.
    176             current = obj.previousParagraphStartTextMarkerForTextMarker(current);
    177174            i = 0;
    178175            while(i < paragraphCount) {
     176                current = obj.previousParagraphStartTextMarkerForTextMarker(current);
    179177                var currRange = obj.paragraphTextMarkerRangeForTextMarker(current);
    180178                var currParagraph = obj.stringForTextMarkerRange(currRange);
    181179                debug("Paragraph: " + currParagraph);
    182                 current = obj.previousParagraphStartTextMarkerForTextMarker(current);
    183180                i++;
    184181            }
  • trunk/Source/WebCore/ChangeLog

    r196691 r196699  
     12016-02-17  Nan Wang  <n_wang@apple.com>
     2
     3        AX: Implement sentence related text marker functions using TextIterator
     4        https://bugs.webkit.org/show_bug.cgi?id=154312
     5
     6        Reviewed by Chris Fleizach.
     7
     8        Using CharacterOffset to implement sentence related text marker calls. Reused
     9        logic from VisibleUnits class. Also fixed an issue where paragraph navigation
     10        should skip preceding and following BR nodes.
     11
     12        Test: accessibility/mac/text-marker-sentence-nav.html
     13
     14        * accessibility/AXObjectCache.cpp:
     15        (WebCore::resetNodeAndOffsetForReplacedNode):
     16        (WebCore::setRangeStartOrEndWithCharacterOffset):
     17        (WebCore::AXObjectCache::characterOffsetForNodeAndOffset):
     18        (WebCore::AXObjectCache::previousCharacterOffset):
     19        (WebCore::AXObjectCache::startCharacterOffsetOfWord):
     20        (WebCore::AXObjectCache::endCharacterOffsetOfWord):
     21        (WebCore::AXObjectCache::previousWordStartCharacterOffset):
     22        (WebCore::AXObjectCache::leftWordRange):
     23        (WebCore::AXObjectCache::rightWordRange):
     24        (WebCore::AXObjectCache::characterBefore):
     25        (WebCore::characterOffsetNodeIsBR):
     26        (WebCore::parentEditingBoundary):
     27        (WebCore::AXObjectCache::nextBoundary):
     28        (WebCore::AXObjectCache::previousBoundary):
     29        (WebCore::AXObjectCache::paragraphForCharacterOffset):
     30        (WebCore::AXObjectCache::nextParagraphEndCharacterOffset):
     31        (WebCore::AXObjectCache::previousParagraphStartCharacterOffset):
     32        (WebCore::AXObjectCache::startCharacterOffsetOfSentence):
     33        (WebCore::AXObjectCache::endCharacterOffsetOfSentence):
     34        (WebCore::AXObjectCache::sentenceForCharacterOffset):
     35        (WebCore::AXObjectCache::nextSentenceEndCharacterOffset):
     36        (WebCore::AXObjectCache::previousSentenceStartCharacterOffset):
     37        (WebCore::AXObjectCache::rootAXEditableElement):
     38        (WebCore::startWordBoundary): Deleted.
     39        (WebCore::endWordBoundary): Deleted.
     40        (WebCore::AXObjectCache::nextWordBoundary): Deleted.
     41        (WebCore::AXObjectCache::previousWordBoundary): Deleted.
     42        * accessibility/AXObjectCache.h:
     43        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
     44        (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]):
     45        * editing/VisibleUnits.cpp:
     46        (WebCore::startWordBoundary):
     47        (WebCore::startOfWord):
     48        (WebCore::endWordBoundary):
     49        (WebCore::startSentenceBoundary):
     50        (WebCore::startOfSentence):
     51        (WebCore::endSentenceBoundary):
     52        * editing/VisibleUnits.h:
     53
    1542016-02-17  Manuel Rego Casasnovas  <rego@igalia.com>
    255
  • trunk/Source/WebCore/accessibility/AXObjectCache.cpp

    r196546 r196699  
    16101610}
    16111611
    1612 static void setRangeStartOrEndWithCharacterOffset(RefPtr<Range> range, CharacterOffset& characterOffset, bool isStart, ExceptionCode& ec)
     1612static void setRangeStartOrEndWithCharacterOffset(RefPtr<Range> range, const CharacterOffset& characterOffset, bool isStart, ExceptionCode& ec)
    16131613{
    16141614    if (!range) {
     
    17391739            } else
    17401740                return CharacterOffset();
    1741             if (!offset)
     1741            if (charOffset.offset == offset)
    17421742                break;
    17431743        }
    17441744        if (offset > 0)
    1745             charOffset = characterOffsetForNodeAndOffset(*charOffset.node, charOffset.offset - offset);
     1745            charOffset = characterOffsetForNodeAndOffset(*charOffset.node, charOffset.offset - offset, TraverseOptionIncludeStart);
    17461746        return charOffset;
    17471747    }
     
    19201920}
    19211921
    1922 static unsigned startWordBoundary(StringView text, unsigned offset, BoundarySearchContextAvailability mayHaveMoreContext, bool& needMoreContext)
    1923 {
    1924     ASSERT(offset);
    1925     if (mayHaveMoreContext && !startOfLastWordBoundaryContext(text.substring(0, offset))) {
    1926         needMoreContext = true;
    1927         return 0;
    1928     }
    1929     needMoreContext = false;
    1930     int start, end;
    1931     U16_BACK_1(text, 0, offset);
    1932     findWordBoundary(text, offset, &start, &end);
    1933     return start;
    1934 }
    1935 
    1936 static unsigned endWordBoundary(StringView text, unsigned offset, BoundarySearchContextAvailability mayHaveMoreContext, bool& needMoreContext)
    1937 {
    1938     ASSERT(offset <= text.length());
    1939     if (mayHaveMoreContext && endOfFirstWordBoundaryContext(text.substring(offset)) == text.length() - offset) {
    1940         needMoreContext = true;
    1941         return text.length();
    1942     }
    1943     needMoreContext = false;
    1944     int end;
    1945     findEndWordBoundary(text, offset, &end);
    1946     return end;
    1947 }
    1948 
    19491922CharacterOffset AXObjectCache::startCharacterOffsetOfWord(const CharacterOffset& characterOffset, EWordSide side)
    19501923{
     
    19631936    }
    19641937   
    1965     return previousWordBoundary(c, startWordBoundary);
     1938    return previousBoundary(c, startWordBoundary);
    19661939}
    19671940
     
    19821955    }
    19831956   
    1984     return nextWordBoundary(c, endWordBoundary);
     1957    return nextBoundary(c, endWordBoundary);
    19851958}
    19861959
     
    20111984RefPtr<Range> AXObjectCache::leftWordRange(const CharacterOffset& characterOffset)
    20121985{
    2013     CharacterOffset start = previousWordStartCharacterOffset(characterOffset);
     1986    CharacterOffset start = startCharacterOffsetOfWord(characterOffset, LeftWordIfOnBoundary);
    20141987    CharacterOffset end = endCharacterOffsetOfWord(start);
    20151988    return rangeForUnorderedCharacterOffsets(start, end);
     
    20191992{
    20201993    CharacterOffset start = startCharacterOffsetOfWord(characterOffset);
    2021     CharacterOffset end = nextWordEndCharacterOffset(start);
     1994    CharacterOffset end = endCharacterOffsetOfWord(start);
    20221995    return rangeForUnorderedCharacterOffsets(start, end);
    20231996}
     
    20442017    return characterForCharacterOffset(characterOffset);
    20452018}
     2019
     2020static bool characterOffsetNodeIsBR(const CharacterOffset& characterOffset)
     2021{
     2022    if (characterOffset.isNull())
     2023        return false;
     2024   
     2025    return characterOffset.node->hasTagName(brTag);
     2026}
    20462027   
    20472028static Node* parentEditingBoundary(Node* node)
     
    20612042}
    20622043
    2063 CharacterOffset AXObjectCache::nextWordBoundary(CharacterOffset& characterOffset, BoundarySearchFunction searchFunction)
     2044CharacterOffset AXObjectCache::nextBoundary(const CharacterOffset& characterOffset, BoundarySearchFunction searchFunction)
    20642045{
    20652046    if (characterOffset.isNull())
     
    20932074    if (it.atEnd() && next == string.size())
    20942075        return end;
     2076   
     2077    // The endSentenceBoundary function will include a line break at the end of the sentence.
     2078    if (searchFunction == endSentenceBoundary && string[next - 1] == '\n')
     2079        next--;
     2080   
    20952081    if (next > prefixLength)
    20962082        return characterOffsetForNodeAndOffset(*characterOffset.node, characterOffset.offset + next - prefixLength);
     
    20992085}
    21002086
    2101 CharacterOffset AXObjectCache::previousWordBoundary(CharacterOffset& characterOffset, BoundarySearchFunction searchFunction)
     2087CharacterOffset AXObjectCache::previousBoundary(const CharacterOffset& characterOffset, BoundarySearchFunction searchFunction)
    21022088{
    21032089    if (characterOffset.isNull())
     
    21422128   
    21432129    int characterCount = characterOffset.offset - (string.size() - suffixLength - next);
     2130    // We don't want to go to the previous node if the node is at the start of a new line.
     2131    if (characterCount < 0 && (characterOffsetNodeIsBR(characterOffset) || string[string.size() - 1] == '\n'))
     2132        characterCount = 0;
    21442133    return characterOffsetForNodeAndOffset(*characterOffset.node, characterCount, TraverseOptionIncludeStart);
    21452134}
     
    21992188{
    22002189    CharacterOffset start = startCharacterOffsetOfParagraph(characterOffset);
    2201     CharacterOffset end = endCharacterOffsetOfParagraph(characterOffset);
     2190    CharacterOffset end = endCharacterOffsetOfParagraph(start);
    22022191   
    22032192    return rangeForUnorderedCharacterOffsets(start, end);
     
    22072196{
    22082197    // make sure we move off of a paragraph end
    2209     return endCharacterOffsetOfParagraph(nextCharacterOffset(characterOffset));
     2198    CharacterOffset next = nextCharacterOffset(characterOffset);
     2199   
     2200    // We should skip the following BR node.
     2201    if (characterOffsetNodeIsBR(next) && !characterOffsetNodeIsBR(characterOffset))
     2202        next = nextCharacterOffset(next);
     2203   
     2204    return endCharacterOffsetOfParagraph(next);
    22102205}
    22112206
     
    22132208{
    22142209    // make sure we move off of a paragraph start
    2215     return startCharacterOffsetOfParagraph(previousCharacterOffset(characterOffset, false));
     2210    CharacterOffset previous = previousCharacterOffset(characterOffset, false);
     2211   
     2212    // We should skip the preceding BR node.
     2213    if (characterOffsetNodeIsBR(previous) && !characterOffsetNodeIsBR(characterOffset))
     2214        previous = previousCharacterOffset(previous, false);
     2215   
     2216    return startCharacterOffsetOfParagraph(previous);
     2217}
     2218
     2219CharacterOffset AXObjectCache::startCharacterOffsetOfSentence(const CharacterOffset& characterOffset)
     2220{
     2221    return previousBoundary(characterOffset, startSentenceBoundary);
     2222}
     2223
     2224CharacterOffset AXObjectCache::endCharacterOffsetOfSentence(const CharacterOffset& characterOffset)
     2225{
     2226    return nextBoundary(characterOffset, endSentenceBoundary);
     2227}
     2228
     2229RefPtr<Range> AXObjectCache::sentenceForCharacterOffset(const CharacterOffset& characterOffset)
     2230{
     2231    CharacterOffset start = startCharacterOffsetOfSentence(characterOffset);
     2232    CharacterOffset end = endCharacterOffsetOfSentence(start);
     2233    return rangeForUnorderedCharacterOffsets(start, end);
     2234}
     2235
     2236CharacterOffset AXObjectCache::nextSentenceEndCharacterOffset(const CharacterOffset& characterOffset)
     2237{
     2238    // Make sure we move off of a sentence end.
     2239    return endCharacterOffsetOfSentence(nextCharacterOffset(characterOffset));
     2240}
     2241
     2242CharacterOffset AXObjectCache::previousSentenceStartCharacterOffset(const CharacterOffset& characterOffset)
     2243{
     2244    // Make sure we move off of a sentence start.
     2245    CharacterOffset previous = previousCharacterOffset(characterOffset, false);
     2246   
     2247    // We should skip the preceding BR node.
     2248    if (!previous.isNull() && previous.node->hasTagName(brTag) && !characterOffset.node->hasTagName(brTag))
     2249        previous = previousCharacterOffset(previous, false);
     2250   
     2251    return startCharacterOffsetOfSentence(previous);
    22162252}
    22172253
  • trunk/Source/WebCore/accessibility/AXObjectCache.h

    r196546 r196699  
    215215    CharacterOffset nextParagraphEndCharacterOffset(const CharacterOffset&);
    216216    CharacterOffset previousParagraphStartCharacterOffset(const CharacterOffset&);
     217   
     218    // Sentence
     219    RefPtr<Range> sentenceForCharacterOffset(const CharacterOffset&);
     220    CharacterOffset nextSentenceEndCharacterOffset(const CharacterOffset&);
     221    CharacterOffset previousSentenceStartCharacterOffset(const CharacterOffset&);
    217222
    218223    enum AXNotification {
     
    318323    CharacterOffset startOrEndCharacterOffsetForRange(RefPtr<Range>, bool);
    319324    CharacterOffset characterOffsetForNodeAndOffset(Node&, int, TraverseOption = TraverseOptionDefault);
    320     CharacterOffset previousWordBoundary(CharacterOffset&, BoundarySearchFunction);
    321     CharacterOffset nextWordBoundary(CharacterOffset&, BoundarySearchFunction);
     325    CharacterOffset previousBoundary(const CharacterOffset&, BoundarySearchFunction);
     326    CharacterOffset nextBoundary(const CharacterOffset&, BoundarySearchFunction);
    322327    CharacterOffset startCharacterOffsetOfWord(const CharacterOffset&, EWordSide = RightWordIfOnBoundary);
    323328    CharacterOffset endCharacterOffsetOfWord(const CharacterOffset&, EWordSide = RightWordIfOnBoundary);
    324329    CharacterOffset startCharacterOffsetOfParagraph(const CharacterOffset&, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
    325330    CharacterOffset endCharacterOffsetOfParagraph(const CharacterOffset&, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
     331    CharacterOffset startCharacterOffsetOfSentence(const CharacterOffset&);
     332    CharacterOffset endCharacterOffsetOfSentence(const CharacterOffset&);
    326333
    327334private:
  • trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm

    r196546 r196699  
    41134113   
    41144114    if ([attribute isEqualToString:@"AXSentenceTextMarkerRangeForTextMarker"]) {
    4115         VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];
    4116         VisiblePositionRange vpRange = m_object->sentenceForPosition(visiblePos);
    4117         return [self textMarkerRangeFromVisiblePositions:vpRange.start endPosition:vpRange.end];
     4115        AXObjectCache* cache = m_object->axObjectCache();
     4116        if (!cache)
     4117            return nil;
     4118        CharacterOffset characterOffset = [self characterOffsetForTextMarker:textMarker];
     4119        RefPtr<Range> range = cache->sentenceForCharacterOffset(characterOffset);
     4120        return [self textMarkerRangeFromRange:range];
    41184121    }
    41194122   
     
    41564159   
    41574160    if ([attribute isEqualToString:@"AXNextSentenceEndTextMarkerForTextMarker"]) {
    4158         VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];
    4159         return [self textMarkerForVisiblePosition:m_object->nextSentenceEndPosition(visiblePos)];
     4161        AXObjectCache* cache = m_object->axObjectCache();
     4162        if (!cache)
     4163            return nil;
     4164        CharacterOffset characterOffset = [self characterOffsetForTextMarker:textMarker];
     4165        CharacterOffset nextEnd = cache->nextSentenceEndCharacterOffset(characterOffset);
     4166        return [self textMarkerForCharacterOffset:nextEnd];
    41604167    }
    41614168   
    41624169    if ([attribute isEqualToString:@"AXPreviousSentenceStartTextMarkerForTextMarker"]) {
    4163         VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];
    4164         return [self textMarkerForVisiblePosition:m_object->previousSentenceStartPosition(visiblePos)];
     4170        AXObjectCache* cache = m_object->axObjectCache();
     4171        if (!cache)
     4172            return nil;
     4173        CharacterOffset characterOffset = [self characterOffsetForTextMarker:textMarker];
     4174        CharacterOffset previousStart = cache->previousSentenceStartCharacterOffset(characterOffset);
     4175        return [self textMarkerForCharacterOffset:previousStart];
    41654176    }
    41664177   
    41674178    if ([attribute isEqualToString:@"AXNextParagraphEndTextMarkerForTextMarker"]) {
    4168         VisiblePosition visiblePos = [self visiblePositionForTextMarker:(textMarker)];
    4169         return [self textMarkerForVisiblePosition:m_object->nextParagraphEndPosition(visiblePos)];
     4179        AXObjectCache* cache = m_object->axObjectCache();
     4180        if (!cache)
     4181            return nil;
     4182        CharacterOffset characterOffset = [self characterOffsetForTextMarker:textMarker];
     4183        CharacterOffset nextEnd = cache->nextParagraphEndCharacterOffset(characterOffset);
     4184        return [self textMarkerForCharacterOffset:nextEnd];
    41704185    }
    41714186   
  • trunk/Source/WebCore/editing/VisibleUnits.cpp

    r196546 r196699  
    659659// ---------
    660660
    661 static unsigned startWordBoundary(StringView text, unsigned offset, BoundarySearchContextAvailability mayHaveMoreContext, bool& needMoreContext)
     661unsigned startWordBoundary(StringView text, unsigned offset, BoundarySearchContextAvailability mayHaveMoreContext, bool& needMoreContext)
    662662{
    663663    ASSERT(offset);
     
    690690}
    691691
    692 static unsigned endWordBoundary(StringView text, unsigned offset, BoundarySearchContextAvailability mayHaveMoreContext, bool& needMoreContext)
     692unsigned endWordBoundary(StringView text, unsigned offset, BoundarySearchContextAvailability mayHaveMoreContext, bool& needMoreContext)
    693693{
    694694    ASSERT(offset <= text.length());
     
    10971097// ---------
    10981098
    1099 static unsigned startSentenceBoundary(StringView text, unsigned, BoundarySearchContextAvailability, bool&)
     1099unsigned startSentenceBoundary(StringView text, unsigned, BoundarySearchContextAvailability, bool&)
    11001100{
    11011101    // FIXME: The following function can return -1; we don't handle that.
     
    11081108}
    11091109
    1110 static unsigned endSentenceBoundary(StringView text, unsigned, BoundarySearchContextAvailability, bool&)
     1110unsigned endSentenceBoundary(StringView text, unsigned, BoundarySearchContextAvailability, bool&)
    11111111{
    11121112    return textBreakNext(sentenceBreakIterator(text));
  • trunk/Source/WebCore/editing/VisibleUnits.h

    r196546 r196699  
    113113enum BoundarySearchContextAvailability { DontHaveMoreContext, MayHaveMoreContext };
    114114typedef unsigned (*BoundarySearchFunction)(StringView, unsigned offset, BoundarySearchContextAvailability, bool& needMoreContext);
     115unsigned startWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
     116unsigned endWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
     117unsigned startSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
     118unsigned endSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
    115119unsigned suffixLengthForRange(RefPtr<Range>, Vector<UChar, 1024>&);
    116120unsigned prefixLengthForRange(RefPtr<Range>, Vector<UChar, 1024>&);
  • trunk/Tools/ChangeLog

    r196622 r196699  
     12016-02-17  Nan Wang  <n_wang@apple.com>
     2
     3        AX: Implement sentence related text marker functions using TextIterator
     4        https://bugs.webkit.org/show_bug.cgi?id=154312
     5
     6        Reviewed by Chris Fleizach.
     7
     8        * DumpRenderTree/AccessibilityUIElement.cpp:
     9        (nextParagraphEndTextMarkerForTextMarkerCallback):
     10        (sentenceTextMarkerRangeForTextMarkerCallback):
     11        (previousSentenceStartTextMarkerForTextMarkerCallback):
     12        (nextSentenceEndTextMarkerForTextMarkerCallback):
     13        (setSelectedVisibleTextRangeCallback):
     14        (AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
     15        (AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
     16        (AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
     17        (AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
     18        (AccessibilityUIElement::getJSClass):
     19        * DumpRenderTree/AccessibilityUIElement.h:
     20        * DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
     21        (AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
     22        (AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
     23        (AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
     24        (AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
     25        * DumpRenderTree/mac/AccessibilityUIElementMac.mm:
     26        (AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
     27        (AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
     28        (AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
     29        (AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
     30        (AccessibilityUIElement::supportedActions):
     31        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
     32        (WTR::AccessibilityUIElement::paragraphTextMarkerRangeForTextMarker):
     33        (WTR::AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
     34        (WTR::AccessibilityUIElement::previousParagraphStartTextMarkerForTextMarker):
     35        (WTR::AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
     36        (WTR::AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
     37        (WTR::AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
     38        * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h:
     39        * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl:
     40        * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
     41        (WTR::AccessibilityUIElement::previousParagraphStartTextMarkerForTextMarker):
     42        (WTR::AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
     43        (WTR::AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
     44        (WTR::AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
     45        (WTR::AccessibilityUIElement::mathPostscriptsDescription):
     46        * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
     47        (WTR::AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker):
     48        (WTR::AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker):
     49        (WTR::AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker):
     50        (WTR::AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker):
     51        (WTR::_convertMathMultiscriptPairsToString):
     52
    1532016-02-15  Brent Fulgham  <bfulgham@apple.com>
    254
  • trunk/Tools/DumpRenderTree/AccessibilityUIElement.cpp

    r196546 r196699  
    10381038}
    10391039
     1040static JSValueRef sentenceTextMarkerRangeForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     1041{
     1042    AccessibilityTextMarker* marker = nullptr;
     1043    if (argumentCount == 1)
     1044        marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
     1045   
     1046    return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->sentenceTextMarkerRangeForTextMarker(marker));
     1047}
     1048
     1049static JSValueRef previousSentenceStartTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     1050{
     1051    AccessibilityTextMarker* marker = nullptr;
     1052    if (argumentCount == 1)
     1053        marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
     1054   
     1055    return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousSentenceStartTextMarkerForTextMarker(marker));
     1056}
     1057
     1058static JSValueRef nextSentenceEndTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     1059{
     1060    AccessibilityTextMarker* marker = nullptr;
     1061    if (argumentCount == 1)
     1062        marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
     1063   
     1064    return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextSentenceEndTextMarkerForTextMarker(marker));
     1065}
     1066
    10401067static JSValueRef setSelectedVisibleTextRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    10411068{
     
    16591686
    16601687AccessibilityTextMarker AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker*)
     1688{
     1689    return nullptr;
     1690}
     1691
     1692AccessibilityTextMarkerRange AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
     1693{
     1694    return nullptr;
     1695}
     1696
     1697AccessibilityTextMarker AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*)
     1698{
     1699    return nullptr;
     1700}
     1701
     1702AccessibilityTextMarker AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*)
    16611703{
    16621704    return nullptr;
     
    18501892        { "previousParagraphStartTextMarkerForTextMarker", previousParagraphStartTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    18511893        { "nextParagraphEndTextMarkerForTextMarker", nextParagraphEndTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     1894        { "sentenceTextMarkerRangeForTextMarker", sentenceTextMarkerRangeForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     1895        { "previousSentenceStartTextMarkerForTextMarker", previousSentenceStartTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     1896        { "nextSentenceEndTextMarkerForTextMarker", nextSentenceEndTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    18521897        { "setSelectedChild", setSelectedChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    18531898        { "setSelectedChildAtIndex", setSelectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
  • trunk/Tools/DumpRenderTree/AccessibilityUIElement.h

    r196546 r196699  
    268268    AccessibilityTextMarker previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker*);
    269269    AccessibilityTextMarker nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker*);
     270    AccessibilityTextMarkerRange sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*);
     271    AccessibilityTextMarker previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*);
     272    AccessibilityTextMarker nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*);
    270273    AccessibilityTextMarkerRange selectedTextMarkerRange();
    271274    void resetSelectedTextMarkerRange();
  • trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm

    r196546 r196699  
    586586}
    587587
     588AccessibilityTextMarkerRange AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
     589{
     590    return nullptr;
     591}
     592
     593AccessibilityTextMarker AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*)
     594{
     595    return nullptr;
     596}
     597
     598AccessibilityTextMarker AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*)
     599{
     600    return nullptr;
     601}
     602
    588603#endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(IOS)
    589604
  • trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm

    r196546 r196699  
    19171917}
    19181918
     1919AccessibilityTextMarkerRange AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker* textMarker)
     1920{
     1921    BEGIN_AX_OBJC_EXCEPTIONS
     1922    id textMarkerRange = [m_element accessibilityAttributeValue:@"AXSentenceTextMarkerRangeForTextMarker" forParameter:(id)textMarker->platformTextMarker()];
     1923    return AccessibilityTextMarkerRange(textMarkerRange);
     1924    END_AX_OBJC_EXCEPTIONS
     1925   
     1926    return nullptr;
     1927}
     1928
     1929AccessibilityTextMarker AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker* textMarker)
     1930{
     1931    BEGIN_AX_OBJC_EXCEPTIONS
     1932    id previousTextMarker = [m_element accessibilityAttributeValue:@"AXPreviousSentenceStartTextMarkerForTextMarker" forParameter:(id)textMarker->platformTextMarker()];
     1933    return AccessibilityTextMarker(previousTextMarker);
     1934    END_AX_OBJC_EXCEPTIONS
     1935   
     1936    return nullptr;
     1937}
     1938
     1939AccessibilityTextMarker AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker* textMarker)
     1940{
     1941    BEGIN_AX_OBJC_EXCEPTIONS
     1942    id nextTextMarker = [m_element accessibilityAttributeValue:@"AXNextSentenceEndTextMarkerForTextMarker" forParameter:(id)textMarker->platformTextMarker()];
     1943    return AccessibilityTextMarker(nextTextMarker);
     1944    END_AX_OBJC_EXCEPTIONS
     1945   
     1946    return nullptr;
     1947}
     1948
    19191949#endif // SUPPORTS_AX_TEXTMARKERS && PLATFORM(MAC)
    19201950
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp

    r196546 r196699  
    253253PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker*) { return nullptr; }
    254254PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker*) { return nullptr; }
     255PassRefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*) { return nullptr; }
     256PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*) { return nullptr; }
     257PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*) { return nullptr; }
    255258#endif
    256259
  • trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h

    r196546 r196699  
    259259    PassRefPtr<AccessibilityTextMarker> nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker*);
    260260    PassRefPtr<AccessibilityTextMarker> previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker*);
     261    PassRefPtr<AccessibilityTextMarkerRange> sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*);
     262    PassRefPtr<AccessibilityTextMarker> nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*);
     263    PassRefPtr<AccessibilityTextMarker> previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*);
    261264
    262265    // Returns an ordered list of supported actions for an element.
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl

    r196546 r196699  
    209209    AccessibilityTextMarker previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    210210    AccessibilityTextMarker nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
     211    AccessibilityTextMarkerRange sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker textMarker);
     212    AccessibilityTextMarker previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
     213    AccessibilityTextMarker nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker textMarker);
    211214
    212215    // Returns an ordered list of supported actions for an element.
  • trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm

    r196546 r196699  
    11321132}
    11331133
     1134PassRefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker* textMarker)
     1135{
     1136    return nullptr;
     1137}
     1138
     1139PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker* textMarker)
     1140{
     1141    return nullptr;
     1142}
     1143
     1144PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker* textMarker)
     1145{
     1146    return nullptr;
     1147}
     1148
    11341149JSRetainPtr<JSStringRef> AccessibilityUIElement::mathPostscriptsDescription() const
    11351150{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm

    r196546 r196699  
    19441944}
    19451945
     1946PassRefPtr<AccessibilityTextMarkerRange> AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker* textMarker)
     1947{
     1948    BEGIN_AX_OBJC_EXCEPTIONS
     1949    id textMarkerRange = [m_element accessibilityAttributeValue:@"AXSentenceTextMarkerRangeForTextMarker" forParameter:(id)textMarker->platformTextMarker()];
     1950    return AccessibilityTextMarkerRange::create(textMarkerRange);
     1951    END_AX_OBJC_EXCEPTIONS
     1952   
     1953    return nullptr;
     1954}
     1955
     1956PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker* textMarker)
     1957{
     1958    BEGIN_AX_OBJC_EXCEPTIONS
     1959    id previousParagraphStartMarker = [m_element accessibilityAttributeValue:@"AXPreviousSentenceStartTextMarkerForTextMarker" forParameter:(id)textMarker->platformTextMarker()];
     1960    return AccessibilityTextMarker::create(previousParagraphStartMarker);
     1961    END_AX_OBJC_EXCEPTIONS
     1962   
     1963    return nullptr;
     1964}
     1965
     1966PassRefPtr<AccessibilityTextMarker> AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker* textMarker)
     1967{
     1968    BEGIN_AX_OBJC_EXCEPTIONS
     1969    id nextParagraphEndMarker = [m_element accessibilityAttributeValue:@"AXNextSentenceEndTextMarkerForTextMarker" forParameter:(id)textMarker->platformTextMarker()];
     1970    return AccessibilityTextMarker::create(nextParagraphEndMarker);
     1971    END_AX_OBJC_EXCEPTIONS
     1972   
     1973    return nullptr;
     1974}
     1975
    19461976static NSString *_convertMathMultiscriptPairsToString(NSArray *pairs)
    19471977{
Note: See TracChangeset for help on using the changeset viewer.