<!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>[209601] trunk/Source/WebCore</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/209601">209601</a></dd>
<dt>Author</dt> <dd>svillar@igalia.com</dd>
<dt>Date</dt> <dd>2016-12-09 02:32:22 -0800 (Fri, 09 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[css-grid] Pass Grid as argument to items' placement methods
https://bugs.webkit.org/show_bug.cgi?id=165250

Reviewed by Darin Adler.

In order to constify computeIntrinsicLogicalWidths() it is required to constify
placeItemsOnGrid() first, which is the base method of the grid items' positioning logic. The
first step is to constify all the methods invoked by the latter, which basically means to
pass the Grid as argument to all of them instead of directly using the m_grid attribute from
RenderGrid. As this is an intermediate step, a new const_cast&lt;&gt; was required in the
intrinsic size computation. However it will be promptly removed after the const-ification of
placeItemsOnGrid().

After this, only the methods used by the track sizing algorithm will directly access
m_grid. All those would get a reference to the Grid via GridSizingData, but that's a matter
of a follow up patch.

Apart from that, m_gridIsDirty was removed because it was always too confusing. It was
replaced by Grid's m_needsItemsPlacement which is much more concise. The clearGrid() call
was indeed only forcing a new placement of the grid items.

No new tests as this is a refactoring.

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::Grid::setNeedsItemsPlacement): New method to flag the Grid whenever
grid items' placement algorithm needs to be run.
(WebCore::RenderGrid::canPerformSimplifiedLayout):
(WebCore::RenderGrid::layoutBlock):
(WebCore::RenderGrid::computeIntrinsicLogicalWidths):
(WebCore::RenderGrid::computeEmptyTracksForAutoRepeat):
(WebCore::RenderGrid::placeItemsOnGrid):
(WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Constified. Got Grid as
argument.
(WebCore::RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid): Ditto.
(WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): Ditto.
(WebCore::RenderGrid::placeAutoMajorAxisItemsOnGrid): Ditto.
(WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): Ditto.
(WebCore::RenderGrid::clearGrid):
(WebCore::RenderGrid::offsetAndBreadthForPositionedChild):
(WebCore::RenderGrid::numTracks):
* rendering/RenderGrid.h:</pre>

<h3>Modified Paths</h3>
<ul>
<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>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209600 => 209601)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-09 09:50:17 UTC (rev 209600)
+++ trunk/Source/WebCore/ChangeLog        2016-12-09 10:32:22 UTC (rev 209601)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2016-12-01  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
+
+        [css-grid] Pass Grid as argument to items' placement methods
+        https://bugs.webkit.org/show_bug.cgi?id=165250
+
+        Reviewed by Darin Adler.
+
+        In order to constify computeIntrinsicLogicalWidths() it is required to constify
+        placeItemsOnGrid() first, which is the base method of the grid items' positioning logic. The
+        first step is to constify all the methods invoked by the latter, which basically means to
+        pass the Grid as argument to all of them instead of directly using the m_grid attribute from
+        RenderGrid. As this is an intermediate step, a new const_cast&lt;&gt; was required in the
+        intrinsic size computation. However it will be promptly removed after the const-ification of
+        placeItemsOnGrid().
+
+        After this, only the methods used by the track sizing algorithm will directly access
+        m_grid. All those would get a reference to the Grid via GridSizingData, but that's a matter
+        of a follow up patch.
+
+        Apart from that, m_gridIsDirty was removed because it was always too confusing. It was
+        replaced by Grid's m_needsItemsPlacement which is much more concise. The clearGrid() call
+        was indeed only forcing a new placement of the grid items.
+
+        No new tests as this is a refactoring.
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::Grid::setNeedsItemsPlacement): New method to flag the Grid whenever
+        grid items' placement algorithm needs to be run.
+        (WebCore::RenderGrid::canPerformSimplifiedLayout):
+        (WebCore::RenderGrid::layoutBlock):
+        (WebCore::RenderGrid::computeIntrinsicLogicalWidths):
+        (WebCore::RenderGrid::computeEmptyTracksForAutoRepeat):
+        (WebCore::RenderGrid::placeItemsOnGrid):
+        (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Constified. Got Grid as
+        argument.
+        (WebCore::RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid): Ditto.
+        (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): Ditto.
+        (WebCore::RenderGrid::placeAutoMajorAxisItemsOnGrid): Ditto.
+        (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): Ditto.
+        (WebCore::RenderGrid::clearGrid):
+        (WebCore::RenderGrid::offsetAndBreadthForPositionedChild):
+        (WebCore::RenderGrid::numTracks):
+        * rendering/RenderGrid.h:
+
</ins><span class="cx"> 2016-12-09  Gavin Barraclough  &lt;barraclough@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Revert - Add _WKIconLoadingDelegate SPI
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (209600 => 209601)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp        2016-12-09 09:50:17 UTC (rev 209600)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp        2016-12-09 10:32:22 UTC (rev 209601)
</span><span class="lines">@@ -148,6 +148,14 @@
</span><span class="cx">     return direction == ForColumns ? area.columns : area.rows;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderGrid::Grid::setNeedsItemsPlacement(bool needsItemsPlacement)
+{
+    m_needsItemsPlacement = needsItemsPlacement;
+
+    if (needsItemsPlacement)
+        clear();
+}
+
</ins><span class="cx"> void RenderGrid::Grid::clear()
</span><span class="cx"> {
</span><span class="cx">     m_grid.resize(0);
</span><span class="lines">@@ -529,7 +537,7 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::repeatTracksSizingIfNeeded(GridSizingData&amp; sizingData, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows)
</span><span class="cx"> {
</span><del>-    ASSERT(!m_gridIsDirty);
</del><ins>+    ASSERT(!m_grid.needsItemsPlacement());
</ins><span class="cx">     ASSERT(sizingData.sizingState &gt; GridSizingData::RowSizingFirstIteration);
</span><span class="cx"> 
</span><span class="cx">     // In orthogonal flow cases column track's size is determined by using the computed
</span><span class="lines">@@ -548,9 +556,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool RenderGrid::canPerformSimplifiedLayout() const
</span><span class="cx"> {
</span><del>-    // We cannot perform a simplified layout if the grid is dirty and we have
-    // some positioned items to be laid out.
-    if (m_gridIsDirty &amp;&amp; posChildNeedsLayout())
</del><ins>+    // We cannot perform a simplified layout if we need to position the items and we have some
+    // positioned items to be laid out.
+    if (m_grid.needsItemsPlacement() &amp;&amp; posChildNeedsLayout())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     return RenderBlock::canPerformSimplifiedLayout();
</span><span class="lines">@@ -586,9 +594,9 @@
</span><span class="cx">     setLogicalHeight(0);
</span><span class="cx">     updateLogicalWidth();
</span><span class="cx"> 
</span><del>-    placeItemsOnGrid(TrackSizing);
</del><ins>+    placeItemsOnGrid(m_grid, TrackSizing);
</ins><span class="cx"> 
</span><del>-    GridSizingData sizingData(numTracks(ForColumns), numTracks(ForRows));
</del><ins>+    GridSizingData sizingData(numTracks(ForColumns, m_grid), numTracks(ForRows, m_grid));
</ins><span class="cx"> 
</span><span class="cx">     // At this point the logical width is always definite as the above call to updateLogicalWidth()
</span><span class="cx">     // properly resolves intrinsic sizes. We cannot do the same for heights though because many code
</span><span class="lines">@@ -722,11 +730,11 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::computeIntrinsicLogicalWidths(LayoutUnit&amp; minLogicalWidth, LayoutUnit&amp; maxLogicalWidth) const
</span><span class="cx"> {
</span><del>-    bool wasPopulated = !m_gridIsDirty;
</del><ins>+    bool wasPopulated = !m_grid.needsItemsPlacement();
</ins><span class="cx">     if (!wasPopulated)
</span><del>-        const_cast&lt;RenderGrid*&gt;(this)-&gt;placeItemsOnGrid(IntrinsicSizeComputation);
</del><ins>+        const_cast&lt;RenderGrid*&gt;(this)-&gt;placeItemsOnGrid(const_cast&lt;Grid&amp;&gt;(m_grid), IntrinsicSizeComputation);
</ins><span class="cx"> 
</span><del>-    GridSizingData sizingData(numTracks(ForColumns), numTracks(ForRows));
</del><ins>+    GridSizingData sizingData(numTracks(ForColumns, m_grid), numTracks(ForRows, m_grid));
</ins><span class="cx">     sizingData.setAvailableSpace(std::nullopt);
</span><span class="cx">     sizingData.setFreeSpace(ForColumns, std::nullopt);
</span><span class="cx">     sizingData.sizingOperation = IntrinsicSizeComputation;
</span><span class="lines">@@ -1681,7 +1689,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;RenderGrid::OrderedTrackIndexSet&gt; RenderGrid::computeEmptyTracksForAutoRepeat(GridTrackSizingDirection direction) const
</del><ins>+std::unique_ptr&lt;RenderGrid::OrderedTrackIndexSet&gt; RenderGrid::computeEmptyTracksForAutoRepeat(Grid&amp; grid, GridTrackSizingDirection direction) const
</ins><span class="cx"> {
</span><span class="cx">     bool isRowAxis = direction == ForColumns;
</span><span class="cx">     if ((isRowAxis &amp;&amp; style().gridAutoRepeatColumnsType() != AutoFit)
</span><span class="lines">@@ -1690,8 +1698,8 @@
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;OrderedTrackIndexSet&gt; emptyTrackIndexes;
</span><span class="cx">     unsigned insertionPoint = isRowAxis ? style().gridAutoRepeatColumnsInsertionPoint() : style().gridAutoRepeatRowsInsertionPoint();
</span><del>-    unsigned firstAutoRepeatTrack = insertionPoint + std::abs(m_grid.smallestTrackStart(direction));
-    unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + m_grid.autoRepeatTracks(direction);
</del><ins>+    unsigned firstAutoRepeatTrack = insertionPoint + std::abs(grid.smallestTrackStart(direction));
+    unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + grid.autoRepeatTracks(direction);
</ins><span class="cx"> 
</span><span class="cx">     if (!m_grid.hasGridItems()) {
</span><span class="cx">         emptyTrackIndexes = std::make_unique&lt;OrderedTrackIndexSet&gt;();
</span><span class="lines">@@ -1699,7 +1707,7 @@
</span><span class="cx">             emptyTrackIndexes-&gt;add(trackIndex);
</span><span class="cx">     } else {
</span><span class="cx">         for (unsigned trackIndex = firstAutoRepeatTrack; trackIndex &lt; lastAutoRepeatTrack; ++trackIndex) {
</span><del>-            GridIterator iterator(m_grid, direction, trackIndex);
</del><ins>+            GridIterator iterator(grid, direction, trackIndex);
</ins><span class="cx">             if (!iterator.nextGridItem()) {
</span><span class="cx">                 if (!emptyTrackIndexes)
</span><span class="cx">                     emptyTrackIndexes = std::make_unique&lt;OrderedTrackIndexSet&gt;();
</span><span class="lines">@@ -1710,35 +1718,34 @@
</span><span class="cx">     return emptyTrackIndexes;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::placeItemsOnGrid(SizingOperation sizingOperation)
</del><ins>+void RenderGrid::placeItemsOnGrid(Grid&amp; grid, SizingOperation sizingOperation)
</ins><span class="cx"> {
</span><del>-    ASSERT(m_gridIsDirty);
-    ASSERT(!m_grid.hasGridItems());
</del><ins>+    ASSERT(grid.needsItemsPlacement());
+    ASSERT(!grid.hasGridItems());
</ins><span class="cx"> 
</span><span class="cx">     unsigned autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOperation);
</span><span class="cx">     unsigned autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation);
</span><del>-    m_grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns);
</del><ins>+    grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns);
</ins><span class="cx"> 
</span><del>-    populateExplicitGridAndOrderIterator();
-    m_gridIsDirty = false;
-    bool hasAnyOrthogonalGridItem = false;
</del><ins>+    populateExplicitGridAndOrderIterator(grid);
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;RenderBox*&gt; autoMajorAxisAutoGridItems;
</span><span class="cx">     Vector&lt;RenderBox*&gt; specifiedMajorAxisAutoGridItems;
</span><del>-    for (RenderBox* child = m_grid.orderIterator().first(); child; child = m_grid.orderIterator().next()) {
</del><ins>+    bool hasAnyOrthogonalGridItem = false;
+    for (auto* child = grid.orderIterator().first(); child; child = grid.orderIterator().next()) {
</ins><span class="cx">         if (child-&gt;isOutOfFlowPositioned())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="cx">         hasAnyOrthogonalGridItem = hasAnyOrthogonalGridItem || isOrthogonalChild(*child);
</span><span class="cx"> 
</span><del>-        GridArea area = m_grid.gridItemArea(*child);
</del><ins>+        GridArea area = grid.gridItemArea(*child);
</ins><span class="cx">         if (!area.rows.isIndefinite())
</span><del>-            area.rows.translate(std::abs(m_grid.smallestTrackStart(ForRows)));
</del><ins>+            area.rows.translate(std::abs(grid.smallestTrackStart(ForRows)));
</ins><span class="cx">         if (!area.columns.isIndefinite())
</span><del>-            area.columns.translate(std::abs(m_grid.smallestTrackStart(ForColumns)));
</del><ins>+            area.columns.translate(std::abs(grid.smallestTrackStart(ForColumns)));
</ins><span class="cx"> 
</span><span class="cx">         if (area.rows.isIndefinite() || area.columns.isIndefinite()) {
</span><del>-            m_grid.setGridItemArea(*child, area);
</del><ins>+            grid.setGridItemArea(*child, area);
</ins><span class="cx">             bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns;
</span><span class="cx">             if ((majorAxisDirectionIsForColumns &amp;&amp; area.columns.isIndefinite())
</span><span class="cx">                 || (!majorAxisDirectionIsForColumns &amp;&amp; area.rows.isIndefinite()))
</span><span class="lines">@@ -1747,42 +1754,44 @@
</span><span class="cx">                 specifiedMajorAxisAutoGridItems.append(child);
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><del>-        m_grid.insert(*child, { area.rows, area.columns });
</del><ins>+        grid.insert(*child, { area.rows, area.columns });
</ins><span class="cx">     }
</span><del>-    m_grid.setHasAnyOrthogonalGridItem(hasAnyOrthogonalGridItem);
</del><ins>+    grid.setHasAnyOrthogonalGridItem(hasAnyOrthogonalGridItem);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASSERT)
</span><del>-    if (m_grid.hasGridItems()) {
-        ASSERT(m_grid.numTracks(ForRows) &gt;= GridPositionsResolver::explicitGridRowCount(style(), m_grid.autoRepeatTracks(ForRows)));
-        ASSERT(m_grid.numTracks(ForColumns) &gt;= GridPositionsResolver::explicitGridColumnCount(style(), m_grid.autoRepeatTracks(ForColumns)));
</del><ins>+    if (grid.hasGridItems()) {
+        ASSERT(grid.numTracks(ForRows) &gt;= GridPositionsResolver::explicitGridRowCount(style(), grid.autoRepeatTracks(ForRows)));
+        ASSERT(grid.numTracks(ForColumns) &gt;= GridPositionsResolver::explicitGridColumnCount(style(), grid.autoRepeatTracks(ForColumns)));
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems);
-    placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
</del><ins>+    placeSpecifiedMajorAxisItemsOnGrid(grid, specifiedMajorAxisAutoGridItems);
+    placeAutoMajorAxisItemsOnGrid(grid, autoMajorAxisAutoGridItems);
</ins><span class="cx"> 
</span><span class="cx">     // Compute collapsible tracks for auto-fit.
</span><del>-    m_grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(ForColumns));
-    m_grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(ForRows));
</del><ins>+    grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(grid, ForColumns));
+    grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(grid, ForRows));
</ins><span class="cx"> 
</span><ins>+    grid.setNeedsItemsPlacement(false);
+
</ins><span class="cx"> #if ENABLE(ASSERT)
</span><del>-    for (RenderBox* child = m_grid.orderIterator().first(); child; child = m_grid.orderIterator().next()) {
</del><ins>+    for (auto* child = grid.orderIterator().first(); child; child = grid.orderIterator().next()) {
</ins><span class="cx">         if (child-&gt;isOutOfFlowPositioned())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        GridArea area = m_grid.gridItemArea(*child);
</del><ins>+        GridArea area = grid.gridItemArea(*child);
</ins><span class="cx">         ASSERT(area.rows.isTranslatedDefinite() &amp;&amp; area.columns.isTranslatedDefinite());
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::populateExplicitGridAndOrderIterator()
</del><ins>+void RenderGrid::populateExplicitGridAndOrderIterator(Grid&amp; grid) const
</ins><span class="cx"> {
</span><del>-    OrderIteratorPopulator populator(m_grid.orderIterator());
</del><ins>+    OrderIteratorPopulator populator(grid.orderIterator());
</ins><span class="cx">     int smallestRowStart = 0;
</span><span class="cx">     int smallestColumnStart = 0;
</span><del>-    unsigned autoRepeatRows = m_grid.autoRepeatTracks(ForRows);
-    unsigned autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns);
</del><ins>+    unsigned autoRepeatRows = grid.autoRepeatTracks(ForRows);
+    unsigned autoRepeatColumns = grid.autoRepeatTracks(ForColumns);
</ins><span class="cx">     unsigned maximumRowIndex = GridPositionsResolver::explicitGridRowCount(style(), autoRepeatRows);
</span><span class="cx">     unsigned maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(style(), autoRepeatColumns);
</span><span class="cx"> 
</span><span class="lines">@@ -1812,23 +1821,23 @@
</span><span class="cx">             maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        m_grid.setGridItemArea(*child, { rowPositions, columnPositions });
</del><ins>+        grid.setGridItemArea(*child, { rowPositions, columnPositions });
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart);
-    m_grid.ensureGridSize(maximumRowIndex + std::abs(smallestRowStart), maximumColumnIndex + std::abs(smallestColumnStart));
</del><ins>+    grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart);
+    grid.ensureGridSize(maximumRowIndex + std::abs(smallestRowStart), maximumColumnIndex + std::abs(smallestColumnStart));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;GridArea&gt; RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const RenderBox&amp; gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan&amp; specifiedPositions) const
</del><ins>+std::unique_ptr&lt;GridArea&gt; RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(Grid&amp; grid, const RenderBox&amp; gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan&amp; specifiedPositions) const
</ins><span class="cx"> {
</span><span class="cx">     GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns;
</span><del>-    const unsigned endOfCrossDirection = m_grid.numTracks(crossDirection);
</del><ins>+    const unsigned endOfCrossDirection = grid.numTracks(crossDirection);
</ins><span class="cx">     unsigned crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), gridItem, crossDirection);
</span><span class="cx">     GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize);
</span><span class="cx">     return std::make_unique&lt;GridArea&gt;(specifiedDirection == ForColumns ? crossDirectionPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPositions : crossDirectionPositions);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector&lt;RenderBox*&gt;&amp; autoGridItems)
</del><ins>+void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(Grid&amp; grid, const Vector&lt;RenderBox*&gt;&amp; autoGridItems) const
</ins><span class="cx"> {
</span><span class="cx">     bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns;
</span><span class="cx">     bool isGridAutoFlowDense = style().isGridAutoFlowAlgorithmDense();
</span><span class="lines">@@ -1839,18 +1848,18 @@
</span><span class="cx">     HashMap&lt;unsigned, unsigned, DefaultHash&lt;unsigned&gt;::Hash, WTF::UnsignedWithZeroKeyHashTraits&lt;unsigned&gt;&gt; minorAxisCursors;
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; autoGridItem : autoGridItems) {
</span><del>-        GridSpan majorAxisPositions = m_grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection());
</del><ins>+        GridSpan majorAxisPositions = grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection());
</ins><span class="cx">         ASSERT(majorAxisPositions.isTranslatedDefinite());
</span><del>-        ASSERT(m_grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isIndefinite());
</del><ins>+        ASSERT(grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isIndefinite());
</ins><span class="cx">         unsigned minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), *autoGridItem, autoPlacementMinorAxisDirection());
</span><span class="cx">         unsigned majorAxisInitialPosition = majorAxisPositions.startLine();
</span><span class="cx"> 
</span><del>-        GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));
</del><ins>+        GridIterator iterator(grid, autoPlacementMajorAxisDirection(), majorAxisPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));
</ins><span class="cx">         std::unique_ptr&lt;GridArea&gt; emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisSpanSize);
</span><span class="cx">         if (!emptyGridArea)
</span><del>-            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
</del><ins>+            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
</ins><span class="cx"> 
</span><del>-        m_grid.insert(*autoGridItem, *emptyGridArea);
</del><ins>+        grid.insert(*autoGridItem, *emptyGridArea);
</ins><span class="cx"> 
</span><span class="cx">         if (!isGridAutoFlowDense)
</span><span class="cx">             minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea-&gt;rows.startLine() : emptyGridArea-&gt;columns.startLine());
</span><span class="lines">@@ -1857,13 +1866,13 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector&lt;RenderBox*&gt;&amp; autoGridItems)
</del><ins>+void RenderGrid::placeAutoMajorAxisItemsOnGrid(Grid&amp; grid, const Vector&lt;RenderBox*&gt;&amp; autoGridItems) const
</ins><span class="cx"> {
</span><span class="cx">     AutoPlacementCursor autoPlacementCursor = {0, 0};
</span><span class="cx">     bool isGridAutoFlowDense = style().isGridAutoFlowAlgorithmDense();
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; autoGridItem : autoGridItems) {
</span><del>-        placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor);
</del><ins>+        placeAutoMajorAxisItemOnGrid(grid, *autoGridItem, autoPlacementCursor);
</ins><span class="cx"> 
</span><span class="cx">         if (isGridAutoFlowDense) {
</span><span class="cx">             autoPlacementCursor.first = 0;
</span><span class="lines">@@ -1872,17 +1881,17 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox&amp; gridItem, AutoPlacementCursor&amp; autoPlacementCursor)
</del><ins>+void RenderGrid::placeAutoMajorAxisItemOnGrid(Grid&amp; grid, RenderBox&amp; gridItem, AutoPlacementCursor&amp; autoPlacementCursor) const
</ins><span class="cx"> {
</span><del>-    ASSERT(m_grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection()).isIndefinite());
</del><ins>+    ASSERT(grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection()).isIndefinite());
</ins><span class="cx">     unsigned majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), gridItem, autoPlacementMajorAxisDirection());
</span><span class="cx"> 
</span><del>-    const unsigned endOfMajorAxis = m_grid.numTracks(autoPlacementMajorAxisDirection());
</del><ins>+    const unsigned endOfMajorAxis = grid.numTracks(autoPlacementMajorAxisDirection());
</ins><span class="cx">     unsigned majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.second : autoPlacementCursor.first;
</span><span class="cx">     unsigned minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;GridArea&gt; emptyGridArea;
</span><del>-    GridSpan minorAxisPositions = m_grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection());
</del><ins>+    GridSpan minorAxisPositions = grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection());
</ins><span class="cx">     if (minorAxisPositions.isTranslatedDefinite()) {
</span><span class="cx">         // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor.
</span><span class="cx">         if (minorAxisPositions.startLine() &lt; minorAxisAutoPlacementCursor)
</span><span class="lines">@@ -1889,23 +1898,23 @@
</span><span class="cx">             majorAxisAutoPlacementCursor++;
</span><span class="cx"> 
</span><span class="cx">         if (majorAxisAutoPlacementCursor &lt; endOfMajorAxis) {
</span><del>-            GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.startLine(), majorAxisAutoPlacementCursor);
</del><ins>+            GridIterator iterator(grid, autoPlacementMinorAxisDirection(), minorAxisPositions.startLine(), majorAxisAutoPlacementCursor);
</ins><span class="cx">             emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.integerSpan(), majorAxisSpanSize);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!emptyGridArea)
</span><del>-            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
</del><ins>+            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
</ins><span class="cx">     } else {
</span><span class="cx">         unsigned minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), gridItem, autoPlacementMinorAxisDirection());
</span><span class="cx"> 
</span><span class="cx">         for (unsigned majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisIndex &lt; endOfMajorAxis; ++majorAxisIndex) {
</span><del>-            GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex, minorAxisAutoPlacementCursor);
</del><ins>+            GridIterator iterator(grid, autoPlacementMajorAxisDirection(), majorAxisIndex, minorAxisAutoPlacementCursor);
</ins><span class="cx">             emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorAxisSpanSize);
</span><span class="cx"> 
</span><span class="cx">             if (emptyGridArea) {
</span><span class="cx">                 // Check that it fits in the minor axis direction, as we shouldn't grow in that direction here (it was already managed in populateExplicitGridAndOrderIterator()).
</span><span class="cx">                 unsigned minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea-&gt;columns.endLine() : emptyGridArea-&gt;rows.endLine();
</span><del>-                const unsigned endOfMinorAxis = m_grid.numTracks(autoPlacementMinorAxisDirection());
</del><ins>+                const unsigned endOfMinorAxis = grid.numTracks(autoPlacementMinorAxisDirection());
</ins><span class="cx">                 if (minorAxisFinalPositionIndex &lt;= endOfMinorAxis)
</span><span class="cx">                     break;
</span><span class="cx"> 
</span><span class="lines">@@ -1919,10 +1928,10 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!emptyGridArea)
</span><del>-            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));
</del><ins>+            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_grid.insert(gridItem, *emptyGridArea);
</del><ins>+    grid.insert(gridItem, *emptyGridArea);
</ins><span class="cx">     autoPlacementCursor.first = emptyGridArea-&gt;rows.startLine();
</span><span class="cx">     autoPlacementCursor.second = emptyGridArea-&gt;columns.startLine();
</span><span class="cx"> }
</span><span class="lines">@@ -1939,8 +1948,7 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::clearGrid()
</span><span class="cx"> {
</span><del>-    m_grid.clear();
-    m_gridIsDirty = true;
</del><ins>+    m_grid.setNeedsItemsPlacement(true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Vector&lt;LayoutUnit&gt; RenderGrid::trackSizesForComputedStyle(GridTrackSizingDirection direction) const
</span><span class="lines">@@ -2124,7 +2132,7 @@
</span><span class="cx"> 
</span><span class="cx">     GridPosition startPosition = isRowAxis ? child.style().gridItemColumnStart() : child.style().gridItemRowStart();
</span><span class="cx">     GridPosition endPosition = isRowAxis ? child.style().gridItemColumnEnd() : child.style().gridItemRowEnd();
</span><del>-    int lastLine = numTracks(direction);
</del><ins>+    int lastLine = numTracks(direction, m_grid);
</ins><span class="cx"> 
</span><span class="cx">     bool startIsAuto = startPosition.isAuto()
</span><span class="cx">         || (startPosition.isNamedGridArea() &amp;&amp; !NamedLineCollection::isValidNamedLineOrArea(startPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnStartSide : RowStartSide))
</span><span class="lines">@@ -2766,7 +2774,7 @@
</span><span class="cx">     return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLocation;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned RenderGrid::numTracks(GridTrackSizingDirection direction) const
</del><ins>+unsigned RenderGrid::numTracks(GridTrackSizingDirection direction, const Grid&amp; grid) const
</ins><span class="cx"> {
</span><span class="cx">     // Due to limitations in our internal representation, we cannot know the number of columns from
</span><span class="cx">     // m_grid *if* there is no row (because m_grid would be empty). That's why in that case we need
</span><span class="lines">@@ -2774,10 +2782,10 @@
</span><span class="cx">     // because not having rows implies that there are no &quot;normal&quot; children (out-of-flow children are
</span><span class="cx">     // not stored in m_grid).
</span><span class="cx">     if (direction == ForRows)
</span><del>-        return m_grid.numTracks(ForRows);
</del><ins>+        return grid.numTracks(ForRows);
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: This still requires knowledge about m_grid internals.
</span><del>-    return m_grid.numTracks(ForRows) ? m_grid.numTracks(ForColumns) : GridPositionsResolver::explicitGridColumnCount(style(), m_grid.autoRepeatTracks(ForColumns));
</del><ins>+    return grid.numTracks(ForRows) ? grid.numTracks(ForColumns) : GridPositionsResolver::explicitGridColumnCount(style(), grid.autoRepeatTracks(ForColumns));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::paintChildren(PaintInfo&amp; paintInfo, const LayoutPoint&amp; paintOffset, PaintInfo&amp; forChild, bool usePrintRect)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.h (209600 => 209601)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.h        2016-12-09 09:50:17 UTC (rev 209600)
+++ trunk/Source/WebCore/rendering/RenderGrid.h        2016-12-09 10:32:22 UTC (rev 209601)
</span><span class="lines">@@ -79,6 +79,7 @@
</span><span class="cx"> 
</span><span class="cx">     std::optional&lt;LayoutUnit&gt; computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, std::optional&lt;LayoutUnit&gt; intrinsicContentHeight, LayoutUnit borderAndPadding) const override;
</span><span class="cx"> 
</span><ins>+    class Grid;
</ins><span class="cx">     class GridIterator;
</span><span class="cx">     class GridSizingData;
</span><span class="cx">     enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
</span><span class="lines">@@ -91,15 +92,15 @@
</span><span class="cx">     unsigned computeAutoRepeatTracksCount(GridTrackSizingDirection, SizingOperation) const;
</span><span class="cx"> 
</span><span class="cx">     typedef ListHashSet&lt;size_t&gt; OrderedTrackIndexSet;
</span><del>-    std::unique_ptr&lt;OrderedTrackIndexSet&gt; computeEmptyTracksForAutoRepeat(GridTrackSizingDirection) const;
</del><ins>+    std::unique_ptr&lt;OrderedTrackIndexSet&gt; computeEmptyTracksForAutoRepeat(Grid&amp;, GridTrackSizingDirection) const;
</ins><span class="cx"> 
</span><del>-    void placeItemsOnGrid(SizingOperation);
-    void populateExplicitGridAndOrderIterator();
-    std::unique_ptr&lt;GridArea&gt; createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const RenderBox&amp;, GridTrackSizingDirection, const GridSpan&amp;) const;
-    void placeSpecifiedMajorAxisItemsOnGrid(const Vector&lt;RenderBox*&gt;&amp;);
-    void placeAutoMajorAxisItemsOnGrid(const Vector&lt;RenderBox*&gt;&amp;);
</del><ins>+    void placeItemsOnGrid(Grid&amp;, SizingOperation);
+    void populateExplicitGridAndOrderIterator(Grid&amp;) const;
+    std::unique_ptr&lt;GridArea&gt; createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(Grid&amp;, const RenderBox&amp;, GridTrackSizingDirection, const GridSpan&amp;) const;
+    void placeSpecifiedMajorAxisItemsOnGrid(Grid&amp;, const Vector&lt;RenderBox*&gt;&amp;) const;
+    void placeAutoMajorAxisItemsOnGrid(Grid&amp;, const Vector&lt;RenderBox*&gt;&amp;) const;
</ins><span class="cx">     typedef std::pair&lt;unsigned, unsigned&gt; AutoPlacementCursor;
</span><del>-    void placeAutoMajorAxisItemOnGrid(RenderBox&amp;, AutoPlacementCursor&amp;);
</del><ins>+    void placeAutoMajorAxisItemOnGrid(Grid&amp;, RenderBox&amp;, AutoPlacementCursor&amp;) const;
</ins><span class="cx">     GridTrackSizingDirection autoPlacementMajorAxisDirection() const;
</span><span class="cx">     GridTrackSizingDirection autoPlacementMinorAxisDirection() const;
</span><span class="cx"> 
</span><span class="lines">@@ -184,7 +185,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&amp;, GridTrackSizingDirection, SizingOperation) const;
</span><span class="cx"> 
</span><del>-    unsigned numTracks(GridTrackSizingDirection) const;
</del><ins>+    unsigned numTracks(GridTrackSizingDirection, const Grid&amp;) const;
</ins><span class="cx"> 
</span><span class="cx">     LayoutUnit translateRTLCoordinate(LayoutUnit) const;
</span><span class="cx"> 
</span><span class="lines">@@ -234,13 +235,14 @@
</span><span class="cx"> 
</span><span class="cx">         OrderIterator&amp; orderIterator() { return m_orderIterator; }
</span><span class="cx"> 
</span><del>-        void shrinkToFit() { m_grid.shrinkToFit(); }
</del><ins>+        void setNeedsItemsPlacement(bool);
+        bool needsItemsPlacement() const { return m_needsItemsPlacement; };
</ins><span class="cx"> 
</span><del>-        void clear();
-
</del><span class="cx">     private:
</span><span class="cx">         friend class GridIterator;
</span><span class="cx"> 
</span><ins>+        void clear();
+
</ins><span class="cx">         OrderIterator m_orderIterator;
</span><span class="cx"> 
</span><span class="cx">         int m_smallestColumnStart { 0 };
</span><span class="lines">@@ -250,6 +252,7 @@
</span><span class="cx">         unsigned m_autoRepeatRows { 0 };
</span><span class="cx"> 
</span><span class="cx">         bool m_hasAnyOrthogonalGridItem { false };
</span><ins>+        bool m_needsItemsPlacement { true };
</ins><span class="cx"> 
</span><span class="cx">         GridAsMatrix m_grid;
</span><span class="cx"> 
</span><span class="lines">@@ -268,8 +271,6 @@
</span><span class="cx"> 
</span><span class="cx">     std::optional&lt;LayoutUnit&gt; m_minContentHeight;
</span><span class="cx">     std::optional&lt;LayoutUnit&gt; m_maxContentHeight;
</span><del>-
-    bool m_gridIsDirty { true };
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>