<!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>[208995] 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/208995">208995</a></dd>
<dt>Author</dt> <dd>svillar@igalia.com</dd>
<dt>Date</dt> <dd>2016-11-28 03:28:41 -0800 (Mon, 28 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[css-grid] Move attributes from RenderGrid to the new Grid class
https://bugs.webkit.org/show_bug.cgi?id=165065

Reviewed by Darin Adler.

A new class called Grid was added in 208973. This is the first of a couple of patches moving
private attributes from RenderGrid to Grid.

Apart from that this is adding a couple of new helper functions that will decouple the
existence of in-flow items from the actual data structures storing that information.

Last but not least, the Grid::insert() method does not only insert the item in the m_grid
data structure, but also stores the GridArea associated to that item, so there is no need to
do it in two different calls.

No new tests required as this is a refactoring.

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::Grid::insert): Added a new parameter.
(WebCore::RenderGrid::Grid::setSmallestTracksStart):
(WebCore::RenderGrid::Grid::smallestTrackStart):
(WebCore::RenderGrid::Grid::gridItemArea):
(WebCore::RenderGrid::Grid::setGridItemArea):
(WebCore::RenderGrid::Grid::clear): Clear the newly added attributes.
(WebCore::RenderGrid::repeatTracksSizingIfNeeded):
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::rawGridTrackSize):
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
(WebCore::RenderGrid::computeEmptyTracksForAutoRepeat):
(WebCore::RenderGrid::placeItemsOnGrid):
(WebCore::RenderGrid::populateExplicitGridAndOrderIterator):
(WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
(WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
(WebCore::RenderGrid::clearGrid):
(WebCore::RenderGrid::offsetAndBreadthForPositionedChild):
(WebCore::RenderGrid::cachedGridSpan):
(WebCore::RenderGrid::cachedGridArea): Deleted.
* 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 (208994 => 208995)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-28 04:30:44 UTC (rev 208994)
+++ trunk/Source/WebCore/ChangeLog        2016-11-28 11:28:41 UTC (rev 208995)
</span><span class="lines">@@ -1,3 +1,44 @@
</span><ins>+2016-11-24  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
+
+        [css-grid] Move attributes from RenderGrid to the new Grid class
+        https://bugs.webkit.org/show_bug.cgi?id=165065
+
+        Reviewed by Darin Adler.
+
+        A new class called Grid was added in 208973. This is the first of a couple of patches moving
+        private attributes from RenderGrid to Grid.
+
+        Apart from that this is adding a couple of new helper functions that will decouple the
+        existence of in-flow items from the actual data structures storing that information.
+
+        Last but not least, the Grid::insert() method does not only insert the item in the m_grid
+        data structure, but also stores the GridArea associated to that item, so there is no need to
+        do it in two different calls.
+
+        No new tests required as this is a refactoring.
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::Grid::insert): Added a new parameter.
+        (WebCore::RenderGrid::Grid::setSmallestTracksStart):
+        (WebCore::RenderGrid::Grid::smallestTrackStart):
+        (WebCore::RenderGrid::Grid::gridItemArea):
+        (WebCore::RenderGrid::Grid::setGridItemArea):
+        (WebCore::RenderGrid::Grid::clear): Clear the newly added attributes.
+        (WebCore::RenderGrid::repeatTracksSizingIfNeeded):
+        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
+        (WebCore::RenderGrid::rawGridTrackSize):
+        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
+        (WebCore::RenderGrid::computeEmptyTracksForAutoRepeat):
+        (WebCore::RenderGrid::placeItemsOnGrid):
+        (WebCore::RenderGrid::populateExplicitGridAndOrderIterator):
+        (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
+        (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
+        (WebCore::RenderGrid::clearGrid):
+        (WebCore::RenderGrid::offsetAndBreadthForPositionedChild):
+        (WebCore::RenderGrid::cachedGridSpan):
+        (WebCore::RenderGrid::cachedGridArea): Deleted.
+        * rendering/RenderGrid.h:
+
</ins><span class="cx"> 2016-11-27  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove unused DOMRequestState
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (208994 => 208995)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp        2016-11-28 04:30:44 UTC (rev 208994)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp        2016-11-28 11:28:41 UTC (rev 208995)
</span><span class="lines">@@ -71,11 +71,39 @@
</span><span class="cx">         for (const auto&amp; column : area.columns)
</span><span class="cx">             m_grid[row][column].append(&amp;child);
</span><span class="cx">     }
</span><ins>+
+    setGridItemArea(child, area);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderGrid::Grid::setSmallestTracksStart(int rowStart, int columnStart)
+{
+    m_smallestRowStart = rowStart;
+    m_smallestColumnStart = columnStart;
+}
+
+int RenderGrid::Grid::smallestTrackStart(GridTrackSizingDirection direction) const
+{
+    return direction == ForRows ? m_smallestRowStart : m_smallestColumnStart;
+}
+
+GridArea RenderGrid::Grid::gridItemArea(const RenderBox&amp; item) const
+{
+    ASSERT(m_gridItemArea.contains(&amp;item));
+    return m_gridItemArea.get(&amp;item);
+}
+
+void RenderGrid::Grid::setGridItemArea(const RenderBox&amp; item, GridArea area)
+{
+    m_gridItemArea.set(&amp;item, area);
+}
+
</ins><span class="cx"> void RenderGrid::Grid::clear()
</span><span class="cx"> {
</span><span class="cx">     m_grid.resize(0);
</span><ins>+    m_gridItemArea.clear();
+    m_hasAnyOrthogonalGridItem = false;
+    m_smallestRowStart = 0;
+    m_smallestColumnStart = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class GridTrack {
</span><span class="lines">@@ -467,7 +495,7 @@
</span><span class="cx">     // a new cycle of the sizing algorithm; there may be more. In addition, not all the
</span><span class="cx">     // cases with orthogonal flows require this extra cycle; we need a more specific
</span><span class="cx">     // condition to detect whether child's min-content contribution has changed or not.
</span><del>-    if (m_hasAnyOrthogonalChild) {
</del><ins>+    if (m_grid.hasAnyOrthogonalGridItem()) {
</ins><span class="cx">         computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForColumns);
</span><span class="cx">         computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows);
</span><span class="cx">     }
</span><span class="lines">@@ -821,7 +849,7 @@
</span><span class="cx">         for (const auto&amp; trackIndex : flexibleSizedTracksIndex)
</span><span class="cx">             flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex, sizingData.sizingOperation).maxTrackBreadth().flex()));
</span><span class="cx"> 
</span><del>-        if (!m_gridItemArea.isEmpty()) {
</del><ins>+        if (m_grid.hasGridItems()) {
</ins><span class="cx">             for (unsigned i = 0; i &lt; flexibleSizedTracksIndex.size(); ++i) {
</span><span class="cx">                 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]);
</span><span class="cx">                 while (auto* gridItem = iterator.nextGridItem()) {
</span><span class="lines">@@ -1007,7 +1035,7 @@
</span><span class="cx">     // grid-template-areas is specified for example).
</span><span class="cx">     unsigned explicitTracksCount = trackStyles.size() + autoRepeatTracksCount;
</span><span class="cx"> 
</span><del>-    int untranslatedIndexAsInt = translatedIndex + (isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
</del><ins>+    int untranslatedIndexAsInt = translatedIndex + m_grid.smallestTrackStart(direction);
</ins><span class="cx">     unsigned autoTrackStylesSize = autoTrackStyles.size();
</span><span class="cx">     if (untranslatedIndexAsInt &lt; 0) {
</span><span class="cx">         int index = untranslatedIndexAsInt % static_cast&lt;int&gt;(autoTrackStylesSize);
</span><span class="lines">@@ -1220,7 +1248,7 @@
</span><span class="cx"> {
</span><span class="cx">     sizingData.itemsSortedByIncreasingSpan.shrink(0);
</span><span class="cx">     HashSet&lt;RenderBox*&gt; itemsSet;
</span><del>-    if (!m_gridItemArea.isEmpty()) {
</del><ins>+    if (m_grid.hasGridItems()) {
</ins><span class="cx">         for (auto trackIndex : sizingData.contentSizedTracksIndex) {
</span><span class="cx">             GridIterator iterator(m_grid, direction, trackIndex);
</span><span class="cx">             GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex];
</span><span class="lines">@@ -1629,10 +1657,10 @@
</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(isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
</del><ins>+    unsigned firstAutoRepeatTrack = insertionPoint + std::abs(m_grid.smallestTrackStart(direction));
</ins><span class="cx">     unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + autoRepeatCountForDirection(direction);
</span><span class="cx"> 
</span><del>-    if (m_gridItemArea.isEmpty()) {
</del><ins>+    if (!m_grid.hasGridItems()) {
</ins><span class="cx">         emptyTrackIndexes = std::make_unique&lt;OrderedTrackIndexSet&gt;();
</span><span class="cx">         for (unsigned trackIndex = firstAutoRepeatTrack; trackIndex &lt; lastAutoRepeatTrack; ++trackIndex)
</span><span class="cx">             emptyTrackIndexes-&gt;add(trackIndex);
</span><span class="lines">@@ -1652,7 +1680,7 @@
</span><span class="cx"> void RenderGrid::placeItemsOnGrid(SizingOperation sizingOperation)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_gridIsDirty);
</span><del>-    ASSERT(m_gridItemArea.isEmpty());
</del><ins>+    ASSERT(!m_grid.hasGridItems());
</ins><span class="cx"> 
</span><span class="cx">     m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOperation);
</span><span class="cx">     m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation);
</span><span class="lines">@@ -1659,24 +1687,24 @@
</span><span class="cx"> 
</span><span class="cx">     populateExplicitGridAndOrderIterator();
</span><span class="cx">     m_gridIsDirty = false;
</span><ins>+    bool hasAnyOrthogonalGridItem = false;
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;RenderBox*&gt; autoMajorAxisAutoGridItems;
</span><span class="cx">     Vector&lt;RenderBox*&gt; specifiedMajorAxisAutoGridItems;
</span><del>-    m_hasAnyOrthogonalChild = false;
</del><span class="cx">     for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
</span><span class="cx">         if (child-&gt;isOutOfFlowPositioned())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        m_hasAnyOrthogonalChild = m_hasAnyOrthogonalChild || isOrthogonalChild(*child);
</del><ins>+        hasAnyOrthogonalGridItem = hasAnyOrthogonalGridItem || isOrthogonalChild(*child);
</ins><span class="cx"> 
</span><del>-        GridArea area = cachedGridArea(*child);
</del><ins>+        GridArea area = m_grid.gridItemArea(*child);
</ins><span class="cx">         if (!area.rows.isIndefinite())
</span><del>-            area.rows.translate(std::abs(m_smallestRowStart));
</del><ins>+            area.rows.translate(std::abs(m_grid.smallestTrackStart(ForRows)));
</ins><span class="cx">         if (!area.columns.isIndefinite())
</span><del>-            area.columns.translate(std::abs(m_smallestColumnStart));
-        m_gridItemArea.set(child, area);
</del><ins>+            area.columns.translate(std::abs(m_grid.smallestTrackStart(ForColumns)));
</ins><span class="cx"> 
</span><span class="cx">         if (area.rows.isIndefinite() || area.columns.isIndefinite()) {
</span><ins>+            m_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">@@ -1687,9 +1715,10 @@
</span><span class="cx">         }
</span><span class="cx">         m_grid.insert(*child, { area.rows, area.columns });
</span><span class="cx">     }
</span><ins>+    m_grid.setHasAnyOrthogonalGridItem(hasAnyOrthogonalGridItem);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASSERT)
</span><del>-    if (!m_gridItemArea.isEmpty()) {
</del><ins>+    if (m_grid.hasGridItems()) {
</ins><span class="cx">         ASSERT(gridRowCount() &gt;= GridPositionsResolver::explicitGridRowCount(style(), m_autoRepeatRows));
</span><span class="cx">         ASSERT(gridColumnCount() &gt;= GridPositionsResolver::explicitGridColumnCount(style(), m_autoRepeatColumns));
</span><span class="cx">     }
</span><span class="lines">@@ -1707,7 +1736,7 @@
</span><span class="cx">         if (child-&gt;isOutOfFlowPositioned())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        GridArea area = cachedGridArea(*child);
</del><ins>+        GridArea area = m_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="lines">@@ -1716,7 +1745,8 @@
</span><span class="cx"> void RenderGrid::populateExplicitGridAndOrderIterator()
</span><span class="cx"> {
</span><span class="cx">     OrderIteratorPopulator populator(m_orderIterator);
</span><del>-    m_smallestRowStart = m_smallestColumnStart = 0;
</del><ins>+    int smallestRowStart = 0;
+    int smallestColumnStart = 0;
</ins><span class="cx">     unsigned maximumRowIndex = GridPositionsResolver::explicitGridRowCount(style(), m_autoRepeatRows);
</span><span class="cx">     unsigned maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(style(), m_autoRepeatColumns);
</span><span class="cx"> 
</span><span class="lines">@@ -1728,7 +1758,7 @@
</span><span class="cx"> 
</span><span class="cx">         GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromStyle(style(), *child, ForRows, m_autoRepeatRows);
</span><span class="cx">         if (!rowPositions.isIndefinite()) {
</span><del>-            m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untranslatedStartLine());
</del><ins>+            smallestRowStart = std::min(smallestRowStart, rowPositions.untranslatedStartLine());
</ins><span class="cx">             maximumRowIndex = std::max&lt;int&gt;(maximumRowIndex, rowPositions.untranslatedEndLine());
</span><span class="cx">         } else {
</span><span class="cx">             // Grow the grid for items with a definite row span, getting the largest such span.
</span><span class="lines">@@ -1738,7 +1768,7 @@
</span><span class="cx"> 
</span><span class="cx">         GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFromStyle(style(), *child, ForColumns, m_autoRepeatColumns);
</span><span class="cx">         if (!columnPositions.isIndefinite()) {
</span><del>-            m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositions.untranslatedStartLine());
</del><ins>+            smallestColumnStart = std::min(smallestColumnStart, columnPositions.untranslatedStartLine());
</ins><span class="cx">             maximumColumnIndex = std::max&lt;int&gt;(maximumColumnIndex, columnPositions.untranslatedEndLine());
</span><span class="cx">         } else {
</span><span class="cx">             // Grow the grid for items with a definite column span, getting the largest such span.
</span><span class="lines">@@ -1746,10 +1776,11 @@
</span><span class="cx">             maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        m_gridItemArea.set(child, GridArea(rowPositions, columnPositions));
</del><ins>+        m_grid.setGridItemArea(*child, { rowPositions, columnPositions });
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_grid.ensureGridSize(maximumRowIndex + std::abs(m_smallestRowStart), maximumColumnIndex + std::abs(m_smallestColumnStart));
</del><ins>+    m_grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart);
+    m_grid.ensureGridSize(maximumRowIndex + std::abs(smallestRowStart), maximumColumnIndex + std::abs(smallestColumnStart));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;GridArea&gt; RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const RenderBox&amp; gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan&amp; specifiedPositions) const
</span><span class="lines">@@ -1783,7 +1814,6 @@
</span><span class="cx">         if (!emptyGridArea)
</span><span class="cx">             emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
</span><span class="cx"> 
</span><del>-        m_gridItemArea.set(autoGridItem, *emptyGridArea);
</del><span class="cx">         m_grid.insert(*autoGridItem, *emptyGridArea);
</span><span class="cx"> 
</span><span class="cx">         if (!isGridAutoFlowDense)
</span><span class="lines">@@ -1856,7 +1886,6 @@
</span><span class="cx">             emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_gridItemArea.set(&amp;gridItem, *emptyGridArea);
</del><span class="cx">     m_grid.insert(gridItem, *emptyGridArea);
</span><span class="cx">     autoPlacementCursor.first = emptyGridArea-&gt;rows.startLine();
</span><span class="cx">     autoPlacementCursor.second = emptyGridArea-&gt;columns.startLine();
</span><span class="lines">@@ -1875,7 +1904,6 @@
</span><span class="cx"> void RenderGrid::clearGrid()
</span><span class="cx"> {
</span><span class="cx">     m_grid.clear();
</span><del>-    m_gridItemArea.clear();
</del><span class="cx">     m_gridIsDirty = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2054,7 +2082,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // For positioned items we cannot use GridSpan::translate() because we could end up with negative values, as the positioned items do not create implicit tracks per spec.
</span><del>-    int smallestStart = std::abs(isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
</del><ins>+    int smallestStart = std::abs(m_grid.smallestTrackStart(direction));
</ins><span class="cx">     int startLine = positions.untranslatedStartLine() + smallestStart;
</span><span class="cx">     int endLine = positions.untranslatedEndLine() + smallestStart;
</span><span class="cx"> 
</span><span class="lines">@@ -2119,15 +2147,9 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GridArea RenderGrid::cachedGridArea(const RenderBox&amp; gridItem) const
-{
-    ASSERT(m_gridItemArea.contains(&amp;gridItem));
-    return m_gridItemArea.get(&amp;gridItem);
-}
-
</del><span class="cx"> GridSpan RenderGrid::cachedGridSpan(const RenderBox&amp; gridItem, GridTrackSizingDirection direction) const
</span><span class="cx"> {
</span><del>-    GridArea area = cachedGridArea(gridItem);
</del><ins>+    GridArea area = m_grid.gridItemArea(gridItem);
</ins><span class="cx">     return direction == ForColumns ? area.columns : area.rows;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.h (208994 => 208995)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.h        2016-11-28 04:30:44 UTC (rev 208994)
+++ trunk/Source/WebCore/rendering/RenderGrid.h        2016-11-28 11:28:41 UTC (rev 208995)
</span><span class="lines">@@ -209,8 +209,21 @@
</span><span class="cx">         void ensureGridSize(unsigned maximumRowSize, unsigned maximumColumnSize);
</span><span class="cx">         void insert(RenderBox&amp;, const GridArea&amp;);
</span><span class="cx"> 
</span><ins>+        // Note that each in flow child of a grid container becomes a grid item. This means that
+        // this method will return false for a grid container with only out of flow children.
+        bool hasGridItems() const { return !m_gridItemArea.isEmpty(); }
+
+        // FIXME: move this to SizingData once placeItemsOnGrid() takes it as argument.
+        bool hasAnyOrthogonalGridItem() const { return m_hasAnyOrthogonalGridItem; }
+        void setHasAnyOrthogonalGridItem(bool hasAnyOrthogonalGridItem) { m_hasAnyOrthogonalGridItem = hasAnyOrthogonalGridItem; }
+
+        GridArea gridItemArea(const RenderBox&amp; item) const;
+        void setGridItemArea(const RenderBox&amp; item, GridArea);
+
</ins><span class="cx">         const GridCell&amp; cell(unsigned row, unsigned column) const { return m_grid[row][column]; }
</span><span class="cx"> 
</span><ins>+        int smallestTrackStart(GridTrackSizingDirection) const;
+        void setSmallestTracksStart(int rowStart, int columnStart);
</ins><span class="cx">         void shrinkToFit() { m_grid.shrinkToFit(); }
</span><span class="cx"> 
</span><span class="cx">         void clear();
</span><span class="lines">@@ -217,7 +230,16 @@
</span><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         friend class GridIterator;
</span><ins>+
+        int m_smallestColumnStart { 0 };
+        int m_smallestRowStart { 0 };
+
+        bool m_hasAnyOrthogonalGridItem { false };
+
</ins><span class="cx">         GridAsMatrix m_grid;
</span><ins>+
+        HashMap&lt;const RenderBox*, GridArea&gt; m_gridItemArea;
+        HashMap&lt;const RenderBox*, size_t&gt; m_gridItemsIndexesMap;
</ins><span class="cx">     };
</span><span class="cx">     Grid m_grid;
</span><span class="cx"> 
</span><span class="lines">@@ -225,20 +247,14 @@
</span><span class="cx">     Vector&lt;LayoutUnit&gt; m_rowPositions;
</span><span class="cx">     LayoutUnit m_offsetBetweenColumns;
</span><span class="cx">     LayoutUnit m_offsetBetweenRows;
</span><del>-    HashMap&lt;const RenderBox*, GridArea&gt; m_gridItemArea;
</del><span class="cx">     OrderIterator m_orderIterator;
</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><span class="cx"> 
</span><del>-    int m_smallestColumnStart;
-    int m_smallestRowStart;
-
</del><span class="cx">     unsigned m_autoRepeatColumns { 0 };
</span><span class="cx">     unsigned m_autoRepeatRows { 0 };
</span><span class="cx"> 
</span><del>-    bool m_hasAnyOrthogonalChild;
-
</del><span class="cx">     bool m_gridIsDirty { true };
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;OrderedTrackIndexSet&gt; m_autoRepeatEmptyColumns { nullptr };
</span></span></pre>
</div>
</div>

</body>
</html>