[Qt] Assert in GestureTapHighlighter.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 26 Mar 2012 11:56:53 +0000 (11:56 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 26 Mar 2012 11:56:53 +0000 (11:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=82187

Patch by Allan Sandfeld Jensen <allan.jensen@nokia.com> on 2012-03-26
Reviewed by Kenneth Rohde Christiansen.

Adjust the boundaries of the center-rect before performing the intersection test,
since adjusting the boundary may cause a new intersection.

* page/GestureTapHighlighter.cpp:

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

Source/WebCore/ChangeLog
Source/WebCore/page/GestureTapHighlighter.cpp

index 9c9f081145a9ca6a61314f28f6e05175412618d4..823376e99899f96d5bd54cc63722c342fe071cf4 100644 (file)
@@ -1,3 +1,15 @@
+2012-03-26  Allan Sandfeld Jensen  <allan.jensen@nokia.com>
+
+        [Qt] Assert in GestureTapHighlighter.
+        https://bugs.webkit.org/show_bug.cgi?id=82187
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Adjust the boundaries of the center-rect before performing the intersection test,
+        since adjusting the boundary may cause a new intersection.
+
+        * page/GestureTapHighlighter.cpp:
+
 2012-03-26  Antti Koivisto  <antti@apple.com>
 
         Split MediaList into internal and CSSOM types
index 55c8048b09821d56e28765ad1c52d00d3d7ab0f1..85e41a48708e064387d55ffa52aa609a2d8a0196 100644 (file)
@@ -95,6 +95,8 @@ inline bool strikes(const LayoutRect& a, const LayoutRect& b)
 
 inline void shiftXEdgesToContainIfStrikes(LayoutRect& rect, const LayoutRect& other)
 {
+    if (rect.isEmpty())
+        return;
     LayoutUnit leftSide = rect.x();
     LayoutUnit rightSide = rect.maxX();
 
@@ -156,6 +158,9 @@ Path pathForRenderer(RenderObject* o)
 
     // Add the first box, but merge it with the center boxes if it intersects.
     if (rects.size() && !rects.first().isEmpty()) {
+        // Adjust center boxes to boundary of first
+        if (drawableRects.size())
+            shiftXEdgesToContainIfStrikes(drawableRects.last(), rects.first());
         if (drawableRects.size() && drawableRects.last().intersects(rects.first()))
             drawableRects.last().unite(rects.first());
         else
@@ -164,19 +169,15 @@ Path pathForRenderer(RenderObject* o)
 
     // Add the last box, but merge it with the center boxes if it intersects.
     if (rects.size() > 1 && !rects.last().isEmpty()) {
+        // Adjust center boxes to boundary of last
+        if (drawableRects.size())
+            shiftXEdgesToContainIfStrikes(drawableRects.last(), rects.last());
         if (drawableRects.size() && drawableRects.last().intersects(rects.last()))
             drawableRects.last().unite(rects.last());
         else
             drawableRects.append(rects.last());
     }
 
-    // Adjust middle to boundaries of first and last.
-    if (drawableRects.size() == 3) {
-        LayoutRect& middle = drawableRects.at(1);
-        shiftXEdgesToContainIfStrikes(middle, drawableRects.at(0));
-        shiftXEdgesToContainIfStrikes(middle, drawableRects.at(2));
-    }
-
     for (size_t i = 0; i < drawableRects.size(); ++i) {
         LayoutRect prev = i ? drawableRects.at(i - 1) : LayoutRect();
         LayoutRect next = i < (drawableRects.size() - 1) ? drawableRects.at(i + 1) : LayoutRect();