Title: [126071] trunk
Revision
126071
Author
[email protected]
Date
2012-08-20 14:32:03 -0700 (Mon, 20 Aug 2012)

Log Message

RenderGrid children should always be RenderBoxes
https://bugs.webkit.org/show_bug.cgi?id=94305

Reviewed by Abhishek Arya.

Source/WebCore:

During RenderGrid::layout, we assume all the children are RenderBoxes.
When removing children, if the last child is an anonymous block, we don't
want to remove the anonymous block for grids. Ensure this doesn't happen
by adding canCollapseAnonymousBlockChild to RenderBlock (flexboxen and
grid can override this method).

Test: fast/css-grid-layout/should-not-collapse-anonymous-blocks.html

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::removeChild): Check canCollapseAnonymousBlockChild().
* rendering/RenderBlock.h:
(WebCore::RenderBlock::canCollapseAnonymousBlockChild):
(RenderBlock):
* rendering/RenderDeprecatedFlexibleBox.h: canCollapseAnonymousBlockChild returns false.
* rendering/RenderFlexibleBox.h: canCollapseAnonymousBlockChild returns false.
* rendering/RenderGrid.h: canCollapseAnonymousBlockChild returns false.

LayoutTests:

Add test case from fuzzer.

* fast/css-grid-layout/should-not-collapse-anonymous-blocks-expected.txt: Added.
* fast/css-grid-layout/should-not-collapse-anonymous-blocks.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (126070 => 126071)


--- trunk/LayoutTests/ChangeLog	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/LayoutTests/ChangeLog	2012-08-20 21:32:03 UTC (rev 126071)
@@ -1,3 +1,15 @@
+2012-08-20  Tony Chang  <[email protected]>
+
+        RenderGrid children should always be RenderBoxes
+        https://bugs.webkit.org/show_bug.cgi?id=94305
+
+        Reviewed by Abhishek Arya.
+
+        Add test case from fuzzer.
+
+        * fast/css-grid-layout/should-not-collapse-anonymous-blocks-expected.txt: Added.
+        * fast/css-grid-layout/should-not-collapse-anonymous-blocks.html: Added.
+
 2012-08-20  Kenneth Russell  <[email protected]>
 
         Unreviewed, rolling out r126026.

Added: trunk/LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks-expected.txt (0 => 126071)


--- trunk/LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks-expected.txt	2012-08-20 21:32:03 UTC (rev 126071)
@@ -0,0 +1,3 @@
+This test passes if it does not crash.
+
+

Added: trunk/LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks.html (0 => 126071)


--- trunk/LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks.html	2012-08-20 21:32:03 UTC (rev 126071)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<script>
+if (window.testRunner) {
+    testRunner.overridePreference("WebKitCSSGridLayoutEnabled", 1);
+    testRunner.dumpAsText();
+}
+</script>
+<style>
+#a:nth-last-child(-n+2) {
+    -webkit-flow-into: body;
+}
+</style>
+<body>
+<p>This test passes if it does not crash.</p>
+<div style="display: -webkit-grid;">
+    <div id=a></div>
+    <div style="display: inline; "></div>
+</div>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (126070 => 126071)


