[Services with UI] Selections are incorrect when selecting three lines.
authorenrica@apple.com <enrica@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Aug 2014 19:53:19 +0000 (19:53 +0000)
committerenrica@apple.com <enrica@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Aug 2014 19:53:19 +0000 (19:53 +0000)
https://bugs.webkit.org/show_bug.cgi?id=135989
<rdar://problem/18032571>

Reviewed by Tim Horton.

The stitching algorithm did not handle correctly the case of selections
over three lines if the middle line is composed of only one rectangle.

* WebProcess/WebPage/mac/ServicesOverlayController.mm:
(WebKit::stitchRects):

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

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/WebPage/mac/ServicesOverlayController.mm

index 080f2c7..76f6a0d 100644 (file)
@@ -1,3 +1,17 @@
+2014-08-15  Enrica Casucci  <enrica@apple.com>
+
+        [Services with UI] Selections are incorrect when selecting three lines.
+        https://bugs.webkit.org/show_bug.cgi?id=135989
+        <rdar://problem/18032571>
+
+        Reviewed by Tim Horton.
+
+        The stitching algorithm did not handle correctly the case of selections
+        over three lines if the middle line is composed of only one rectangle.
+
+        * WebProcess/WebPage/mac/ServicesOverlayController.mm:
+        (WebKit::stitchRects):
+
 2014-08-15  Tim Horton  <timothy_horton@apple.com>
 
         Service overlays stay fixed when <iframe> scrolls
index cdbff58..6062807 100644 (file)
@@ -279,7 +279,7 @@ static inline void stitchRects(Vector<LayoutRect>& rects)
     // First stitch together all the rects on the first line of the selection.
     size_t indexFromStart = 0;
     LayoutUnit firstTop = rects[indexFromStart].y();
-    LayoutRect& currentRect = rects[indexFromStart++];
+    LayoutRect& currentRect = rects[indexFromStart];
     while (indexFromStart < rects.size() && rects[indexFromStart].y() == firstTop)
         currentRect.unite(rects[indexFromStart++]);
     
@@ -294,18 +294,22 @@ static inline void stitchRects(Vector<LayoutRect>& rects)
     size_t indexFromEnd = rects.size() - 1;
     LayoutUnit lastTop = rects[indexFromEnd].y();
     LayoutRect lastRect = rects[indexFromEnd];
-    while (indexFromEnd != indexFromStart && rects[--indexFromEnd].y() == lastTop)
-        lastRect.unite(rects[indexFromEnd]);
+    while (indexFromEnd >= indexFromStart && rects[indexFromEnd].y() == lastTop)
+        lastRect.unite(rects[indexFromEnd--]);
     
-    if (indexFromEnd == indexFromStart) {
-        // All the rects are on two lines only. There is nothing else to do.
+    // indexFromStart is the index of the first rectangle on the second line.
+    // indexFromEnd is the index of the last rectangle on the second to the last line.
+    // if they are equal, there is one additional rectangle for the line in the middle.
+    if (indexFromEnd == indexFromStart)
+        newRects.append(rects[indexFromStart]);
+    
+    if (indexFromEnd <= indexFromStart) {
+        // There are no more rects to stitch. Just append the last line.
         newRects.append(lastRect);
         rects.swap(newRects);
         return;
     }
     
-    // indexFromStart is the index of the first rectangle on the second line.
-    // indexFromEnd is the index of the last rectangle on the second to the last line.
     // Stitch together all the rects after the first line until the second to the last included.
     currentRect = rects[indexFromStart];
     while (indexFromStart != indexFromEnd)