Reviewed by Darin Adler.
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Apr 2006 17:51:54 +0000 (17:51 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Apr 2006 17:51:54 +0000 (17:51 +0000)
        - fixed <rdar://problem/4509328> highlight all matches hangs when searching for tab character on www.google.com (and others)

        For reasons not yet completely understood, searching for a tab character on some pages (Google, Amazon) finds a match
        with a non-collapsed range but then claims that the end visible position of the match is the original start visible
        position of the search range. This was causing the highlightAllMatches code to loop forever. Fixed the loop by
        checking for the non-advancing search range explicitly. I'm going to track down a reduction of the bogus
        search-for-tab issue, and write that up as a separate bug (that bug is not a regression; you can "find" a tab on
        google in Tiger also).

        * page/Frame.cpp:
        (WebCore::Frame::highlightAllMatchesForString):
        break the loop if the search range hasn't advanced

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

WebCore/ChangeLog
WebCore/page/Frame.cpp

index fd989a29b4bb922fdb2691b78ec3712724ed8db4..c6232205a3f3dbbec35a7c4f7dd9798ac2521179 100644 (file)
@@ -1,3 +1,20 @@
+2006-04-11  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Darin Adler.
+        
+        - fixed <rdar://problem/4509328> highlight all matches hangs when searching for tab character on www.google.com (and others)
+        
+        For reasons not yet completely understood, searching for a tab character on some pages (Google, Amazon) finds a match
+        with a non-collapsed range but then claims that the end visible position of the match is the original start visible 
+        position of the search range. This was causing the highlightAllMatches code to loop forever. Fixed the loop by 
+        checking for the non-advancing search range explicitly. I'm going to track down a reduction of the bogus 
+        search-for-tab issue, and write that up as a separate bug (that bug is not a regression; you can "find" a tab on 
+        google in Tiger also).
+
+        * page/Frame.cpp:
+        (WebCore::Frame::highlightAllMatchesForString):
+        break the loop if the search range hasn't advanced
+
 2006-04-10  Darin Adler  <darin@apple.com>
 
         Rubber-stamped by John Sullivan (except for pbxproj change).
index 2bae759d8578924868fc4490db33ea23946a1e77..8fabf3f2f93fc7e9a8faa5513e9db9261b6fe3e0 100644 (file)
@@ -3204,10 +3204,16 @@ unsigned Frame::highlightAllMatchesForString(const String& target, bool caseFlag
         if (resultRange->collapsed(exception))
             break;
         
+        // A non-collapsed result range can in some funky whitespace cases still not
+        // advance the range's start position (4509328). Break to avoid infinite loop.
+        VisiblePosition newStart = endVisiblePosition(resultRange.get(), DOWNSTREAM);
+        if (newStart == startVisiblePosition(searchRange.get(), DOWNSTREAM))
+            break;
+
         ++matchCount;
-        document()->addMarker(resultRange.get(), DocumentMarker::TextMatch);
+        document()->addMarker(resultRange.get(), DocumentMarker::TextMatch);        
         
-        setStart(searchRange.get(), endVisiblePosition(resultRange.get(), DOWNSTREAM));
+        setStart(searchRange.get(), newStart);
     } while (true);
     
     return matchCount;