--- trunk/Source/WebCore/ChangeLog	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/Source/WebCore/ChangeLog	2012-08-20 21:32:03 UTC (rev 126071)
@@ -1,3 +1,27 @@
+2012-08-20  Tony Chang  <[email protected]>
+
+        RenderGrid children should always be RenderBoxes
+        https://bugs.webkit.org/show_bug.cgi?id=94305
+
+        Reviewed by Abhishek Arya.
+
+        During RenderGrid::layout, we assume all the children are RenderBoxes.
+        When removing children, if the last child is an anonymous block, we don't
+        want to remove the anonymous block for grids. Ensure this doesn't happen
+        by adding canCollapseAnonymousBlockChild to RenderBlock (flexboxen and
+        grid can override this method).
+
+        Test: fast/css-grid-layout/should-not-collapse-anonymous-blocks.html
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::removeChild): Check canCollapseAnonymousBlockChild().
+        * rendering/RenderBlock.h:
+        (WebCore::RenderBlock::canCollapseAnonymousBlockChild):
+        (RenderBlock):
+        * rendering/RenderDeprecatedFlexibleBox.h: canCollapseAnonymousBlockChild returns false.
+        * rendering/RenderFlexibleBox.h: canCollapseAnonymousBlockChild returns false.
+        * rendering/RenderGrid.h: canCollapseAnonymousBlockChild returns false.
+
 2012-08-20  Kenneth Russell  <[email protected]>
 
         Unreviewed, rolling out r126026.

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (126070 => 126071)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2012-08-20 21:32:03 UTC (rev 126071)
@@ -1213,12 +1213,12 @@
     RenderBox::removeChild(oldChild);
 
     RenderObject* child = prev ? prev : next;
-    if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling() && !isFlexibleBoxIncludingDeprecated()) {
+    if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling() && canCollapseAnonymousBlockChild()) {
         // The removal has knocked us down to containing only a single anonymous
         // box.  We can go ahead and pull the content right back up into our
         // box.
         collapseAnonymousBoxChild(this, child);
-    } else if (((prev && prev->isAnonymousBlock()) || (next && next->isAnonymousBlock())) && !isFlexibleBoxIncludingDeprecated()) {
+    } else if (((prev && prev->isAnonymousBlock()) || (next && next->isAnonymousBlock())) && canCollapseAnonymousBlockChild()) {
         // It's possible that the removal has knocked us down to a single anonymous
         // block with pseudo-style element siblings (e.g. first-letter). If these
         // are floating, then we need to pull the content up also.

Modified: trunk/Source/WebCore/rendering/RenderBlock.h (126070 => 126071)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2012-08-20 21:32:03 UTC (rev 126071)
@@ -985,6 +985,8 @@
 
     virtual bool recomputeLogicalWidth();
 
+    virtual bool canCollapseAnonymousBlockChild() const { return true; }
+
 public:
     LayoutUnit offsetFromLogicalTopOfFirstPage() const;
     RenderRegion* regionAtBlockOffset(LayoutUnit) const;

Modified: trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h (126070 => 126071)


--- trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h	2012-08-20 21:32:03 UTC (rev 126071)
@@ -47,9 +47,9 @@
     void layoutVerticalBox(bool relayoutChildren);
 
     virtual bool avoidsFloats() const { return true; }
-
     virtual bool isDeprecatedFlexibleBox() const { return true; }
     virtual bool isStretchingChildren() const { return m_stretchingChildren; }
+    virtual bool canCollapseAnonymousBlockChild() const OVERRIDE { return false; }
 
     void placeChild(RenderBox* child, const LayoutPoint& location);
 

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.h (126070 => 126071)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2012-08-20 21:32:03 UTC (rev 126071)
@@ -45,6 +45,7 @@
 
     virtual bool isFlexibleBox() const OVERRIDE { return true; }
     virtual bool avoidsFloats() const OVERRIDE { return true; }
+    virtual bool canCollapseAnonymousBlockChild() const OVERRIDE { return false; }
     virtual void computePreferredLogicalWidths() OVERRIDE;
     virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
 

Modified: trunk/Source/WebCore/rendering/RenderGrid.h (126070 => 126071)


--- trunk/Source/WebCore/rendering/RenderGrid.h	2012-08-20 21:30:38 UTC (rev 126070)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2012-08-20 21:32:03 UTC (rev 126071)
@@ -41,6 +41,7 @@
     virtual void computePreferredLogicalWidths() OVERRIDE;
 
     virtual bool avoidsFloats() const OVERRIDE { return true; }
+    virtual bool canCollapseAnonymousBlockChild() const OVERRIDE { return false; }
 
 private:
     class GridTrack;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to