<rdar://problem/9446653> REGRESSION (r84750): Moving by word stops at apostrophe...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 May 2011 20:14:15 +0000 (20:14 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 May 2011 20:14:15 +0000 (20:14 +0000)
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:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@86599 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/editing/text-iterator/findString-expected.txt
LayoutTests/editing/text-iterator/findString.html
Source/WebCore/ChangeLog
Source/WebCore/platform/text/mac/TextBoundaries.mm

index c76b068..dc54166 100644 (file)
@@ -1,3 +1,13 @@
+2011-05-16  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Darin Adler.
+
+        <rdar://problem/9446653> REGRESSION (r84750): Moving by word stops at apostrophe mid-word
+        https://bugs.webkit.org/show_bug.cgi?id=60915
+
+        * editing/text-iterator/findString-expected.txt:
+        * editing/text-iterator/findString.html:
+
 2011-05-16  Andrew Wilson  <atwilson@chromium.org>
 
         Unreviewed, rolling out r86589.
index 3ff507b..4f676b7 100644 (file)
@@ -49,7 +49,6 @@ PASS: Got a match at 0,2 as expected.
 PASS: Got no match as expected.
 
 Searching for ‘org’ in ‘webkit.org’ with options [AtWordStarts]:
-PASS: Got a match at 7,10 as expected.
 PASS: Got no match as expected.
 
 Searching for ‘.org’ in ‘webkit.org’ with options [AtWordStarts]:
index 5ea14c9..c322745 100644 (file)
@@ -50,7 +50,7 @@
     testFindString("cocoa", "co", [], [[0, 2], [2, 4], []]);
     testFindString("cocoa", "co", ["AtWordStarts"], [[0, 2], []]);
 
-    testFindString("webkit.org", "org", ["AtWordStarts"], [[7, 10], []]);
+    testFindString("webkit.org", "org", ["AtWordStarts"], [[]]);
     testFindString("webkit.org", ".org", ["AtWordStarts"], [[6, 10], []]);
 
     testFindString("webkit.org", "rg", ["AtWordStarts", "TreatMedialCapitalAsWordStart"], [[]]);
index 87e327c..ffafbbb 100644 (file)
@@ -1,3 +1,19 @@
+2011-05-16  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Darin Adler.
+
+        <rdar://problem/9446653> REGRESSION (r84750): Moving by word stops at apostrophe mid-word
+        https://bugs.webkit.org/show_bug.cgi?id=60915
+
+        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):
+
 2011-05-16  David Kilzer  <ddkilzer@apple.com>
 
         <http://webkit.org/b/60913> C++ exceptions should not be enabled when building with llvm-gcc-4.2
index cca981d..bd7ddf8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004, 2006, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
 #import "config.h"
 #import "TextBoundaries.h"
 
-#import <wtf/RetainPtr.h>
+using namespace WTF::Unicode;
 
 namespace WebCore {
 
@@ -42,37 +42,15 @@ void findWordBoundary(const UChar* chars, int len, int position, int* start, int
     *end = range.location + range.length;
 }
 
-static CFStringTokenizerRef wordStringTokenizer(CFStringRef string)
-{
-    static CFStringTokenizerRef stringTokenizer;
-    if (stringTokenizer)
-        CFStringTokenizerSetString(stringTokenizer, string, CFRangeMake(0, CFStringGetLength(string)));
-    else
-        stringTokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, string, CFRangeMake(0, CFStringGetLength(string)), kCFStringTokenizerUnitWord, 0);
-
-    return stringTokenizer;
-}
-
 int findNextWordFromIndex(const UChar* chars, int len, int position, bool forward)
-{
-    RetainPtr<CFStringRef> string(AdoptCF, CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, chars, len, kCFAllocatorNull));
-    CFStringTokenizerRef stringTokenizer = wordStringTokenizer(string.get());
-
-    CFIndex lastTokenStart = 0;
-    while (true) {
-        CFStringTokenizerTokenType tokenType = CFStringTokenizerAdvanceToNextToken(stringTokenizer);
-        if (tokenType == kCFStringTokenizerTokenNone)
-            return forward ? len : lastTokenStart;
-
-        CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(stringTokenizer);
-
-        if (!forward && tokenRange.location >= position)
-            return lastTokenStart;
-        if (forward && tokenRange.location + tokenRange.length > position)
-            return tokenRange.location + tokenRange.length;
-
-        lastTokenStart = tokenRange.location;
-    }
+{   
+    NSString* string = [[NSString alloc] initWithCharactersNoCopy:const_cast<unichar*>(chars)
+        length:len freeWhenDone:NO];
+    NSAttributedString* attr = [[NSAttributedString alloc] initWithString:string];
+    int result = [attr nextWordFromIndex:position forward:forward];
+    [attr release];
+    [string release];
+    return result;
 }
 
 }