Garbage in page tiles when document is too long.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Dec 2015 07:11:16 +0000 (07:11 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Dec 2015 07:11:16 +0000 (07:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151906
rdar://problem/23695858

Reviewed by Simon Fraser.

Source/WebCore:

This patch partially fixes the broken concept(webkit.org/b/151908) of having a nearlyMax/2 sized rectangle to define infiniteness.
(see LayoutRect::infiniteRect() and ClipRect::isInfinite())

Covered by existing test.

* rendering/ClipRect.h: Branch for infinite clipping.
(WebCore::ClipRect::intersect):
(WebCore::ClipRect::intersects):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::clipToRect): Do not clip when clipping is infinite.
(WebCore::RenderLayer::restoreClip):
(WebCore::RenderLayer::calculateClipRects):

LayoutTests:

* platform/ios-simulator/fast/block/float/overhanging-tall-block-expected.txt:
* platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.txt:
* platform/mac/fast/block/float/overhanging-tall-block-expected.txt:

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

LayoutTests/ChangeLog
LayoutTests/platform/ios-simulator/fast/block/float/overhanging-tall-block-expected.txt
LayoutTests/platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.txt
LayoutTests/platform/mac/fast/block/float/overhanging-tall-block-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/rendering/ClipRect.h
Source/WebCore/rendering/RenderLayer.cpp

index 93c37cf..428c8fd 100644 (file)
@@ -1,3 +1,15 @@
+2015-12-04  Zalan Bujtas  <zalan@apple.com>
+
+        Garbage in page tiles when document is too long.
+        https://bugs.webkit.org/show_bug.cgi?id=151906
+        rdar://problem/23695858
+
+        Reviewed by Simon Fraser.
+
+        * platform/ios-simulator/fast/block/float/overhanging-tall-block-expected.txt:
+        * platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.txt:
+        * platform/mac/fast/block/float/overhanging-tall-block-expected.txt:
+
 2015-12-04  Brady Eidson  <beidson@apple.com>
 
         Modern IDB: Add some more custom exception messages, passing some more tests.
index d0e09b6..b425903 100644 (file)
@@ -1,11 +1,11 @@
 layer at (0,0) size 800x33554431
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x33554431 backgroundClip at (0,0) size 800x16777216 clip at (0,0) size 800x16777216 outlineClip at (0,0) size 800x16777216
+layer at (0,0) size 800x33554431
   RenderBlock {HTML} at (0,0) size 800x33554431
     RenderBody {BODY} at (8,8) size 784x33554423
       RenderBlock {DIV} at (0,0) size 784x33554431
       RenderBlock {DIV} at (0,33554431) size 784x0
       RenderBlock {DIV} at (0,33554431) size 784x0
-layer at (10,11) size 135x33554431 backgroundClip at (10,11) size 135x16777205 clip at (11,12) size 133x16777204 outlineClip at (0,0) size 800x16777216
+layer at (10,11) size 135x33554431 backgroundClip at (10,11) size 135x33554421 clip at (11,12) size 133x33554420 outlineClip at (0,0) size 800x33554431
   RenderTextControl {TEXTAREA} at (2,3) size 135x33554428 [bgcolor=#FFFFFF] [border: (1px solid #4C4C4C)]
     RenderBlock {DIV} at (3,3) size 129x14
index 15b7366..1e6f4e8 100644 (file)
@@ -1,11 +1,11 @@
 layer at (0,0) size 800x33554431
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x33554431 backgroundClip at (0,0) size 800x16777216 clip at (0,0) size 800x16777216 outlineClip at (0,0) size 800x16777216
+layer at (0,0) size 800x33554431
   RenderBlock {HTML} at (0,0) size 800x33554431
     RenderBody {BODY} at (8,8) size 784x33554423
       RenderBlock {DIV} at (0,0) size 784x33554431
       RenderBlock {DIV} at (0,33554431) size 784x0
       RenderBlock {DIV} at (0,33554431) size 784x0
-layer at (10,11) size 161x33554431 backgroundClip at (10,11) size 161x16777205 clip at (11,12) size 159x16777204 outlineClip at (0,0) size 800x16777216
+layer at (10,11) size 161x33554431 backgroundClip at (10,11) size 161x33554421 clip at (11,12) size 159x33554420 outlineClip at (0,0) size 800x33554431
   RenderTextControl {TEXTAREA} at (2,3) size 161x33554428 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
     RenderBlock {DIV} at (3,3) size 155x13
index 7de0511..ba82952 100644 (file)
@@ -1,11 +1,11 @@
 layer at (0,0) size 800x33554431
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x33554431 backgroundClip at (0,0) size 800x16777216 clip at (0,0) size 800x16777216 outlineClip at (0,0) size 800x16777216
+layer at (0,0) size 800x33554431
   RenderBlock {HTML} at (0,0) size 800x33554431
     RenderBody {BODY} at (8,8) size 784x33554423
       RenderBlock {DIV} at (0,0) size 784x33554431
       RenderBlock {DIV} at (0,33554431) size 784x0
       RenderBlock {DIV} at (0,33554431) size 784x0
-layer at (10,11) size 152x33554431 backgroundClip at (10,11) size 152x16777205 clip at (11,12) size 150x16777204 outlineClip at (0,0) size 800x16777216
+layer at (10,11) size 152x33554431 backgroundClip at (10,11) size 152x33554421 clip at (11,12) size 150x33554420 outlineClip at (0,0) size 800x33554431
   RenderTextControl {TEXTAREA} at (2,3) size 152x33554428 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
     RenderBlock {DIV} at (3,3) size 146x13
index 54a020d..d113d42 100644 (file)
@@ -1,3 +1,24 @@
+2015-12-04  Zalan Bujtas  <zalan@apple.com>
+
+        Garbage in page tiles when document is too long.
+        https://bugs.webkit.org/show_bug.cgi?id=151906
+        rdar://problem/23695858
+
+        Reviewed by Simon Fraser.
+
+        This patch partially fixes the broken concept(webkit.org/b/151908) of having a nearlyMax/2 sized rectangle to define infiniteness.
+        (see LayoutRect::infiniteRect() and ClipRect::isInfinite())
+
+        Covered by existing test.
+
+        * rendering/ClipRect.h: Branch for infinite clipping.
+        (WebCore::ClipRect::intersect):
+        (WebCore::ClipRect::intersects):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::clipToRect): Do not clip when clipping is infinite.
+        (WebCore::RenderLayer::restoreClip):
+        (WebCore::RenderLayer::calculateClipRects):
+
 2015-12-04  Brady Eidson  <beidson@apple.com>
 
         Modern IDB: Add some more custom exception messages, passing some more tests.
index f9fe53b..47b09a3 100644 (file)
@@ -52,13 +52,13 @@ public:
     bool operator!=(const ClipRect& other) const { return rect() != other.rect() || affectedByRadius() != other.affectedByRadius(); }
     bool operator!=(const LayoutRect& otherRect) const { return rect() != otherRect; }
     
-    void intersect(const LayoutRect& other) { m_rect.intersect(other); }
+    void intersect(const LayoutRect& other);
     void intersect(const ClipRect& other);
     void move(LayoutUnit x, LayoutUnit y) { m_rect.move(x, y); }
     void move(const LayoutSize& size) { m_rect.move(size); }
     void moveBy(const LayoutPoint& point) { m_rect.moveBy(point); }
     
-    bool intersects(const LayoutRect& rect) const { return m_rect.intersects(rect); }
+    bool intersects(const LayoutRect&) const;
     bool intersects(const HitTestLocation&) const;
 
     bool isEmpty() const { return m_rect.isEmpty(); }
@@ -73,13 +73,30 @@ private:
     bool m_affectedByRadius = false;
 };
 
