<!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>[169934] 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/169934">169934</a></dd>
<dt>Author</dt> <dd>rego@igalia.com</dd>
<dt>Date</dt> <dd>2014-06-13 06:09:58 -0700 (Fri, 13 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Grid Layout] Introduce an explicit type for resolved grid positions
https://bugs.webkit.org/show_bug.cgi?id=131732

Reviewed by Sergio Villar Senin.

We were using simple size_t integers to represent resolved grid
positions in our internal data structures. This change allows us to
clarify the code, avoid potential off by one mistakes, and move the
resolving code to a central place.

A new class GridResolvedPosition has been created and the related
methods have been moved there from RenderGrid.
GridSpan is now defined by two GridResolvedPosition, so all the code
using it has been modified to adapt it to GridResolvedPosition.

No new tests as it is already covered by current tests
(fast/css-grid-layout/).

* CMakeLists.txt:
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
* WebCore.xcodeproj/project.pbxproj:
* css/CSSGridTemplateAreasValue.cpp:
(WebCore::stringForPosition):
* css/CSSParser.cpp:
(WebCore::CSSParser::parseGridTemplateAreasRow):
* css/StyleResolver.cpp:
(WebCore::createImplicitNamedGridLinesFromGridArea):
* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::computeNormalizedFractionBreadth):
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems):
(WebCore::RenderGrid::insertItemIntoGrid):
(WebCore::RenderGrid::placeItemsOnGrid):
(WebCore::RenderGrid::populateExplicitGridAndOrderIterator):
(WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
(WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
(WebCore::RenderGrid::autoPlacementMajorAxisDirection):
(WebCore::RenderGrid::autoPlacementMinorAxisDirection):
(WebCore::RenderGrid::gridAreaBreadthForChild):
(WebCore::RenderGrid::findChildLogicalPosition):
(WebCore::RenderGrid::explicitGridColumnCount): Deleted.
(WebCore::RenderGrid::explicitGridRowCount): Deleted.
(WebCore::isColumnSide): Deleted.
(WebCore::isStartSide): Deleted.
(WebCore::RenderGrid::explicitGridSizeForSide): Deleted.
(WebCore::RenderGrid::resolveGridPositionsFromAutoPlacementPosition): Deleted.
(WebCore::gridLinesForSide): Deleted.
(WebCore::implicitNamedGridLineForSide): Deleted.
(WebCore::isNonExistentNamedLineOrArea): Deleted.
(WebCore::RenderGrid::adjustGridPositionsFromStyle): Deleted.
(WebCore::RenderGrid::resolveGridPositionsFromStyle): Deleted.
(WebCore::RenderGrid::resolveNamedGridLinePositionFromStyle): Deleted.
(WebCore::RenderGrid::resolveGridPositionFromStyle): Deleted.
(WebCore::RenderGrid::resolveGridPositionAgainstOppositePosition): Deleted.
(WebCore::RenderGrid::resolveNamedGridLinePositionAgainstOppositePosition): Deleted.
(WebCore::firstNamedGridLineBeforePosition): Deleted.
(WebCore::RenderGrid::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition): Deleted.
(WebCore::RenderGrid::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition): Deleted.
* rendering/RenderGrid.h:
* rendering/style/GridCoordinate.h:
(WebCore::GridSpan::GridSpan):
(WebCore::GridSpan::operator==):
* rendering/style/GridPosition.h:
(WebCore::GridPosition::adjustGridPositionForRowEndColumnEndSide): Deleted.
(WebCore::GridPosition::adjustGridPositionForSide): Deleted.
* rendering/style/GridResolvedPosition.cpp: Added.
(WebCore::isColumnSide):
(WebCore::isStartSide):
(WebCore::explicitGridSizeForSide):
(WebCore::GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition):
(WebCore::gridLinesForSide):
(WebCore::implicitNamedGridLineForSide):
(WebCore::isNonExistentNamedLineOrArea):
(WebCore::GridResolvedPosition::adjustGridPositionsFromStyle):
(WebCore::GridResolvedPosition::resolveGridPositionsFromStyle):
(WebCore::GridResolvedPosition::resolveNamedGridLinePositionFromStyle):
(WebCore::GridResolvedPosition::resolveGridPositionFromStyle):
(WebCore::GridResolvedPosition::resolveGridPositionAgainstOppositePosition):
(WebCore::GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition):
(WebCore::firstNamedGridLineBeforePosition):
(WebCore::GridResolvedPosition::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition):
(WebCore::GridResolvedPosition::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition):
* rendering/style/GridResolvedPosition.h: Added.
(WebCore::GridResolvedPosition::adjustGridPositionForRowEndColumnEndSide):
(WebCore::GridResolvedPosition::adjustGridPositionForSide):
(WebCore::GridResolvedPosition::GridResolvedPosition):
(WebCore::GridResolvedPosition::operator++):
(WebCore::GridResolvedPosition::operator==):
(WebCore::GridResolvedPosition::operator&lt;):
(WebCore::GridResolvedPosition::operator&gt;):
(WebCore::GridResolvedPosition::operator&lt;=):
(WebCore::GridResolvedPosition::operator&gt;=):
(WebCore::GridResolvedPosition::toInt):
(WebCore::GridResolvedPosition::next):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxproj">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxprojfilters">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorecssCSSGridTemplateAreasValuecpp">trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSParsercpp">trunk/Source/WebCore/css/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecssStyleResolvercpp">trunk/Source/WebCore/css/StyleResolver.cpp</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>
<li><a href="#trunkSourceWebCorerenderingstyleGridCoordinateh">trunk/Source/WebCore/rendering/style/GridCoordinate.h</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleGridPositionh">trunk/Source/WebCore/rendering/style/GridPosition.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCorerenderingstyleGridResolvedPositioncpp">trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleGridResolvedPositionh">trunk/Source/WebCore/rendering/style/GridResolvedPosition.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/CMakeLists.txt        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -2387,6 +2387,7 @@
</span><span class="cx">     rendering/style/ContentData.cpp
</span><span class="cx">     rendering/style/CounterDirectives.cpp
</span><span class="cx">     rendering/style/FillLayer.cpp
</span><ins>+    rendering/style/GridResolvedPosition.cpp
</ins><span class="cx">     rendering/style/KeyframeList.cpp
</span><span class="cx">     rendering/style/NinePieceImage.cpp
</span><span class="cx">     rendering/style/QuotesData.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/ChangeLog        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -1,3 +1,101 @@
</span><ins>+2014-06-13  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
+
+        [CSS Grid Layout] Introduce an explicit type for resolved grid positions
+        https://bugs.webkit.org/show_bug.cgi?id=131732
+
+        Reviewed by Sergio Villar Senin.
+
+        We were using simple size_t integers to represent resolved grid
+        positions in our internal data structures. This change allows us to
+        clarify the code, avoid potential off by one mistakes, and move the
+        resolving code to a central place.
+
+        A new class GridResolvedPosition has been created and the related
+        methods have been moved there from RenderGrid.
+        GridSpan is now defined by two GridResolvedPosition, so all the code
+        using it has been modified to adapt it to GridResolvedPosition.
+
+        No new tests as it is already covered by current tests
+        (fast/css-grid-layout/).
+
+        * CMakeLists.txt:
+        * WebCore.vcxproj/WebCore.vcxproj:
+        * WebCore.vcxproj/WebCore.vcxproj.filters:
+        * WebCore.xcodeproj/project.pbxproj:
+        * css/CSSGridTemplateAreasValue.cpp:
+        (WebCore::stringForPosition):
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseGridTemplateAreasRow):
+        * css/StyleResolver.cpp:
+        (WebCore::createImplicitNamedGridLinesFromGridArea):
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
+        (WebCore::RenderGrid::computeNormalizedFractionBreadth):
+        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems):
+        (WebCore::RenderGrid::insertItemIntoGrid):
+        (WebCore::RenderGrid::placeItemsOnGrid):
+        (WebCore::RenderGrid::populateExplicitGridAndOrderIterator):
+        (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
+        (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
+        (WebCore::RenderGrid::autoPlacementMajorAxisDirection):
+        (WebCore::RenderGrid::autoPlacementMinorAxisDirection):
+        (WebCore::RenderGrid::gridAreaBreadthForChild):
+        (WebCore::RenderGrid::findChildLogicalPosition):
+        (WebCore::RenderGrid::explicitGridColumnCount): Deleted.
+        (WebCore::RenderGrid::explicitGridRowCount): Deleted.
+        (WebCore::isColumnSide): Deleted.
+        (WebCore::isStartSide): Deleted.
+        (WebCore::RenderGrid::explicitGridSizeForSide): Deleted.
+        (WebCore::RenderGrid::resolveGridPositionsFromAutoPlacementPosition): Deleted.
+        (WebCore::gridLinesForSide): Deleted.
+        (WebCore::implicitNamedGridLineForSide): Deleted.
+        (WebCore::isNonExistentNamedLineOrArea): Deleted.
+        (WebCore::RenderGrid::adjustGridPositionsFromStyle): Deleted.
+        (WebCore::RenderGrid::resolveGridPositionsFromStyle): Deleted.
+        (WebCore::RenderGrid::resolveNamedGridLinePositionFromStyle): Deleted.
+        (WebCore::RenderGrid::resolveGridPositionFromStyle): Deleted.
+        (WebCore::RenderGrid::resolveGridPositionAgainstOppositePosition): Deleted.
+        (WebCore::RenderGrid::resolveNamedGridLinePositionAgainstOppositePosition): Deleted.
+        (WebCore::firstNamedGridLineBeforePosition): Deleted.
+        (WebCore::RenderGrid::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition): Deleted.
+        (WebCore::RenderGrid::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition): Deleted.
+        * rendering/RenderGrid.h:
+        * rendering/style/GridCoordinate.h:
+        (WebCore::GridSpan::GridSpan):
+        (WebCore::GridSpan::operator==):
+        * rendering/style/GridPosition.h:
+        (WebCore::GridPosition::adjustGridPositionForRowEndColumnEndSide): Deleted.
+        (WebCore::GridPosition::adjustGridPositionForSide): Deleted.
+        * rendering/style/GridResolvedPosition.cpp: Added.
+        (WebCore::isColumnSide):
+        (WebCore::isStartSide):
+        (WebCore::explicitGridSizeForSide):
+        (WebCore::GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition):
+        (WebCore::gridLinesForSide):
+        (WebCore::implicitNamedGridLineForSide):
+        (WebCore::isNonExistentNamedLineOrArea):
+        (WebCore::GridResolvedPosition::adjustGridPositionsFromStyle):
+        (WebCore::GridResolvedPosition::resolveGridPositionsFromStyle):
+        (WebCore::GridResolvedPosition::resolveNamedGridLinePositionFromStyle):
+        (WebCore::GridResolvedPosition::resolveGridPositionFromStyle):
+        (WebCore::GridResolvedPosition::resolveGridPositionAgainstOppositePosition):
+        (WebCore::GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition):
+        (WebCore::firstNamedGridLineBeforePosition):
+        (WebCore::GridResolvedPosition::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition):
+        (WebCore::GridResolvedPosition::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition):
+        * rendering/style/GridResolvedPosition.h: Added.
+        (WebCore::GridResolvedPosition::adjustGridPositionForRowEndColumnEndSide):
+        (WebCore::GridResolvedPosition::adjustGridPositionForSide):
+        (WebCore::GridResolvedPosition::GridResolvedPosition):
+        (WebCore::GridResolvedPosition::operator++):
+        (WebCore::GridResolvedPosition::operator==):
+        (WebCore::GridResolvedPosition::operator&lt;):
+        (WebCore::GridResolvedPosition::operator&gt;):
+        (WebCore::GridResolvedPosition::operator&lt;=):
+        (WebCore::GridResolvedPosition::operator&gt;=):
+        (WebCore::GridResolvedPosition::toInt):
+        (WebCore::GridResolvedPosition::next):
+
</ins><span class="cx"> 2014-06-12  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Remove all deprecated API from GObject DOM bindings
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -11472,6 +11472,7 @@
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\rendering\style\GridResolvedPosition.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\rendering\style\KeyframeList.cpp&quot;&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="lines">@@ -20153,6 +20154,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\GridCoordinate.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\GridLength.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\GridPosition.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\rendering\style\GridResolvedPosition.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\GridTrackSize.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\KeyframeList.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\NinePieceImage.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -2775,6 +2775,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\rendering\style\FillLayer.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\rendering\style\GridResolvedPosition.cpp&quot;&gt;
+      &lt;Filter&gt;rendering\style&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\rendering\style\KeyframeList.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -9712,6 +9715,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\GridPosition.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\rendering\style\GridResolvedPosition.h&quot;&gt;
+      &lt;Filter&gt;rendering\style&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\GridTrackSize.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -5715,6 +5715,8 @@
</span><span class="cx">                 CDF2B0191820540700F2B424 /* MockTracks.h in Headers */ = {isa = PBXBuildFile; fileRef = CDF2B00F1820540600F2B424 /* MockTracks.h */; };
</span><span class="cx">                 CDF65CC8145B1E7500C4C7AA /* MediaController.h in Headers */ = {isa = PBXBuildFile; fileRef = CD27F6E4145767870078207D /* MediaController.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 CDF65CCA145B448800C4C7AA /* MediaControllerInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = CDF65CC9145B43A700C4C7AA /* MediaControllerInterface.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                CDF7483E18FEBCEC0006ECC0 /* GridResolvedPosition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDF7483C18FEBCEC0006ECC0 /* GridResolvedPosition.cpp */; };
+                CDF7483F18FEBCEC0006ECC0 /* GridResolvedPosition.h in Headers */ = {isa = PBXBuildFile; fileRef = CDF7483D18FEBCEC0006ECC0 /* GridResolvedPosition.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 CDFC360518CA61C20026E56F /* RemoteCommandListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDFC360318CA61C20026E56F /* RemoteCommandListener.cpp */; };
</span><span class="cx">                 CDFC360618CA61C20026E56F /* RemoteCommandListener.h in Headers */ = {isa = PBXBuildFile; fileRef = CDFC360418CA61C20026E56F /* RemoteCommandListener.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 CDFC360718CA696C0026E56F /* RemoteCommandListenerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDFC360218CA61630026E56F /* RemoteCommandListenerIOS.mm */; };
</span><span class="lines">@@ -13151,6 +13153,8 @@
</span><span class="cx">                 CDF2B00F1820540600F2B424 /* MockTracks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockTracks.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CDF65CC9145B43A700C4C7AA /* MediaControllerInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaControllerInterface.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CDF65CCC145B6AFE00C4C7AA /* JSHTMLMediaElementCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLMediaElementCustom.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                CDF7483C18FEBCEC0006ECC0 /* GridResolvedPosition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GridResolvedPosition.cpp; path = style/GridResolvedPosition.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                CDF7483D18FEBCEC0006ECC0 /* GridResolvedPosition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GridResolvedPosition.h; path = style/GridResolvedPosition.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 CDFC360118CA61630026E56F /* RemoteCommandListenerIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RemoteCommandListenerIOS.h; path = ios/RemoteCommandListenerIOS.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CDFC360218CA61630026E56F /* RemoteCommandListenerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RemoteCommandListenerIOS.mm; path = ios/RemoteCommandListenerIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CDFC360318CA61C20026E56F /* RemoteCommandListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteCommandListener.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -20856,6 +20860,8 @@
</span><span class="cx">                                 CD3E251B18046B0600E27F56 /* GridCoordinate.h */,
</span><span class="cx">                                 CDEF4FD617E85C8F00AEE24B /* GridLength.h */,
</span><span class="cx">                                 A12705C21656BD6500C2E27C /* GridPosition.h */,
</span><ins>+                                CDF7483C18FEBCEC0006ECC0 /* GridResolvedPosition.cpp */,
+                                CDF7483D18FEBCEC0006ECC0 /* GridResolvedPosition.h */,
</ins><span class="cx">                                 A12A104E166444DC008FA311 /* GridTrackSize.h */,
</span><span class="cx">                                 BC5EBA0E0E823E4700B25965 /* KeyframeList.cpp */,
</span><span class="cx">                                 BC5EBA0F0E823E4700B25965 /* KeyframeList.h */,
</span><span class="lines">@@ -24620,6 +24626,7 @@
</span><span class="cx">                                 A80E7E9F0A1A83E3007FB8C5 /* JSHTMLButtonElement.h in Headers */,
</span><span class="cx">                                 938E666209F09B87008A48EC /* JSHTMLCanvasElement.h in Headers */,
</span><span class="cx">                                 BCCBAD410C18C14200CE890F /* JSHTMLCollection.h in Headers */,
</span><ins>+                                CDF7483F18FEBCEC0006ECC0 /* GridResolvedPosition.h in Headers */,
</ins><span class="cx">                                 F5C041E70FFCA96D00839D4A /* JSHTMLDataListElement.h in Headers */,
</span><span class="cx">                                 D359D8BF129CA55C0006E5D2 /* JSHTMLDetailsElement.h in Headers */,
</span><span class="cx">                                 76808B50159DADFA002B5233 /* JSHTMLDialogElement.h in Headers */,
</span><span class="lines">@@ -27371,6 +27378,7 @@
</span><span class="cx">                                 A4226E961163D73A008B8397 /* DOMHTMLProgressElement.mm in Sources */,
</span><span class="cx">                                 85183B4B0AA6926100F19FA3 /* DOMHTMLQuoteElement.mm in Sources */,
</span><span class="cx">                                 85DF819C0AA77E4B00486AD7 /* DOMHTMLScriptElement.mm in Sources */,
</span><ins>+                                CDF7483E18FEBCEC0006ECC0 /* GridResolvedPosition.cpp in Sources */,
</ins><span class="cx">                                 85F32AF10AA63B8700FF3184 /* DOMHTMLSelectElement.mm in Sources */,
</span><span class="cx">                                 859A9C500AA5E3BD00B694B2 /* DOMHTMLStyleElement.mm in Sources */,
</span><span class="cx">                                 85DF821E0AA7849E00486AD7 /* DOMHTMLTableCaptionElement.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSGridTemplateAreasValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/css/CSSGridTemplateAreasValue.cpp        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -55,13 +55,13 @@
</span><span class="cx"> 
</span><span class="cx">     for (const auto&amp; it : gridAreaMap) {
</span><span class="cx">         const GridCoordinate&amp; coordinate = it.value;
</span><del>-        if (row &gt;= coordinate.rows.initialPositionIndex &amp;&amp; row &lt;= coordinate.rows.finalPositionIndex)
</del><ins>+        if (row &gt;= coordinate.rows.resolvedInitialPosition.toInt() &amp;&amp; row &lt;= coordinate.rows.resolvedFinalPosition.toInt())
</ins><span class="cx">             candidates.append(it.key);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (const auto&amp; it : gridAreaMap) {
</span><span class="cx">         const GridCoordinate&amp; coordinate = it.value;
</span><del>-        if (column &gt;= coordinate.columns.initialPositionIndex &amp;&amp; column &lt;= coordinate.columns.finalPositionIndex &amp;&amp; candidates.contains(it.key))
</del><ins>+        if (column &gt;= coordinate.columns.resolvedInitialPosition.toInt() &amp;&amp; column &lt;= coordinate.columns.resolvedFinalPosition.toInt() &amp;&amp; candidates.contains(it.key))
</ins><span class="cx">             return it.key;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSParser.cpp (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSParser.cpp        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/css/CSSParser.cpp        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -5352,18 +5352,18 @@
</span><span class="cx"> 
</span><span class="cx">             // The following checks test that the grid area is a single filled-in rectangle.
</span><span class="cx">             // 1. The new row is adjacent to the previously parsed row.
</span><del>-            if (rowCount != gridCoordinate.rows.finalPositionIndex + 1)
</del><ins>+            if (rowCount != gridCoordinate.rows.resolvedFinalPosition.next().toInt())
</ins><span class="cx">                 return 0;
</span><span class="cx"> 
</span><span class="cx">             // 2. The new area starts at the same position as the previously parsed area.
</span><del>-            if (currentColumn != gridCoordinate.columns.initialPositionIndex)
</del><ins>+            if (currentColumn != gridCoordinate.columns.resolvedInitialPosition.toInt())
</ins><span class="cx">                 return 0;
</span><span class="cx"> 
</span><span class="cx">             // 3. The new area ends at the same position as the previously parsed area.
</span><del>-            if (lookAheadColumn != gridCoordinate.columns.finalPositionIndex)
</del><ins>+            if (lookAheadColumn != gridCoordinate.columns.resolvedFinalPosition.toInt())
</ins><span class="cx">                 return 0;
</span><span class="cx"> 
</span><del>-            ++gridCoordinate.rows.finalPositionIndex;
</del><ins>+            ++gridCoordinate.rows.resolvedFinalPosition;
</ins><span class="cx">         }
</span><span class="cx">         currentColumn = lookAheadColumn;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleResolver.cpp (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleResolver.cpp        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/css/StyleResolver.cpp        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -1864,12 +1864,12 @@
</span><span class="cx">         GridSpan areaSpan = direction == ForRows ? area.value.rows : area.value.columns;
</span><span class="cx">         {
</span><span class="cx">             auto&amp; startVector = namedGridLines.add(area.key + &quot;-start&quot;, Vector&lt;size_t&gt;()).iterator-&gt;value;
</span><del>-            startVector.append(areaSpan.initialPositionIndex);
</del><ins>+            startVector.append(areaSpan.resolvedInitialPosition.toInt());
</ins><span class="cx">             std::sort(startVector.begin(), startVector.end());
</span><span class="cx">         }
</span><span class="cx">         {
</span><span class="cx">             auto&amp; endVector = namedGridLines.add(area.key + &quot;-end&quot;, Vector&lt;size_t&gt;()).iterator-&gt;value;
</span><del>-            endVector.append(areaSpan.finalPositionIndex + 1);
</del><ins>+            endVector.append(areaSpan.resolvedFinalPosition.next().toInt());
</ins><span class="cx">             std::sort(endVector.begin(), endVector.end());
</span><span class="cx">         }
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #if ENABLE(CSS_GRID_LAYOUT)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;GridCoordinate.h&quot;
</span><ins>+#include &quot;GridResolvedPosition.h&quot;
</ins><span class="cx"> #include &quot;LayoutRepainter.h&quot;
</span><span class="cx"> #include &quot;RenderLayer.h&quot;
</span><span class="cx"> #include &quot;RenderView.h&quot;
</span><span class="lines">@@ -341,7 +342,7 @@
</span><span class="cx">                 const GridSpan span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
</span><span class="cx"> 
</span><span class="cx">                 // Do not include already processed items.
</span><del>-                if (i &gt; 0 &amp;&amp; span.initialPositionIndex &lt;= flexibleSizedTracksIndex[i - 1])
</del><ins>+                if (i &gt; 0 &amp;&amp; span.resolvedInitialPosition.toInt() &lt;= flexibleSizedTracksIndex[i - 1])
</ins><span class="cx">                     continue;
</span><span class="cx"> 
</span><span class="cx">                 double itemNormalizedFlexBreadth = computeNormalizedFractionBreadth(tracks, span, direction, maxContentForChild(gridItem, direction, sizingData.columnTracks));
</span><span class="lines">@@ -400,12 +401,12 @@
</span><span class="cx">     // |availableLogicalSpace| already accounts for the used breadths so no need to remove it here.
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;GridTrackForNormalization&gt; tracksForNormalization;
</span><del>-    for (size_t i = tracksSpan.initialPositionIndex; i &lt;= tracksSpan.finalPositionIndex; ++i) {
-        const GridTrackSize&amp; trackSize = gridTrackSize(direction, i);
</del><ins>+    for (GridResolvedPosition position = tracksSpan.resolvedInitialPosition; position &lt;= tracksSpan.resolvedFinalPosition; ++position) {
+        const GridTrackSize&amp; trackSize = gridTrackSize(direction, position.toInt());
</ins><span class="cx">         if (!trackSize.maxTrackBreadth().isFlex())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        tracksForNormalization.append(GridTrackForNormalization(tracks[i], trackSize.maxTrackBreadth().flex()));
</del><ins>+        tracksForNormalization.append(GridTrackForNormalization(tracks[position.toInt()], trackSize.maxTrackBreadth().flex()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // The function is not called if we don't have &lt;flex&gt; grid tracks
</span><span class="lines">@@ -461,31 +462,6 @@
</span><span class="cx">     return trackSize;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t RenderGrid::explicitGridColumnCount() const
-{
-    return style().gridColumns().size();
-}
-
-size_t RenderGrid::explicitGridRowCount() const
-{
-    return style().gridRows().size();
-}
-
-static inline bool isColumnSide(GridPositionSide side)
-{
-    return side == ColumnStartSide || side == ColumnEndSide;
-}
-
-static inline bool isStartSide(GridPositionSide side)
-{
-    return side == ColumnStartSide || side == RowStartSide;
-}
-
-size_t RenderGrid::explicitGridSizeForSide(GridPositionSide side) const
-{
-    return isColumnSide(side) ? explicitGridColumnCount() : explicitGridRowCount();
-}
-
</del><span class="cx"> LayoutUnit RenderGrid::logicalContentHeightForChild(RenderBox* child, Vector&lt;GridTrack&gt;&amp; columnTracks)
</span><span class="cx"> {
</span><span class="cx">     LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child-&gt;hasOverrideContainingBlockLogicalWidth() ? child-&gt;overrideContainingBlockContentLogicalWidth() : LayoutUnit();
</span><span class="lines">@@ -555,16 +531,16 @@
</span><span class="cx"> void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction)
</span><span class="cx"> {
</span><span class="cx">     const GridCoordinate coordinate = cachedGridCoordinate(gridItem);
</span><del>-    const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.columns.initialPositionIndex : coordinate.rows.initialPositionIndex;
-    const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.columns.finalPositionIndex : coordinate.rows.finalPositionIndex;
</del><ins>+    const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
+    const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition;
</ins><span class="cx"> 
</span><span class="cx">     sizingData.filteredTracks.shrink(0);
</span><del>-    for (size_t trackIndex = initialTrackIndex; trackIndex &lt;= finalTrackIndex; ++trackIndex) {
-        const GridTrackSize&amp; trackSize = gridTrackSize(direction, trackIndex);
</del><ins>+    for (GridResolvedPosition trackIndex = initialTrackPosition; trackIndex &lt;= finalTrackPosition; ++trackIndex) {
+        const GridTrackSize&amp; trackSize = gridTrackSize(direction, trackIndex.toInt());
</ins><span class="cx">         if (!(trackSize.*filterFunction)())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex];
</del><ins>+        GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex.toInt()] : sizingData.rowTracks[trackIndex.toInt()];
</ins><span class="cx">         sizingData.filteredTracks.append(&amp;track);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -572,8 +548,8 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     LayoutUnit additionalBreadthSpace = (this-&gt;*sizingFunction)(gridItem, direction, sizingData.columnTracks);
</span><del>-    for (size_t trackIndexForSpace = initialTrackIndex; trackIndexForSpace &lt;= finalTrackIndex; ++trackIndexForSpace) {
-        GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackIndexForSpace] : sizingData.rowTracks[trackIndexForSpace];
</del><ins>+    for (GridResolvedPosition trackPositionForSpace = initialTrackPosition; trackPositionForSpace &lt;= finalTrackPosition; ++trackPositionForSpace) {
+        GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackPositionForSpace.toInt()] : sizingData.rowTracks[trackPositionForSpace.toInt()];
</ins><span class="cx">         additionalBreadthSpace -= (track.*trackGetter)();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -647,17 +623,17 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate&amp; coordinate)
</span><span class="cx"> {
</span><del>-    for (size_t row = coordinate.rows.initialPositionIndex; row &lt;= coordinate.rows.finalPositionIndex; ++row) {
-        for (size_t column = coordinate.columns.initialPositionIndex; column &lt;= coordinate.columns.finalPositionIndex; ++column)
-            m_grid[row][column].append(child);
</del><ins>+    for (GridResolvedPosition row = coordinate.rows.resolvedInitialPosition; row &lt;= coordinate.rows.resolvedFinalPosition; ++row) {
+        for (GridResolvedPosition column = coordinate.columns.resolvedInitialPosition; column &lt;= coordinate.columns.resolvedFinalPosition; ++column)
+            m_grid[row.toInt()][column.toInt()].append(child);
</ins><span class="cx">     }
</span><span class="cx">     m_gridItemCoordinate.set(child, coordinate);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t columnTrack)
</del><ins>+void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridResolvedPosition&amp; rowTrack, const GridResolvedPosition&amp; columnTrack)
</ins><span class="cx"> {
</span><del>-    const GridSpan&amp; rowSpan = resolveGridPositionsFromAutoPlacementPosition(child, ForRows, rowTrack);
-    const GridSpan&amp; columnSpan = resolveGridPositionsFromAutoPlacementPosition(child, ForColumns, columnTrack);
</del><ins>+    const GridSpan&amp; rowSpan = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*child, ForRows, rowTrack);
+    const GridSpan&amp; columnSpan = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*child, ForColumns, columnTrack);
</ins><span class="cx">     insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -674,8 +650,8 @@
</span><span class="cx">     for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
</span><span class="cx">         // FIXME: We never re-resolve positions if the grid is grown during auto-placement which may lead auto / &lt;integer&gt;
</span><span class="cx">         // positions to not match the author's intent. The specification is unclear on what should be done in this case.
</span><del>-        std::unique_ptr&lt;GridSpan&gt; rowPositions = resolveGridPositionsFromStyle(child, ForRows);
-        std::unique_ptr&lt;GridSpan&gt; columnPositions = resolveGridPositionsFromStyle(child, ForColumns);
</del><ins>+        std::unique_ptr&lt;GridSpan&gt; rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows);
+        std::unique_ptr&lt;GridSpan&gt; columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns);
</ins><span class="cx">         if (!rowPositions || !columnPositions) {
</span><span class="cx">             GridSpan* majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? columnPositions.get() : rowPositions.get();
</span><span class="cx">             if (!majorAxisPositions)
</span><span class="lines">@@ -704,22 +680,22 @@
</span><span class="cx"> void RenderGrid::populateExplicitGridAndOrderIterator()
</span><span class="cx"> {
</span><span class="cx">     OrderIteratorPopulator populator(m_orderIterator);
</span><del>-    size_t maximumRowIndex = std::max&lt;size_t&gt;(1, explicitGridRowCount());
-    size_t maximumColumnIndex = std::max&lt;size_t&gt;(1, explicitGridColumnCount());
</del><ins>+    size_t maximumRowIndex = std::max&lt;size_t&gt;(1, style().gridRows().size());
+    size_t maximumColumnIndex = std::max&lt;size_t&gt;(1, style().gridColumns().size());
</ins><span class="cx"> 
</span><span class="cx">     for (RenderBox* child = firstChildBox(); child; child = child-&gt;nextSiblingBox()) {
</span><span class="cx">         populator.collectChild(*child);
</span><span class="cx"> 
</span><span class="cx">         // This function bypasses the cache (cachedGridCoordinate()) as it is used to build it.
</span><del>-        std::unique_ptr&lt;GridSpan&gt; rowPositions = resolveGridPositionsFromStyle(child, ForRows);
-        std::unique_ptr&lt;GridSpan&gt; columnPositions = resolveGridPositionsFromStyle(child, ForColumns);
</del><ins>+        std::unique_ptr&lt;GridSpan&gt; rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows);
+        std::unique_ptr&lt;GridSpan&gt; columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns);
</ins><span class="cx"> 
</span><span class="cx">         // |positions| is 0 if we need to run the auto-placement algorithm. Our estimation ignores
</span><span class="cx">         // this case as the auto-placement algorithm will grow the grid as needed.
</span><span class="cx">         if (rowPositions)
</span><del>-            maximumRowIndex = std::max(maximumRowIndex, rowPositions-&gt;finalPositionIndex + 1);
</del><ins>+            maximumRowIndex = std::max(maximumRowIndex, rowPositions-&gt;resolvedFinalPosition.next().toInt());
</ins><span class="cx">         if (columnPositions)
</span><del>-            maximumColumnIndex = std::max(maximumColumnIndex, columnPositions-&gt;finalPositionIndex + 1);
</del><ins>+            maximumColumnIndex = std::max(maximumColumnIndex, columnPositions-&gt;resolvedFinalPosition.next().toInt());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_grid.grow(maximumRowIndex);
</span><span class="lines">@@ -730,17 +706,17 @@
</span><span class="cx"> void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector&lt;RenderBox*&gt;&amp; autoGridItems)
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; autoGridItem : autoGridItems) {
</span><del>-        std::unique_ptr&lt;GridSpan&gt; majorAxisPositions = resolveGridPositionsFromStyle(autoGridItem, autoPlacementMajorAxisDirection());
-        GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions-&gt;initialPositionIndex);
</del><ins>+        std::unique_ptr&lt;GridSpan&gt; majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *autoGridItem, autoPlacementMajorAxisDirection());
+        GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions-&gt;resolvedInitialPosition.toInt());
</ins><span class="cx">         if (std::unique_ptr&lt;GridCoordinate&gt; emptyGridArea = iterator.nextEmptyGridArea()) {
</span><del>-            insertItemIntoGrid(autoGridItem, emptyGridArea-&gt;rows.initialPositionIndex, emptyGridArea-&gt;columns.initialPositionIndex);
</del><ins>+            insertItemIntoGrid(autoGridItem, emptyGridArea-&gt;rows.resolvedInitialPosition, emptyGridArea-&gt;columns.resolvedInitialPosition);
</ins><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         growGrid(autoPlacementMinorAxisDirection());
</span><span class="cx">         std::unique_ptr&lt;GridCoordinate&gt; emptyGridArea = iterator.nextEmptyGridArea();
</span><span class="cx">         ASSERT(emptyGridArea);
</span><del>-        insertItemIntoGrid(autoGridItem, emptyGridArea-&gt;rows.initialPositionIndex, emptyGridArea-&gt;columns.initialPositionIndex);
</del><ins>+        insertItemIntoGrid(autoGridItem, emptyGridArea-&gt;rows.resolvedInitialPosition, emptyGridArea-&gt;columns.resolvedInitialPosition);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -752,14 +728,14 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem)
</span><span class="cx"> {
</span><del>-    std::unique_ptr&lt;GridSpan&gt; minorAxisPositions = resolveGridPositionsFromStyle(gridItem, autoPlacementMinorAxisDirection());
-    ASSERT(!resolveGridPositionsFromStyle(gridItem, autoPlacementMajorAxisDirection()));
</del><ins>+    std::unique_ptr&lt;GridSpan&gt; minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *gridItem, autoPlacementMinorAxisDirection());
+    ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(style(), *gridItem, autoPlacementMajorAxisDirection()));
</ins><span class="cx">     size_t minorAxisIndex = 0;
</span><span class="cx">     if (minorAxisPositions) {
</span><del>-        minorAxisIndex = minorAxisPositions-&gt;initialPositionIndex;
</del><ins>+        minorAxisIndex = minorAxisPositions-&gt;resolvedInitialPosition.toInt();
</ins><span class="cx">         GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisIndex);
</span><span class="cx">         if (std::unique_ptr&lt;GridCoordinate&gt; emptyGridArea = iterator.nextEmptyGridArea()) {
</span><del>-            insertItemIntoGrid(gridItem, emptyGridArea-&gt;rows.initialPositionIndex, emptyGridArea-&gt;columns.initialPositionIndex);
</del><ins>+            insertItemIntoGrid(gridItem, emptyGridArea-&gt;rows.resolvedInitialPosition, emptyGridArea-&gt;columns.resolvedInitialPosition);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="lines">@@ -767,7 +743,7 @@
</span><span class="cx">         for (size_t majorAxisIndex = 0; majorAxisIndex &lt; endOfMajorAxis; ++majorAxisIndex) {
</span><span class="cx">             GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex);
</span><span class="cx">             if (std::unique_ptr&lt;GridCoordinate&gt; emptyGridArea = iterator.nextEmptyGridArea()) {
</span><del>-                insertItemIntoGrid(gridItem, emptyGridArea-&gt;rows.initialPositionIndex, emptyGridArea-&gt;columns.initialPositionIndex);
</del><ins>+                insertItemIntoGrid(gridItem, emptyGridArea-&gt;rows.resolvedInitialPosition, emptyGridArea-&gt;columns.resolvedInitialPosition);
</ins><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -780,14 +756,14 @@
</span><span class="cx">     insertItemIntoGrid(gridItem, rowIndex, columnIndex);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RenderGrid::GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const
</del><ins>+GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const
</ins><span class="cx"> {
</span><span class="cx">     GridAutoFlow flow = style().gridAutoFlow();
</span><span class="cx">     ASSERT(flow != AutoFlowNone);
</span><span class="cx">     return (flow == AutoFlowColumn) ? ForColumns : ForRows;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RenderGrid::GridTrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() const
</del><ins>+GridTrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() const
</ins><span class="cx"> {
</span><span class="cx">     GridAutoFlow flow = style().gridAutoFlow();
</span><span class="cx">     ASSERT(flow != AutoFlowNone);
</span><span class="lines">@@ -856,256 +832,13 @@
</span><span class="cx">     return m_gridItemCoordinate.get(gridItem);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GridSpan RenderGrid::resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, GridTrackSizingDirection, size_t initialPosition) const
-{
-    // FIXME: We don't support spanning with auto positions yet. Once we do, this is wrong. Also we should make
-    // sure the grid can accomodate the new item as we only grow 1 position in a given direction.
-    return GridSpan(initialPosition, initialPosition);
-}
-
-static inline const NamedGridLinesMap&amp; gridLinesForSide(const RenderStyle&amp; style, GridPositionSide side)
-{
-    return isColumnSide(side) ? style.namedGridColumnLines() : style.namedGridRowLines();
-}
-
-static inline const String implicitNamedGridLineForSide(const String&amp; lineName, GridPositionSide side)
-{
-    return lineName + (isStartSide(side) ? &quot;-start&quot; : &quot;-end&quot;);
-}
-
-static bool isNonExistentNamedLineOrArea(const String&amp; lineName, const RenderStyle&amp; style, GridPositionSide side)
-{
-    const NamedGridLinesMap&amp; gridLineNames = gridLinesForSide(style, side);
-    return !gridLineNames.contains(implicitNamedGridLineForSide(lineName, side)) &amp;&amp; !gridLineNames.contains(lineName);
-}
-
-void RenderGrid::adjustGridPositionsFromStyle(GridPosition&amp; initialPosition, GridPosition&amp; finalPosition, GridPositionSide initialPositionSide, GridPositionSide finalPositionSide) const
-{
-    ASSERT(isColumnSide(initialPositionSide) == isColumnSide(finalPositionSide));
-
-    // We must handle the placement error handling code here instead of in the StyleAdjuster because we don't want to
-    // overwrite the specified values.
-    if (initialPosition.isSpan() &amp;&amp; finalPosition.isSpan())
-        finalPosition.setAutoPosition();
-
-    // Try to early detect the case of non existing named grid lines. This way we could assume later that
-    // RenderGrid::resolveGrisPositionFromStyle() won't require the autoplacement to run, i.e., it'll always return a
-    // valid resolved position.
-    if (initialPosition.isNamedGridArea() &amp;&amp; isNonExistentNamedLineOrArea(initialPosition.namedGridLine(), style(), initialPositionSide))
-        initialPosition.setAutoPosition();
-
-    if (finalPosition.isNamedGridArea() &amp;&amp; isNonExistentNamedLineOrArea(finalPosition.namedGridLine(), style(), finalPositionSide))
-        finalPosition.setAutoPosition();
-}
-
-std::unique_ptr&lt;GridSpan&gt; RenderGrid::resolveGridPositionsFromStyle(const RenderBox* gridItem, GridTrackSizingDirection direction) const
-{
-    GridPosition initialPosition = (direction == ForColumns) ? gridItem-&gt;style().gridItemColumnStart() : gridItem-&gt;style().gridItemRowStart();
-    const GridPositionSide initialPositionSide = (direction == ForColumns) ? ColumnStartSide : RowStartSide;
-    GridPosition finalPosition = (direction == ForColumns) ? gridItem-&gt;style().gridItemColumnEnd() : gridItem-&gt;style().gridItemRowEnd();
-    const GridPositionSide finalPositionSide = (direction == ForColumns) ? ColumnEndSide : RowEndSide;
-
-    adjustGridPositionsFromStyle(initialPosition, finalPosition, initialPositionSide, finalPositionSide);
-
-    if (initialPosition.shouldBeResolvedAgainstOppositePosition() &amp;&amp; finalPosition.shouldBeResolvedAgainstOppositePosition()) {
-        if (style().gridAutoFlow() == AutoFlowNone)
-            return std::make_unique&lt;GridSpan&gt;(0, 0);
-
-        // We can't get our grid positions without running the auto placement algorithm.
-        return nullptr;
-    }
-
-    if (initialPosition.shouldBeResolvedAgainstOppositePosition()) {
-        // Infer the position from the final position ('auto / 1' or 'span 2 / 3' case).
-        const size_t finalResolvedPosition = resolveGridPositionFromStyle(finalPosition, finalPositionSide);
-        return resolveGridPositionAgainstOppositePosition(finalResolvedPosition, initialPosition, initialPositionSide);
-    }
-
-    if (finalPosition.shouldBeResolvedAgainstOppositePosition()) {
-        // Infer our position from the initial position ('1 / auto' or '3 / span 2' case).
-        const size_t initialResolvedPosition = resolveGridPositionFromStyle(initialPosition, initialPositionSide);
-        return resolveGridPositionAgainstOppositePosition(initialResolvedPosition, finalPosition, finalPositionSide);
-    }
-
-    size_t resolvedInitialPosition = resolveGridPositionFromStyle(initialPosition, initialPositionSide);
-    size_t resolvedFinalPosition = resolveGridPositionFromStyle(finalPosition, finalPositionSide);
-
-    // If 'grid-row-end' specifies a line at or before that specified by 'grid-row-start', it computes to 'span 1'.
-    if (resolvedFinalPosition &lt; resolvedInitialPosition)
-        resolvedFinalPosition = resolvedInitialPosition;
-
-    return std::make_unique&lt;GridSpan&gt;(resolvedInitialPosition, resolvedFinalPosition);
-}
-
-size_t RenderGrid::resolveNamedGridLinePositionFromStyle(const GridPosition&amp; position, GridPositionSide side) const
-{
-    ASSERT(!position.namedGridLine().isNull());
-
-    const NamedGridLinesMap&amp; gridLinesNames = gridLinesForSide(style(), side);
-    NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine());
-    if (it == gridLinesNames.end()) {
-        if (position.isPositive())
-            return 0;
-        const size_t lastLine = explicitGridSizeForSide(side);
-        return GridPosition::adjustGridPositionForSide(lastLine, side);
-    }
-
-    size_t namedGridLineIndex;
-    if (position.isPositive())
-        namedGridLineIndex = std::min&lt;size_t&gt;(position.integerPosition(), it-&gt;value.size()) - 1;
-    else
-        namedGridLineIndex = std::max&lt;int&gt;(it-&gt;value.size() - abs(position.integerPosition()), 0);
-    return GridPosition::adjustGridPositionForSide(it-&gt;value[namedGridLineIndex], side);
-}
-
-size_t RenderGrid::resolveGridPositionFromStyle(const GridPosition&amp; position, GridPositionSide side) const
-{
-    switch (position.type()) {
-    case ExplicitPosition: {
-        ASSERT(position.integerPosition());
-
-        if (!position.namedGridLine().isNull())
-            return resolveNamedGridLinePositionFromStyle(position, side);
-
-        // Handle &lt;integer&gt; explicit position.
-        if (position.isPositive())
-            return GridPosition::adjustGridPositionForSide(position.integerPosition() - 1, side);
-
-        size_t resolvedPosition = abs(position.integerPosition()) - 1;
-        const size_t endOfTrack = explicitGridSizeForSide(side);
-
-        // Per http://lists.w3.org/Archives/Public/www-style/2013Mar/0589.html, we clamp negative value to the first line.
-        if (endOfTrack &lt; resolvedPosition)
-            return 0;
-
-        return GridPosition::adjustGridPositionForSide(endOfTrack - resolvedPosition, side);
-    }
-    case NamedGridAreaPosition:
-    {
-        // First attempt to match the grid area's edge to a named grid area: if there is a named line with the name
-        // ''&lt;custom-ident&gt;-start (for grid-*-start) / &lt;custom-ident&gt;-end'' (for grid-*-end), contributes the first such
-        // line to the grid item's placement.
-        String namedGridLine = position.namedGridLine();
-        ASSERT(!isNonExistentNamedLineOrArea(namedGridLine, style(), side));
-
-        const NamedGridLinesMap&amp; gridLineNames = gridLinesForSide(style(), side);
-        auto implicitLine = gridLineNames.find(implicitNamedGridLineForSide(namedGridLine, side));
-        if (implicitLine != gridLineNames.end())
-            return GridPosition::adjustGridPositionForSide(implicitLine-&gt;value[0], side);
-
-        // Otherwise, if there is a named line with the specified name, contributes the first such line to the grid
-        // item's placement.
-        auto explicitLine = gridLineNames.find(namedGridLine);
-        if (explicitLine != gridLineNames.end())
-            return GridPosition::adjustGridPositionForSide(explicitLine-&gt;value[0], side);
-
-        // If none of the above works specs mandate us to treat it as auto BUT we should have detected it before calling
-        // this function in resolveGridPositionsFromStyle(). We should be covered anyway by the ASSERT at the beginning
-        // of this case block.
-        ASSERT_NOT_REACHED();
-        return 0;
-    }
-    case AutoPosition:
-    case SpanPosition:
-        // 'auto' and span depend on the opposite position for resolution (e.g. grid-row: auto / 1 or grid-column: span 3 / &quot;myHeader&quot;).
-        ASSERT_NOT_REACHED();
-        return 0;
-    }
-    ASSERT_NOT_REACHED();
-    return 0;
-}
-
-std::unique_ptr&lt;GridSpan&gt; RenderGrid::resolveGridPositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp; position, GridPositionSide side) const
-{
-    if (position.isAuto())
-        return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedOppositePosition);
-
-    ASSERT(position.isSpan());
-    ASSERT(position.spanPosition() &gt; 0);
-
-    if (!position.namedGridLine().isNull()) {
-        // span 2 'c' -&gt; we need to find the appropriate grid line before / after our opposite position.
-        return resolveNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, side);
-    }
-
-    // 'span 1' is contained inside a single grid track regardless of the direction.
-    // That's why the CSS span value is one more than the offset we apply.
-    size_t positionOffset = position.spanPosition() - 1;
-    if (isStartSide(side)) {
-        size_t initialResolvedPosition = std::max&lt;int&gt;(0, resolvedOppositePosition - positionOffset);
-        return std::make_unique&lt;GridSpan&gt;(initialResolvedPosition, resolvedOppositePosition);
-    }
-
-    return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedOppositePosition + positionOffset);
-}
-
-std::unique_ptr&lt;GridSpan&gt; RenderGrid::resolveNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp; position, GridPositionSide side) const
-{
-    ASSERT(position.isSpan());
-    ASSERT(!position.namedGridLine().isNull());
-    // Negative positions are not allowed per the specification and should have been handled during parsing.
-    ASSERT(position.spanPosition() &gt; 0);
-
-    const NamedGridLinesMap&amp; gridLinesNames = gridLinesForSide(style(), side);
-    NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine());
-
-    // If there is no named grid line of that name, we resolve the position to 'auto' (which is equivalent to 'span 1' in this case).
-    // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html.
-    if (it == gridLinesNames.end())
-        return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedOppositePosition);
-
-    if (isStartSide(side))
-        return resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, it-&gt;value);
-
-    return resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, it-&gt;value);
-}
-
-static inline size_t firstNamedGridLineBeforePosition(size_t position, const Vector&lt;size_t&gt;&amp; gridLines)
-{
-    // The grid line inequality needs to be strict (which doesn't match the after / end case) because |position| is
-    // already converted to an index in our grid representation (ie one was removed from the grid line to account for
-    // the side).
-    size_t firstLineBeforePositionIndex = 0;
-    const size_t* firstLineBeforePosition = std::lower_bound(gridLines.begin(), gridLines.end(), position);
-    if (firstLineBeforePosition != gridLines.end()) {
-        if (*firstLineBeforePosition &gt; position &amp;&amp; firstLineBeforePosition != gridLines.begin())
-            --firstLineBeforePosition;
-
-        firstLineBeforePositionIndex = firstLineBeforePosition - gridLines.begin();
-    }
-    return firstLineBeforePositionIndex;
-}
-
-std::unique_ptr&lt;GridSpan&gt; RenderGrid::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp; position, const Vector&lt;size_t&gt;&amp; gridLines) const
-{
-    size_t gridLineIndex = std::max&lt;int&gt;(0, firstNamedGridLineBeforePosition(resolvedOppositePosition, gridLines) - position.spanPosition() + 1);
-    size_t resolvedGridLinePosition = gridLines[gridLineIndex];
-    if (resolvedGridLinePosition &gt; resolvedOppositePosition)
-        resolvedGridLinePosition = resolvedOppositePosition;
-    return std::make_unique&lt;GridSpan&gt;(resolvedGridLinePosition, resolvedOppositePosition);
-}
-
-std::unique_ptr&lt;GridSpan&gt; RenderGrid::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp; position, const Vector&lt;size_t&gt;&amp; gridLines) const
-{
-    size_t firstLineAfterOppositePositionIndex = gridLines.size() - 1;
-    const size_t* firstLineAfterOppositePosition = std::upper_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition);
-    if (firstLineAfterOppositePosition != gridLines.end())
-        firstLineAfterOppositePositionIndex = firstLineAfterOppositePosition - gridLines.begin();
-
-    size_t gridLineIndex = std::min(gridLines.size() - 1, firstLineAfterOppositePositionIndex + position.spanPosition() - 1);
-    size_t resolvedGridLinePosition = GridPosition::adjustGridPositionForRowEndColumnEndSide(gridLines[gridLineIndex]);
-    if (resolvedGridLinePosition &lt; resolvedOppositePosition)
-        resolvedGridLinePosition = resolvedOppositePosition;
-    return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedGridLinePosition);
-}
-
</del><span class="cx"> LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, GridTrackSizingDirection direction, const Vector&lt;GridTrack&gt;&amp; tracks) const
</span><span class="cx"> {
</span><span class="cx">     const GridCoordinate&amp; coordinate = cachedGridCoordinate(child);
</span><span class="cx">     const GridSpan&amp; span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
</span><span class="cx">     LayoutUnit gridAreaBreadth = 0;
</span><del>-    for (size_t trackIndex = span.initialPositionIndex; trackIndex &lt;= span.finalPositionIndex; ++trackIndex)
-        gridAreaBreadth += tracks[trackIndex].m_usedBreadth;
</del><ins>+    for (GridResolvedPosition trackPosition = span.resolvedInitialPosition; trackPosition &lt;= span.resolvedFinalPosition; ++trackPosition)
+        gridAreaBreadth += tracks[trackPosition.toInt()].m_usedBreadth;
</ins><span class="cx">     return gridAreaBreadth;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1125,11 +858,11 @@
</span><span class="cx"> LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const GridSizingData&amp; sizingData)
</span><span class="cx"> {
</span><span class="cx">     const GridCoordinate&amp; coordinate = cachedGridCoordinate(child);
</span><del>-    ASSERT_UNUSED(sizingData, coordinate.columns.initialPositionIndex &lt; sizingData.columnTracks.size());
-    ASSERT_UNUSED(sizingData, coordinate.rows.initialPositionIndex &lt; sizingData.rowTracks.size());
</del><ins>+    ASSERT_UNUSED(sizingData, coordinate.columns.resolvedInitialPosition.toInt() &lt; sizingData.columnTracks.size());
+    ASSERT_UNUSED(sizingData, coordinate.rows.resolvedInitialPosition.toInt() &lt; sizingData.rowTracks.size());
</ins><span class="cx"> 
</span><span class="cx">     // The grid items should be inside the grid container's border box, that's why they need to be shifted.
</span><del>-    return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex] + marginStartForChild(*child), m_rowPositions[coordinate.rows.initialPositionIndex] + marginBeforeForChild(*child));
</del><ins>+    return LayoutPoint(m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()] + marginStartForChild(*child), m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()] + marginBeforeForChild(*child));
</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 (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.h        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/rendering/RenderGrid.h        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_GRID_LAYOUT)
</span><span class="cx"> 
</span><ins>+#include &quot;GridResolvedPosition.h&quot;
</ins><span class="cx"> #include &quot;OrderIterator.h&quot;
</span><span class="cx"> #include &quot;RenderBlock.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -38,11 +39,6 @@
</span><span class="cx"> class GridSpan;
</span><span class="cx"> class GridTrack;
</span><span class="cx"> 
</span><del>-enum GridTrackSizingDirection {
-    ForColumns,
-    ForRows
-};
-
</del><span class="cx"> class RenderGrid final : public RenderBlock {
</span><span class="cx"> public:
</span><span class="cx">     RenderGrid(Element&amp;, PassRef&lt;RenderStyle&gt;);
</span><span class="lines">@@ -66,7 +62,6 @@
</span><span class="cx"> 
</span><span class="cx">     class GridIterator;
</span><span class="cx">     class GridSizingData;
</span><del>-    enum GridTrackSizingDirection { ForColumns, ForRows };
</del><span class="cx">     void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&amp;);
</span><span class="cx">     void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&amp;, LayoutUnit&amp; availableLogicalSpace);
</span><span class="cx">     bool gridElementIsShrinkToFit();
</span><span class="lines">@@ -76,7 +71,7 @@
</span><span class="cx">     void resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection, GridSizingData&amp;);
</span><span class="cx"> 
</span><span class="cx">     void growGrid(GridTrackSizingDirection);
</span><del>-    void insertItemIntoGrid(RenderBox*, size_t rowTrack, size_t columnTrack);
</del><ins>+    void insertItemIntoGrid(RenderBox*, const GridResolvedPosition&amp; rowTrack, const GridResolvedPosition&amp; columnTrack);
</ins><span class="cx">     void insertItemIntoGrid(RenderBox*, const GridCoordinate&amp;);
</span><span class="cx">     void placeItemsOnGrid();
</span><span class="cx">     void populateExplicitGridAndOrderIterator();
</span><span class="lines">@@ -100,9 +95,6 @@
</span><span class="cx">     double computeNormalizedFractionBreadth(Vector&lt;GridTrack&gt;&amp;, const GridSpan&amp; tracksSpan, GridTrackSizingDirection, LayoutUnit availableLogicalSpace) const;
</span><span class="cx"> 
</span><span class="cx">     const GridTrackSize&amp; gridTrackSize(GridTrackSizingDirection, size_t) const;
</span><del>-    size_t explicitGridColumnCount() const;
-    size_t explicitGridRowCount() const;
-    size_t explicitGridSizeForSide(GridPositionSide) const;
</del><span class="cx"> 
</span><span class="cx">     LayoutUnit logicalContentHeightForChild(RenderBox*, Vector&lt;GridTrack&gt;&amp;);
</span><span class="cx">     LayoutUnit minContentForChild(RenderBox*, GridTrackSizingDirection, Vector&lt;GridTrack&gt;&amp; columnTracks);
</span><span class="lines">@@ -110,17 +102,6 @@
</span><span class="cx">     LayoutPoint findChildLogicalPosition(RenderBox*, const GridSizingData&amp;);
</span><span class="cx">     GridCoordinate cachedGridCoordinate(const RenderBox*) const;
</span><span class="cx"> 
</span><del>-    GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, GridTrackSizingDirection, size_t) const;
-    void adjustNamedGridItemPosition(GridPosition&amp;, GridPositionSide) const;
-    void adjustGridPositionsFromStyle(GridPosition&amp; initialPosition, GridPosition&amp; finalPosition, GridPositionSide initialPositionSide, GridPositionSide finalPositionSide) const;
-    std::unique_ptr&lt;GridSpan&gt; resolveGridPositionsFromStyle(const RenderBox*, GridTrackSizingDirection) const;
-    size_t resolveNamedGridLinePositionFromStyle(const GridPosition&amp;, GridPositionSide) const;
-    size_t resolveGridPositionFromStyle(const GridPosition&amp;, GridPositionSide) const;
-    std::unique_ptr&lt;GridSpan&gt; resolveGridPositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp;, GridPositionSide) const;
-    std::unique_ptr&lt;GridSpan&gt; resolveNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp;, GridPositionSide) const;
-    std::unique_ptr&lt;GridSpan&gt; resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp;, const Vector&lt;size_t&gt;&amp;) const;
-    std::unique_ptr&lt;GridSpan&gt; resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&amp;, const Vector&lt;size_t&gt;&amp;) const;
-
</del><span class="cx">     LayoutUnit gridAreaBreadthForChild(const RenderBox* child, GridTrackSizingDirection, const Vector&lt;GridTrack&gt;&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     virtual void paintChildren(PaintInfo&amp; forSelf, const LayoutPoint&amp; paintOffset, PaintInfo&amp; forChild, bool usePrintRect) override final;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleGridCoordinateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/GridCoordinate.h (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/GridCoordinate.h        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/rendering/style/GridCoordinate.h        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -34,30 +34,31 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_GRID_LAYOUT)
</span><span class="cx"> 
</span><ins>+#include &quot;GridResolvedPosition.h&quot;
</ins><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-// A span in a single direction (either rows or columns). Note that |initialPositionIndex|
-// and |finalPositionIndex| are grid areas' indexes, NOT grid lines'. Iterating over the
-// span should include both |initialPositionIndex| and |finalPositionIndex| to be correct.
</del><ins>+// A span in a single direction (either rows or columns). Note that |resolvedInitialPosition|
+// and |resolvedFinalPosition| are grid areas' indexes, NOT grid lines'. Iterating over the
+// span should include both |resolvedInitialPosition| and |resolvedFinalPosition| to be correct.
</ins><span class="cx"> class GridSpan {
</span><span class="cx"> public:
</span><del>-    GridSpan(size_t initialPosition, size_t finalPosition)
-        : initialPositionIndex(initialPosition)
-        , finalPositionIndex(finalPosition)
</del><ins>+    GridSpan(const GridResolvedPosition&amp; resolvedInitialPosition, const GridResolvedPosition&amp; resolvedFinalPosition)
+        : resolvedInitialPosition(resolvedInitialPosition)
+        , resolvedFinalPosition(resolvedFinalPosition)
</ins><span class="cx">     {
</span><del>-        ASSERT(initialPositionIndex &lt;= finalPositionIndex);
</del><ins>+        ASSERT(resolvedInitialPosition &lt;= resolvedFinalPosition);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool operator==(const GridSpan&amp; o) const
</span><span class="cx">     {
</span><del>-        return initialPositionIndex == o.initialPositionIndex &amp;&amp; finalPositionIndex == o.finalPositionIndex;
</del><ins>+        return resolvedInitialPosition == o.resolvedInitialPosition &amp;&amp; resolvedFinalPosition == o.resolvedFinalPosition;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    size_t initialPositionIndex;
-    size_t finalPositionIndex;
</del><ins>+    GridResolvedPosition resolvedInitialPosition;
+    GridResolvedPosition resolvedFinalPosition;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // This represents a grid area that spans in both rows' and columns' direction.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleGridPositionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/GridPosition.h (169933 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/GridPosition.h        2014-06-13 10:16:43 UTC (rev 169933)
+++ trunk/Source/WebCore/rendering/style/GridPosition.h        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -45,13 +45,6 @@
</span><span class="cx">     NamedGridAreaPosition // &lt;ident&gt;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-enum GridPositionSide {
-    ColumnStartSide,
-    ColumnEndSide,
-    RowStartSide,
-    RowEndSide
-};
-
</del><span class="cx"> class GridPosition {
</span><span class="cx"> public:
</span><span class="cx">     GridPosition()
</span><span class="lines">@@ -60,20 +53,6 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static inline size_t adjustGridPositionForRowEndColumnEndSide(size_t resolvedPosition)
-    {
-        return resolvedPosition ? resolvedPosition - 1 : 0;
-    }
-
-    static size_t adjustGridPositionForSide(size_t resolvedPosition, GridPositionSide side)
-    {
-        // An item finishing on the N-th line belongs to the N-1-th cell.
-        if (side == ColumnEndSide || side == RowEndSide)
-            return adjustGridPositionForRowEndColumnEndSide(resolvedPosition);
-
-        return resolvedPosition;
-    }
-
</del><span class="cx">     bool isPositive() const { return integerPosition() &gt; 0; }
</span><span class="cx"> 
</span><span class="cx">     GridPositionType type() const { return m_type; }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleGridResolvedPositioncpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp (0 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp                                (rev 0)
+++ trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -0,0 +1,301 @@
</span><ins>+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;GridResolvedPosition.h&quot;
+
+#if ENABLE(CSS_GRID_LAYOUT)
+
+#include &quot;GridCoordinate.h&quot;
+#include &quot;RenderBox.h&quot;
+
+namespace WebCore {
+
+static inline bool isColumnSide(GridPositionSide side)
+{
+    return side == ColumnStartSide || side == ColumnEndSide;
+}
+
+static inline bool isStartSide(GridPositionSide side)
+{
+    return side == ColumnStartSide || side == RowStartSide;
+}
+
+static size_t explicitGridSizeForSide(const RenderStyle&amp; gridContainerStyle, GridPositionSide side)
+{
+    return isColumnSide(side) ? gridContainerStyle.gridColumns().size() : gridContainerStyle.gridRows().size();
+}
+
+GridSpan GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(const RenderBox&amp;, GridTrackSizingDirection, const GridResolvedPosition&amp; initialPosition)
+{
+    // FIXME: We don't support spanning with auto positions yet. Once we do, this is wrong. Also we should make
+    // sure the grid can accomodate the new item as we only grow 1 position in a given direction.
+    return GridSpan(initialPosition, initialPosition);
+}
+
+static inline const NamedGridLinesMap&amp; gridLinesForSide(const RenderStyle&amp; style, GridPositionSide side)
+{
+    return isColumnSide(side) ? style.namedGridColumnLines() : style.namedGridRowLines();
+}
+
+static inline const String implicitNamedGridLineForSide(const String&amp; lineName, GridPositionSide side)
+{
+    return lineName + (isStartSide(side) ? &quot;-start&quot; : &quot;-end&quot;);
+}
+
+static bool isNonExistentNamedLineOrArea(const String&amp; lineName, const RenderStyle&amp; style, GridPositionSide side)
+{
+    const NamedGridLinesMap&amp; gridLineNames = gridLinesForSide(style, side);
+    return !gridLineNames.contains(implicitNamedGridLineForSide(lineName, side)) &amp;&amp; !gridLineNames.contains(lineName);
+}
+
+void GridResolvedPosition::adjustGridPositionsFromStyle(const RenderStyle&amp; gridContainerStyle, GridPosition&amp; initialPosition, GridPosition&amp; finalPosition, GridPositionSide initialPositionSide, GridPositionSide finalPositionSide)
+{
+    ASSERT(isColumnSide(initialPositionSide) == isColumnSide(finalPositionSide));
+
+    // We must handle the placement error handling code here instead of in the StyleAdjuster because we don't want to
+    // overwrite the specified values.
+    if (initialPosition.isSpan() &amp;&amp; finalPosition.isSpan())
+        finalPosition.setAutoPosition();
+
+    // Try to early detect the case of non existing named grid lines. This way we could assume later that
+    // GridResolvedPosition::resolveGrisPositionFromStyle() won't require the autoplacement to run, i.e., it'll always return a
+    // valid resolved position.
+    if (initialPosition.isNamedGridArea() &amp;&amp; isNonExistentNamedLineOrArea(initialPosition.namedGridLine(), gridContainerStyle, initialPositionSide))
+        initialPosition.setAutoPosition();
+
+    if (finalPosition.isNamedGridArea() &amp;&amp; isNonExistentNamedLineOrArea(finalPosition.namedGridLine(), gridContainerStyle, finalPositionSide))
+        finalPosition.setAutoPosition();
+}
+
+std::unique_ptr&lt;GridSpan&gt; GridResolvedPosition::resolveGridPositionsFromStyle(const RenderStyle&amp; gridContainerStyle, const RenderBox&amp; gridItem, GridTrackSizingDirection direction)
+{
+    GridPosition initialPosition = (direction == ForColumns) ? gridItem.style().gridItemColumnStart() : gridItem.style().gridItemRowStart();
+    const GridPositionSide initialPositionSide = (direction == ForColumns) ? ColumnStartSide : RowStartSide;
+    GridPosition finalPosition = (direction == ForColumns) ? gridItem.style().gridItemColumnEnd() : gridItem.style().gridItemRowEnd();
+    const GridPositionSide finalPositionSide = (direction == ForColumns) ? ColumnEndSide : RowEndSide;
+
+    adjustGridPositionsFromStyle(gridContainerStyle, initialPosition, finalPosition, initialPositionSide, finalPositionSide);
+
+    if (initialPosition.shouldBeResolvedAgainstOppositePosition() &amp;&amp; finalPosition.shouldBeResolvedAgainstOppositePosition()) {
+        if (gridContainerStyle.gridAutoFlow() == AutoFlowNone)
+            return std::make_unique&lt;GridSpan&gt;(0, 0);
+
+        // We can't get our grid positions without running the auto placement algorithm.
+        return nullptr;
+    }
+
+    if (initialPosition.shouldBeResolvedAgainstOppositePosition()) {
+        // Infer the position from the final position ('auto / 1' or 'span 2 / 3' case).
+        const GridResolvedPosition finalResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalPositionSide);
+        return resolveGridPositionAgainstOppositePosition(gridContainerStyle, finalResolvedPosition, initialPosition, initialPositionSide);
+    }
+
+    if (finalPosition.shouldBeResolvedAgainstOppositePosition()) {
+        // Infer our position from the initial position ('1 / auto' or '3 / span 2' case).
+        const GridResolvedPosition initialResolvedPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialPositionSide);
+        return resolveGridPositionAgainstOppositePosition(gridContainerStyle, initialResolvedPosition, finalPosition, finalPositionSide);
+    }
+
+    GridResolvedPosition resolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialPositionSide);
+    GridResolvedPosition resolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalPositionSide);
+
+    // If 'grid-row-end' specifies a line at or before that specified by 'grid-row-start', it computes to 'span 1'.
+    if (resolvedFinalPosition &lt; resolvedInitialPosition)
+        resolvedFinalPosition = resolvedInitialPosition;
+
+    return std::make_unique&lt;GridSpan&gt;(resolvedInitialPosition, resolvedFinalPosition);
+}
+
+GridResolvedPosition GridResolvedPosition::resolveNamedGridLinePositionFromStyle(const RenderStyle&amp; gridContainerStyle, const GridPosition&amp; position, GridPositionSide side)
+{
+    ASSERT(!position.namedGridLine().isNull());
+
+    const NamedGridLinesMap&amp; gridLinesNames = isColumnSide(side) ? gridContainerStyle.namedGridColumnLines() : gridContainerStyle.namedGridRowLines();
+    NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine());
+    if (it == gridLinesNames.end()) {
+        if (position.isPositive())
+            return 0;
+        const size_t lastLine = explicitGridSizeForSide(gridContainerStyle, side);
+        return GridResolvedPosition::adjustGridPositionForSide(lastLine, side);
+    }
+
+    size_t namedGridLineIndex;
+    if (position.isPositive())
+        namedGridLineIndex = std::min&lt;size_t&gt;(position.integerPosition(), it-&gt;value.size()) - 1;
+    else
+        namedGridLineIndex = std::max&lt;int&gt;(it-&gt;value.size() - abs(position.integerPosition()), 0);
+    return GridResolvedPosition::adjustGridPositionForSide(it-&gt;value[namedGridLineIndex], side);
+}
+
+GridResolvedPosition GridResolvedPosition::resolveGridPositionFromStyle(const RenderStyle&amp; gridContainerStyle, const GridPosition&amp; position, GridPositionSide side)
+{
+    switch (position.type()) {
+    case ExplicitPosition: {
+        ASSERT(position.integerPosition());
+
+        if (!position.namedGridLine().isNull())
+            return resolveNamedGridLinePositionFromStyle(gridContainerStyle, position, side);
+
+        // Handle &lt;integer&gt; explicit position.
+        if (position.isPositive())
+            return GridResolvedPosition::adjustGridPositionForSide(position.integerPosition() - 1, side);
+
+        size_t resolvedPosition = abs(position.integerPosition()) - 1;
+        const size_t endOfTrack = explicitGridSizeForSide(gridContainerStyle, side);
+
+        // Per http://lists.w3.org/Archives/Public/www-style/2013Mar/0589.html, we clamp negative value to the first line.
+        if (endOfTrack &lt; resolvedPosition)
+            return 0;
+
+        return GridResolvedPosition::adjustGridPositionForSide(endOfTrack - resolvedPosition, side);
+    }
+    case NamedGridAreaPosition:
+    {
+        // First attempt to match the grid area's edge to a named grid area: if there is a named line with the name
+        // ''&lt;custom-ident&gt;-start (for grid-*-start) / &lt;custom-ident&gt;-end'' (for grid-*-end), contributes the first such
+        // line to the grid item's placement.
+        String namedGridLine = position.namedGridLine();
+        ASSERT(!isNonExistentNamedLineOrArea(namedGridLine, gridContainerStyle, side));
+
+        const NamedGridLinesMap&amp; gridLineNames = gridLinesForSide(gridContainerStyle, side);
+        auto implicitLine = gridLineNames.find(implicitNamedGridLineForSide(namedGridLine, side));
+        if (implicitLine != gridLineNames.end())
+            return GridResolvedPosition::adjustGridPositionForSide(implicitLine-&gt;value[0], side);
+
+        // Otherwise, if there is a named line with the specified name, contributes the first such line to the grid
+        // item's placement.
+        auto explicitLine = gridLineNames.find(namedGridLine);
+        if (explicitLine != gridLineNames.end())
+            return GridResolvedPosition::adjustGridPositionForSide(explicitLine-&gt;value[0], side);
+
+        // If none of the above works specs mandate us to treat it as auto BUT we should have detected it before calling
+        // this function in resolveGridPositionsFromStyle(). We should be covered anyway by the ASSERT at the beginning
+        // of this case block.
+        ASSERT_NOT_REACHED();
+        return 0;
+    }
+    case AutoPosition:
+    case SpanPosition:
+        // 'auto' and span depend on the opposite position for resolution (e.g. grid-row: auto / 1 or grid-column: span 3 / &quot;myHeader&quot;).
+        ASSERT_NOT_REACHED();
+        return GridResolvedPosition(0);
+    }
+    ASSERT_NOT_REACHED();
+    return GridResolvedPosition(0);
+}
+
+std::unique_ptr&lt;GridSpan&gt; GridResolvedPosition::resolveGridPositionAgainstOppositePosition(const RenderStyle&amp; gridContainerStyle, const GridResolvedPosition&amp; resolvedOppositePosition, const GridPosition&amp; position, GridPositionSide side)
+{
+    if (position.isAuto())
+        return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedOppositePosition);
+
+    ASSERT(position.isSpan());
+    ASSERT(position.spanPosition() &gt; 0);
+
+    if (!position.namedGridLine().isNull()) {
+        // span 2 'c' -&gt; we need to find the appropriate grid line before / after our opposite position.
+        return resolveNamedGridLinePositionAgainstOppositePosition(gridContainerStyle, resolvedOppositePosition, position, side);
+    }
+
+    // 'span 1' is contained inside a single grid track regardless of the direction.
+    // That's why the CSS span value is one more than the offset we apply.
+    size_t positionOffset = position.spanPosition() - 1;
+    if (isStartSide(side)) {
+        size_t initialResolvedPosition = std::max&lt;int&gt;(0, resolvedOppositePosition.toInt() - positionOffset);
+        return std::make_unique&lt;GridSpan&gt;(initialResolvedPosition, resolvedOppositePosition);
+    }
+
+    return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedOppositePosition.toInt() + positionOffset);
+}
+
+std::unique_ptr&lt;GridSpan&gt; GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle&amp; gridContainerStyle, const GridResolvedPosition&amp; resolvedOppositePosition, const GridPosition&amp; position, GridPositionSide side)
+{
+    ASSERT(position.isSpan());
+    ASSERT(!position.namedGridLine().isNull());
+    // Negative positions are not allowed per the specification and should have been handled during parsing.
+    ASSERT(position.spanPosition() &gt; 0);
+
+    const NamedGridLinesMap&amp; gridLinesNames = isColumnSide(side) ? gridContainerStyle.namedGridColumnLines() : gridContainerStyle.namedGridRowLines();
+    NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine());
+
+    // If there is no named grid line of that name, we resolve the position to 'auto' (which is equivalent to 'span 1' in this case).
+    // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html.
+    if (it == gridLinesNames.end())
+        return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedOppositePosition);
+
+    if (side == RowStartSide || side == ColumnStartSide)
+        return resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, it-&gt;value);
+
+    return resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, it-&gt;value);
+}
+
+static inline size_t firstNamedGridLineBeforePosition(size_t position, const Vector&lt;size_t&gt;&amp; gridLines)
+{
+    // The grid line inequality needs to be strict (which doesn't match the after / end case) because |position| is
+    // already converted to an index in our grid representation (ie one was removed from the grid line to account for
+    // the side).
+    size_t firstLineBeforePositionIndex = 0;
+    const size_t* firstLineBeforePosition = std::lower_bound(gridLines.begin(), gridLines.end(), position);
+    if (firstLineBeforePosition != gridLines.end()) {
+        if (*firstLineBeforePosition &gt; position &amp;&amp; firstLineBeforePosition != gridLines.begin())
+            --firstLineBeforePosition;
+
+        firstLineBeforePositionIndex = firstLineBeforePosition - gridLines.begin();
+    }
+    return firstLineBeforePositionIndex;
+}
+
+std::unique_ptr&lt;GridSpan&gt; GridResolvedPosition::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition&amp; resolvedOppositePosition, const GridPosition&amp; position, const Vector&lt;size_t&gt;&amp; gridLines)
+{
+    size_t gridLineIndex = std::max&lt;int&gt;(0, firstNamedGridLineBeforePosition(resolvedOppositePosition.toInt(), gridLines) - position.spanPosition() + 1);
+    GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition(gridLines[gridLineIndex]);
+    if (resolvedGridLinePosition &gt; resolvedOppositePosition)
+        resolvedGridLinePosition = resolvedOppositePosition;
+    return std::make_unique&lt;GridSpan&gt;(resolvedGridLinePosition, resolvedOppositePosition);
+}
+
+std::unique_ptr&lt;GridSpan&gt; GridResolvedPosition::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition&amp; resolvedOppositePosition, const GridPosition&amp; position, const Vector&lt;size_t&gt;&amp; gridLines)
+{
+    size_t firstLineAfterOppositePositionIndex = gridLines.size() - 1;
+    const size_t* firstLineAfterOppositePosition = std::upper_bound(gridLines.begin(), gridLines.end(), resolvedOppositePosition);
+    if (firstLineAfterOppositePosition != gridLines.end())
+        firstLineAfterOppositePositionIndex = firstLineAfterOppositePosition - gridLines.begin();
+
+    size_t gridLineIndex = std::min(gridLines.size() - 1, firstLineAfterOppositePositionIndex + position.spanPosition() - 1);
+    GridResolvedPosition resolvedGridLinePosition = GridResolvedPosition::adjustGridPositionForRowEndColumnEndSide(gridLines[gridLineIndex]);
+    if (resolvedGridLinePosition &lt; resolvedOppositePosition)
+        resolvedGridLinePosition = resolvedOppositePosition;
+    return std::make_unique&lt;GridSpan&gt;(resolvedOppositePosition, resolvedGridLinePosition);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(CSS_GRID_LAYOUT)
</ins></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleGridResolvedPositionh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/rendering/style/GridResolvedPosition.h (0 => 169934)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/GridResolvedPosition.h                                (rev 0)
+++ trunk/Source/WebCore/rendering/style/GridResolvedPosition.h        2014-06-13 13:09:58 UTC (rev 169934)
</span><span class="lines">@@ -0,0 +1,148 @@
</span><ins>+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GridResolvedPosition_h
+#define GridResolvedPosition_h
+
+#if ENABLE(CSS_GRID_LAYOUT)
+
+#include &quot;GridPosition.h&quot;
+
+namespace WebCore {
+
+class GridSpan;
+class RenderBox;
+class RenderStyle;
+
+enum GridPositionSide {
+    ColumnStartSide,
+    ColumnEndSide,
+    RowStartSide,
+    RowEndSide
+};
+
+enum GridTrackSizingDirection {
+    ForColumns,
+    ForRows
+};
+
+// This class represents an index into one of the dimensions of the grid array.
+// Wraps a size_t integer just for the purpose of knowing what we manipulate in the grid code.
+class GridResolvedPosition {
+public:
+    static GridResolvedPosition adjustGridPositionForRowEndColumnEndSide(size_t resolvedPosition)
+    {
+        return resolvedPosition ? GridResolvedPosition(resolvedPosition - 1) : GridResolvedPosition(0);
+    }
+
+    static GridResolvedPosition adjustGridPositionForSide(size_t resolvedPosition, GridPositionSide side)
+    {
+        // An item finishing on the N-th line belongs to the N-1-th cell.
+        if (side == ColumnEndSide || side == RowEndSide)
+            return adjustGridPositionForRowEndColumnEndSide(resolvedPosition);
+
+        return GridResolvedPosition(resolvedPosition);
+    }
+
+    static GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox&amp;, GridTrackSizingDirection, const GridResolvedPosition&amp;);
+    static void adjustNamedGridItemPosition(const RenderStyle&amp;, GridPosition&amp;, GridPositionSide);
+    static void adjustGridPositionsFromStyle(const RenderStyle&amp;, GridPosition&amp; initialPosition, GridPosition&amp; finalPosition, GridPositionSide initialPositionSide, GridPositionSide finalPositionSide);
+    static std::unique_ptr&lt;GridSpan&gt; resolveGridPositionsFromStyle(const RenderStyle&amp;, const RenderBox&amp;, GridTrackSizingDirection);
+    static GridResolvedPosition resolveNamedGridLinePositionFromStyle(const RenderStyle&amp;, const GridPosition&amp;, GridPositionSide);
+    static GridResolvedPosition resolveGridPositionFromStyle(const RenderStyle&amp;, const GridPosition&amp;, GridPositionSide);
+    static std::unique_ptr&lt;GridSpan&gt; resolveGridPositionAgainstOppositePosition(const RenderStyle&amp;, const GridResolvedPosition&amp;, const GridPosition&amp;, GridPositionSide);
+    static std::unique_ptr&lt;GridSpan&gt; resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle&amp;, const GridResolvedPosition&amp;, const GridPosition&amp;, GridPositionSide);
+    static std::unique_ptr&lt;GridSpan&gt; resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition&amp;, const GridPosition&amp;, const Vector&lt;size_t&gt;&amp;);
+    static std::unique_ptr&lt;GridSpan&gt; resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(const GridResolvedPosition&amp;, const GridPosition&amp;, const Vector&lt;size_t&gt;&amp;);
+
+    GridResolvedPosition(size_t position)
+        : m_integerPosition(position)
+    {
+    }
+
+    GridResolvedPosition(const GridPosition&amp; position, GridPositionSide side)
+    {
+        ASSERT(position.integerPosition());
+        size_t integerPosition = position.integerPosition() - 1;
+
+        m_integerPosition = adjustGridPositionForSide(integerPosition, side).m_integerPosition;
+    }
+
+    GridResolvedPosition&amp; operator++()
+    {
+        m_integerPosition++;
+        return *this;
+    }
+
+    bool operator==(const GridResolvedPosition&amp; other) const
+    {
+        return m_integerPosition == other.m_integerPosition;
+    }
+
+    bool operator&lt;(const GridResolvedPosition&amp; other) const
+    {
+        return m_integerPosition &lt; other.m_integerPosition;
+    }
+
+    bool operator&gt;(const GridResolvedPosition&amp; other) const
+    {
+        return m_integerPosition &gt; other.m_integerPosition;
+    }
+
+    bool operator&lt;=(const GridResolvedPosition&amp; other) const
+    {
+        return m_integerPosition &lt;= other.m_integerPosition;
+    }
+
+    bool operator&gt;=(const GridResolvedPosition&amp; other) const
+    {
+        return m_integerPosition &gt;= other.m_integerPosition;
+    }
+
+    size_t toInt() const
+    {
+        return m_integerPosition;
+    }
+
+    GridResolvedPosition next() const
+    {
+        return GridResolvedPosition(m_integerPosition + 1);
+    }
+
+private:
+
+    size_t m_integerPosition;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(CSS_GRID_LAYOUT)
+
+#endif // GridResolvedPosition_h
</ins></span></pre>
</div>
</div>

</body>
</html>