<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[174946] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/174946">174946</a></dd>
<dt>Author</dt> <dd>rego@igalia.com</dd>
<dt>Date</dt> <dd>2014-10-21 05:11:29 -0700 (Tue, 21 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>ASSERTION FAILED: !gridWasPopulated() in WebCore::RenderGrid::placeItemsOnGrid
https://bugs.webkit.org/show_bug.cgi?id=136939

Reviewed by Darin Adler.

Source/WebCore:

In some particular situations computeIntrinsicLogicalWidths() is called
in the middle of layoutGridItems(). In these cases we do not need to
populate the grid again, so we should avoid calling placeItemsOnGrid().
In addition, we do not need to clean the grid either, as that will be
done later by layoutGridItems().

Test: fast/css-grid-layout/grid-was-populated-assert.html

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::computeIntrinsicLogicalWidths): Avoid calls to
placeItemsOnGrid() and clearGrid() if the grid was already populated.
* rendering/RenderGrid.h: Move gridWasPopulated() header out of the
debug ifdefs.

LayoutTests:

Added a test case to reproduce the crash in debug mode.

* fast/css-grid-layout/grid-was-populated-assert-expected.txt: Added.
* fast/css-grid-layout/grid-was-populated-assert.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderGridcpp">trunk/Source/WebCore/rendering/RenderGrid.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderGridh">trunk/Source/WebCore/rendering/RenderGrid.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcssgridlayoutgridwaspopulatedassertexpectedtxt">trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutgridwaspopulatedasserthtml">trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (174945 => 174946)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-10-21 11:13:53 UTC (rev 174945)
+++ trunk/LayoutTests/ChangeLog        2014-10-21 12:11:29 UTC (rev 174946)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2014-10-21  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
+
+        ASSERTION FAILED: !gridWasPopulated() in WebCore::RenderGrid::placeItemsOnGrid
+        https://bugs.webkit.org/show_bug.cgi?id=136939
+
+        Reviewed by Darin Adler.
+
+        Added a test case to reproduce the crash in debug mode.
+
+        * fast/css-grid-layout/grid-was-populated-assert-expected.txt: Added.
+        * fast/css-grid-layout/grid-was-populated-assert.html: Added.
+
</ins><span class="cx"> 2014-10-17  Jeffrey Pfau  &lt;jpfau@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Ensure attached frame count doesn't exceed the maximum allowed frames
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutgridwaspopulatedassertexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert-expected.txt (0 => 174946)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert-expected.txt        2014-10-21 12:11:29 UTC (rev 174946)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+This test passes if it does not crash in debug mode.
+
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutgridwaspopulatedasserthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert.html (0 => 174946)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert.html                                (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-was-populated-assert.html        2014-10-21 12:11:29 UTC (rev 174946)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script&gt;
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+    }
+    &lt;/script&gt;
+    &lt;style&gt;
+    details {
+        display: -webkit-grid;
+        -webkit-columns: 5;
+    }
+    div {
+        display: -webkit-grid;
+    }
+    input {
+        -webkit-columns: 5;
+    }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;p&gt;This test passes if it does not crash in debug mode.&lt;/p&gt;
+    &lt;details open&gt;
+        &lt;button&gt;
+            &lt;div&gt;
+                &lt;input placeholder=&quot;testing&quot; /&gt;
+            &lt;/div&gt;
+        &lt;/button&gt;
+    &lt;/details&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (174945 => 174946)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-21 11:13:53 UTC (rev 174945)
+++ trunk/Source/WebCore/ChangeLog        2014-10-21 12:11:29 UTC (rev 174946)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2014-10-21  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
+
+        ASSERTION FAILED: !gridWasPopulated() in WebCore::RenderGrid::placeItemsOnGrid
+        https://bugs.webkit.org/show_bug.cgi?id=136939
+
+        Reviewed by Darin Adler.
+
+        In some particular situations computeIntrinsicLogicalWidths() is called
+        in the middle of layoutGridItems(). In these cases we do not need to
+        populate the grid again, so we should avoid calling placeItemsOnGrid().
+        In addition, we do not need to clean the grid either, as that will be
+        done later by layoutGridItems().
+
+        Test: fast/css-grid-layout/grid-was-populated-assert.html
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::computeIntrinsicLogicalWidths): Avoid calls to
+        placeItemsOnGrid() and clearGrid() if the grid was already populated.
+        * rendering/RenderGrid.h: Move gridWasPopulated() header out of the
+        debug ifdefs.
+
</ins><span class="cx"> 2014-10-21  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Cairo] Make dashPattern, dotPattern in GraphicsContext::setPlatformStrokeStyle() const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (174945 => 174946)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp        2014-10-21 11:13:53 UTC (rev 174945)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp        2014-10-21 12:11:29 UTC (rev 174946)
</span><span class="lines">@@ -242,7 +242,9 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::computeIntrinsicLogicalWidths(LayoutUnit&amp; minLogicalWidth, LayoutUnit&amp; maxLogicalWidth) const
</span><span class="cx"> {
</span><del>-    const_cast&lt;RenderGrid*&gt;(this)-&gt;placeItemsOnGrid();
</del><ins>+    bool wasPopulated = gridWasPopulated();
+    if (!wasPopulated)
+        const_cast&lt;RenderGrid*&gt;(this)-&gt;placeItemsOnGrid();
</ins><span class="cx"> 
</span><span class="cx">     GridSizingData sizingData(gridColumnCount(), gridRowCount());
</span><span class="cx">     LayoutUnit availableLogicalSpace = 0;
</span><span class="lines">@@ -259,7 +261,8 @@
</span><span class="cx">         // FIXME: This should add in the scrollbarWidth (e.g. see RenderFlexibleBox).
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const_cast&lt;RenderGrid*&gt;(this)-&gt;clearGrid();
</del><ins>+    if (!wasPopulated)
+        const_cast&lt;RenderGrid*&gt;(this)-&gt;clearGrid();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::computePreferredLogicalWidths()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.h (174945 => 174946)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.h        2014-10-21 11:13:53 UTC (rev 174945)
+++ trunk/Source/WebCore/rendering/RenderGrid.h        2014-10-21 12:11:29 UTC (rev 174946)
</span><span class="lines">@@ -110,9 +110,10 @@
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     bool tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection, const Vector&lt;GridTrack&gt;&amp;);
</span><del>-    bool gridWasPopulated() const { return !m_grid.isEmpty() &amp;&amp; !m_grid[0].isEmpty(); }
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    bool gridWasPopulated() const { return !m_grid.isEmpty() &amp;&amp; !m_grid[0].isEmpty(); }
+
</ins><span class="cx">     size_t gridColumnCount() const
</span><span class="cx">     {
</span><span class="cx">         ASSERT(gridWasPopulated());
</span></span></pre>
</div>
</div>

</body>
</html>