<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: https://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 c76b0683811d0884d8fbb7fa344cc3b196dee109..dc5416629a5739e79c0e65c3488be743171c5e32 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 3ff507b44385383036cf0d1dddd031f21449e4e6..4f676b786747ce6f24ab400e3ec9f600017207c9 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 5ea14c924afc3ea7092e9927715090f336ee482b..c322745db1871e96d127207ee65b5a04ca0cf265 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 87e327c096b4e313c348b90e8892e098ab90a332..ffafbbbbb903818da475b9b1b40acd504eff3659 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 cca981d0783e8dd696ec2177d1ffe0e9d42b11a3..bd7ddf8a0f828e5663dc4fa22b7ba420817323d5 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;
 }
 
 }