Source/WebCore: <rdar://problem/8970549> WebFindOptionsAtWordStarts still fails with...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 May 2011 22:28:09 +0000 (22:28 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 May 2011 22:28:09 +0000 (22:28 +0000)
https://bugs.webkit.org/show_bug.cgi?id=60730

Reviewed by Sam Weinig.

* editing/TextIterator.cpp:
(WebCore::SearchBuffer::isWordStartMatch): Consider all positions before a CJK ideograph as
word starts.

LayoutTests: Updated results for <rdar://problem/8970549> WebFindOptionsAtWordStarts still fails with some Japanese words
https://bugs.webkit.org/show_bug.cgi?id=60730

Reviewed by Sam Weinig.

* editing/text-iterator/findString-expected.txt:
* editing/text-iterator/findString.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@86387 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/editing/TextIterator.cpp

index 3fb0c0d70a725cfb59239d9b062aa0ea78ad63e6..c1d42ddc23bfbf07ac177cd7ee00f8789f09af8e 100644 (file)
@@ -1,3 +1,13 @@
+2011-05-12  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Updated results for <rdar://problem/8970549> WebFindOptionsAtWordStarts still fails with some Japanese words
+        https://bugs.webkit.org/show_bug.cgi?id=60730
+
+        * editing/text-iterator/findString-expected.txt:
+        * editing/text-iterator/findString.html:
+
 2011-05-12  Daniel Bates  <dbates@rim.com>
 
         Reviewed by Kenneth Rohde Christiansen.
index f90c19944d3c4b5be920d73741c18da79858f7eb..3ff507b44385383036cf0d1dddd031f21449e4e6 100644 (file)
@@ -104,6 +104,7 @@ Searching for ‘P64’ in ‘LP64’ with options [AtWordStarts, TreatMedialCap
 PASS: Got no match as expected.
 
 Searching for ‘動戦士’ in ‘起動戦士’ with options [AtWordStarts]:
+PASS: Got a match at 1,4 as expected.
 PASS: Got no match as expected.
 
 Searching for ‘戦士’ in ‘起動戦士’ with options [AtWordStarts]:
@@ -111,6 +112,7 @@ PASS: Got a match at 2,4 as expected.
 PASS: Got no match as expected.
 
 Searching for ‘士’ in ‘起動戦士’ with options [AtWordStarts]:
+PASS: Got a match at 3,4 as expected.
 PASS: Got no match as expected.
 
 Searching for ‘a’ in long string with options [AtWordStarts]:
index cba5adef5107c828b1857b4f6c0a8af1e2bbe8d7..5ea14c924afc3ea7092e9927715090f336ee482b 100644 (file)
@@ -71,9 +71,9 @@
     testFindString("LP64", "64", ["AtWordStarts", "TreatMedialCapitalAsWordStart"], [[2, 4], []]);
     testFindString("LP64", "P64", ["AtWordStarts", "TreatMedialCapitalAsWordStart"], [[]]);
 
-    testFindString("\u8d77\u52d5\u6226\u58eb", "\u52d5\u6226\u58eb", ["AtWordStarts"], [[]]);
+    testFindString("\u8d77\u52d5\u6226\u58eb", "\u52d5\u6226\u58eb", ["AtWordStarts"], [[1, 4], []]);
     testFindString("\u8d77\u52d5\u6226\u58eb", "\u6226\u58eb", ["AtWordStarts"], [[2, 4], []]);
-    testFindString("\u8d77\u52d5\u6226\u58eb", "\u58eb", ["AtWordStarts"], [[]]);
+    testFindString("\u8d77\u52d5\u6226\u58eb", "\u58eb", ["AtWordStarts"], [[3, 4], []]);
 
     const searchBufferSize = 8192;
     const searchBufferOverlapSize = searchBufferSize / 4;
index 0b06d47534f561078792f01442e9bbb1e18c9a83..75127ada76fa7fef6aba574023e2b99f8d99bca6 100644 (file)
@@ -1,3 +1,14 @@
+2011-05-12  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        <rdar://problem/8970549> WebFindOptionsAtWordStarts still fails with some Japanese words
+        https://bugs.webkit.org/show_bug.cgi?id=60730
+
+        * editing/TextIterator.cpp:
+        (WebCore::SearchBuffer::isWordStartMatch): Consider all positions before a CJK ideograph as
+        word starts.
+
 2011-05-12  Levi Weintraub  <leviw@chromium.org>
 
         Reviewed by Eric Seidel.
index c3be2779cd734d8a87efc36080ef363c7a484323..565d1c67d01a53512a66d2d870283ff420c7f53e 100644 (file)
@@ -2040,11 +2040,12 @@ inline bool SearchBuffer::isWordStartMatch(size_t start, size_t length) const
     if (!start)
         return true;
 
+    int size = m_buffer.size();
+    int offset = start;
+    UChar32 firstCharacter;
+    U16_GET(m_buffer.data(), 0, offset, size, firstCharacter);
+
     if (m_options & TreatMedialCapitalAsWordStart) {
-        int size = m_buffer.size();
-        int offset = start;
-        UChar32 firstCharacter;
-        U16_GET(m_buffer.data(), 0, offset, size, firstCharacter);
         UChar32 previousCharacter;
         U16_PREV(m_buffer.data(), 0, offset, previousCharacter);
 
@@ -2076,6 +2077,11 @@ inline bool SearchBuffer::isWordStartMatch(size_t start, size_t length) const
         }
     }
 
+    // Chinese and Japanese lack word boundary marks, and there is no clear agreement on what constitutes
+    // a word, so treat the position before any CJK character as a word start.
+    if (Font::isCJKIdeographOrSymbol(firstCharacter))
+        return true;
+
     size_t wordBreakSearchStart = start + length;
     while (wordBreakSearchStart > start)
         wordBreakSearchStart = findNextWordFromIndex(m_buffer.data(), m_buffer.size(), wordBreakSearchStart, false /* backwards */);