+inline void ClipRect::intersect(const LayoutRect& other)
+{
+    if (other.isInfinite())
+        return;
+    if (isInfinite())
+        m_rect = other;
+    else
+        m_rect.intersect(other);
+}
+
 inline void ClipRect::intersect(const ClipRect& other)
 {
-    m_rect.intersect(other.rect());
+    intersect(other.rect());
     if (other.affectedByRadius())
         m_affectedByRadius = true;
 }
     
+inline bool ClipRect::intersects(const LayoutRect& rect) const
+{
+    if (isInfinite() || rect.isInfinite())
+        return true;
+    return m_rect.intersects(rect);
+}
+
 inline ClipRect intersection(const ClipRect& a, const ClipRect& b)
 {
     ClipRect c = a;
index 72365f8..d6a7be9 100644 (file)
@@ -3802,8 +3802,7 @@ static bool inContainingBlockChain(RenderLayer* startLayer, RenderLayer* endLaye
 void RenderLayer::clipToRect(const LayerPaintingInfo& paintingInfo, GraphicsContext& context, const ClipRect& clipRect, BorderRadiusClippingRule rule)
 {
     float deviceScaleFactor = renderer().document().deviceScaleFactor();
-
-    bool needsClipping = clipRect.rect() != paintingInfo.paintDirtyRect;
+    bool needsClipping = !clipRect.isInfinite() && clipRect.rect() != paintingInfo.paintDirtyRect;
     if (needsClipping || clipRect.affectedByRadius())
         context.save();
 
@@ -3832,7 +3831,7 @@ void RenderLayer::clipToRect(const LayerPaintingInfo& paintingInfo, GraphicsCont
 
 void RenderLayer::restoreClip(GraphicsContext& context, const LayoutRect& paintDirtyRect, const ClipRect& clipRect)
 {
-    if (clipRect.rect() != paintDirtyRect || clipRect.affectedByRadius())
+    if ((!clipRect.isInfinite() && clipRect.rect() != paintDirtyRect) || clipRect.affectedByRadius())
         context.restore();
 }
 
@@ -5762,6 +5761,9 @@ bool RenderLayer::intersectsDamageRect(const LayoutRect& layerBounds, const Layo
     if (isRootLayer() || renderer().isDocumentElementRenderer())
         return true;
 
+    if (damageRect.isInfinite())
+        return true;
+
     if (damageRect.isEmpty())
         return false;