Reviewed by Oliver and Geoff
authorsullivan@apple.com <sullivan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Dec 2007 18:49:23 +0000 (18:49 +0000)
committersullivan@apple.com <sullivan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Dec 2007 18:49:23 +0000 (18:49 +0000)
        - fix <rdar://problem/5536858> Yellow highlight for find results is sometimes shorter
          than white "hole" behind it

        * rendering/RenderText.cpp:
        (WebCore::RenderText::addLineBoxRects):
        respect useSelectionHeight in all cases; we were only respecting it in one of the two cases

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

WebCore/ChangeLog
WebCore/rendering/RenderText.cpp

index 2026c06943250b37f2d1820cad353f363ac52443..0093e682e6e7392d07ae0e645382a637e19fa47c 100644 (file)
@@ -1,3 +1,14 @@
+2007-12-20  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Oliver and Geoff
+        
+        - fix <rdar://problem/5536858> Yellow highlight for find results is sometimes shorter 
+          than white "hole" behind it
+
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::addLineBoxRects):
+        respect useSelectionHeight in all cases; we were only respecting it in one of the two cases
+
 2007-12-20  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Darin Adler.
index dfd77ee4b650bf779d869ca6c9eb681281f1b39e..beb365c8d0f95742387ca7c9dd836a3ee8952cee 100644 (file)
@@ -197,13 +197,29 @@ void RenderText::absoluteRects(Vector<IntRect>& rects, int tx, int ty, bool)
 
 void RenderText::addLineBoxRects(Vector<IntRect>& rects, unsigned start, unsigned end, bool useSelectionHeight)
 {
+    // Work around signed/unsigned issues. This function takes unsigneds, and is often passed UINT_MAX
+    // to mean "all the way to the end". InlineTextBox coordinates are unsigneds, so changing this 
+    // function to take ints causes various internal mismatches. But selectionRect takes ints, and 
+    // passing UINT_MAX to it causes trouble. Ideally we'd change selectionRect to take unsigneds, but 
+    // that would cause many ripple effects, so for now we'll just clamp our unsigned parameters to INT_MAX.
+    ASSERT(end == UINT_MAX || end <= INT_MAX);
+    ASSERT(start <= INT_MAX);
+    start = min(start, static_cast<unsigned>(INT_MAX));
+    end = min(end, static_cast<unsigned>(INT_MAX));
+    
     int x, y;
     absolutePositionForContent(x, y);
 
     for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) {
-        if (start <= box->start() && box->end() <= end)
-            rects.append(IntRect(x + box->xPos(), y + box->yPos(), box->width(), box->height()));
-        else {
+        if (start <= box->start() && box->end() <= end) {
+            IntRect r = IntRect(x + box->xPos(), y + box->yPos(), box->width(), box->height());
+            if (useSelectionHeight) {
+                IntRect selectionRect = box->selectionRect(x, y, start, end);
+                r.setHeight(selectionRect.height());
+                r.setY(selectionRect.y());
+            }
+            rects.append(r);
+        } else {
             unsigned realEnd = min(box->end() + 1, end); // box->end() points at the last char, not after it
             IntRect r = box->selectionRect(x, y, start, realEnd);
             if (!r.isEmpty()) {