Changeset 86599 in webkit


Ignore:
Timestamp:
May 16, 2011 1:14:15 PM (13 years ago)
Author:
mitz@apple.com
Message:

<rdar://problem/9446653> REGRESSION (r84750): Moving by word stops at apostrophe mid-word
https://bugs.webkit.org/show_bug.cgi?id=60915

Reviewed by Darin Adler.

Source/WebCore:

CFStringTokenizer’s kCFStringTokenizerUnitWord considers “Here’s” as two separate tokens.
Switching to CFStringTokenizer in r84750 was an attempt to address an issue with Japanese word
boundaries for searches with WebFindOptionsAtWordStarts, but it turned out to be insufficient,
and in r86387 the Japanese word issue was addressed independently of text boundaries, so just
revert r84750.

  • platform/text/mac/TextBoundaries.mm:

(WebCore::findNextWordFromIndex):

LayoutTests:

  • editing/text-iterator/findString-expected.txt:
  • editing/text-iterator/findString.html:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r86595 r86599  
     12011-05-16  Dan Bernstein  <mitz@apple.com>
     2
     3        Reviewed by Darin Adler.
     4
     5        <rdar://problem/9446653> REGRESSION (r84750): Moving by word stops at apostrophe mid-word
     6        https://bugs.webkit.org/show_bug.cgi?id=60915
     7
     8        * editing/text-iterator/findString-expected.txt:
     9        * editing/text-iterator/findString.html:
     10
    1112011-05-16  Andrew Wilson  <atwilson@chromium.org>
    212
  • trunk/LayoutTests/editing/text-iterator/findString-expected.txt

    r86387 r86599  
    5050
    5151Searching for ‘org’ in ‘webkit.org’ with options [AtWordStarts]:
    52 PASS: Got a match at 7,10 as expected.
    5352PASS: Got no match as expected.
    5453
  • trunk/LayoutTests/editing/text-iterator/findString.html

    r86387 r86599  
    5151    testFindString("cocoa", "co", ["AtWordStarts"], [[0, 2], []]);
    5252
    53     testFindString("webkit.org", "org", ["AtWordStarts"], [[7, 10], []]);
     53    testFindString("webkit.org", "org", ["AtWordStarts"], [[]]);
    5454    testFindString("webkit.org", ".org", ["AtWordStarts"], [[6, 10], []]);
    5555
  • trunk/Source/WebCore/ChangeLog

    r86598 r86599  
     12011-05-16  Dan Bernstein  <mitz@apple.com>
     2
     3        Reviewed by Darin Adler.
     4
     5        <rdar://problem/9446653> REGRESSION (r84750): Moving by word stops at apostrophe mid-word
     6        https://bugs.webkit.org/show_bug.cgi?id=60915
     7
     8        CFStringTokenizer’s kCFStringTokenizerUnitWord considers “Here’s” as two separate tokens.
     9        Switching to CFStringTokenizer in r84750 was an attempt to address an issue with Japanese word
     10        boundaries for searches with WebFindOptionsAtWordStarts, but it turned out to be insufficient,
     11        and in r86387 the Japanese word issue was addressed independently of text boundaries, so just
     12        revert r84750.
     13
     14        * platform/text/mac/TextBoundaries.mm:
     15        (WebCore::findNextWordFromIndex):
     16
    1172011-05-16  David Kilzer  <ddkilzer@apple.com>
    218
  • trunk/Source/WebCore/platform/text/mac/TextBoundaries.mm

    r84750 r86599  
    11/*
    2  * Copyright (C) 2004, 2006, 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    1111 *    documentation and/or other materials provided with the distribution.
    1212 *
    13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
    14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
    17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    23  * THE POSSIBILITY OF SUCH DAMAGE.
     13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2424 */
    2525
     
    2727#import "TextBoundaries.h"
    2828
    29 #import <wtf/RetainPtr.h>
     29using namespace WTF::Unicode;
    3030
    3131namespace WebCore {
     
    4343}
    4444
    45 static CFStringTokenizerRef wordStringTokenizer(CFStringRef string)
    46 {
    47     static CFStringTokenizerRef stringTokenizer;
    48     if (stringTokenizer)
    49         CFStringTokenizerSetString(stringTokenizer, string, CFRangeMake(0, CFStringGetLength(string)));
    50     else
    51         stringTokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, string, CFRangeMake(0, CFStringGetLength(string)), kCFStringTokenizerUnitWord, 0);
    52 
    53     return stringTokenizer;
    54 }
    55 
    5645int findNextWordFromIndex(const UChar* chars, int len, int position, bool forward)
    57 {
    58     RetainPtr<CFStringRef> string(AdoptCF, CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, chars, len, kCFAllocatorNull));
    59     CFStringTokenizerRef stringTokenizer = wordStringTokenizer(string.get());
    60 
    61     CFIndex lastTokenStart = 0;
    62     while (true) {
    63         CFStringTokenizerTokenType tokenType = CFStringTokenizerAdvanceToNextToken(stringTokenizer);
    64         if (tokenType == kCFStringTokenizerTokenNone)
    65             return forward ? len : lastTokenStart;
    66 
    67         CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(stringTokenizer);
    68 
    69         if (!forward && tokenRange.location >= position)
    70             return lastTokenStart;
    71         if (forward && tokenRange.location + tokenRange.length > position)
    72             return tokenRange.location + tokenRange.length;
    73 
    74         lastTokenStart = tokenRange.location;
    75     }
     46{   
     47    NSString* string = [[NSString alloc] initWithCharactersNoCopy:const_cast<unichar*>(chars)
     48        length:len freeWhenDone:NO];
     49    NSAttributedString* attr = [[NSAttributedString alloc] initWithString:string];
     50    int result = [attr nextWordFromIndex:position forward:forward];
     51    [attr release];
     52    [string release];
     53    return result;
    7654}
    7755
Note: See TracChangeset for help on using the changeset viewer.