<!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>[182628] 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/182628">182628</a></dd>
<dt>Author</dt> <dd>svillar@igalia.com</dd>
<dt>Date</dt> <dd>2015-04-10 03:51:01 -0700 (Fri, 10 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Grid Layout] Fix raw function pointer usages
https://bugs.webkit.org/show_bug.cgi?id=143481

Reviewed by Antti Koivisto.

The argument list of
resolveContentBasedTrackSizingFunctionsForItems() became too long
and rather incomprehensible as it included up to 6 function
pointers. This replaces all of them by an enum which describes the
phase of the algorithm that is currently running. With that phase
we have enough information to select the right function to call.

In order not to tangle up too much the method, the new explicit
switch statements where moved to static helper functions.

No new tests as this is just a code refactoring.

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
(WebCore::RenderGrid::trackSizeForTrackSizeComputationPhase): New helper function.
(WebCore::RenderGrid::shouldProcessTrackForTrackSizeComputationPhase): Ditto.
(WebCore::RenderGrid::trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase): Ditto.
(WebCore::RenderGrid::updateTrackSizeForTrackSizeComputationPhase): Ditto.
(WebCore::RenderGrid::currentItemSizeForTrackSizeComputationPhase): Ditto.
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems):
(WebCore::RenderGrid::distributeSpaceToTracks):
* rendering/RenderGrid.h:</pre>

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

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (182627 => 182628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-10 10:48:47 UTC (rev 182627)
+++ trunk/Source/WebCore/ChangeLog        2015-04-10 10:51:01 UTC (rev 182628)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2015-04-09  Sergio Villar Senin  &lt;svillar@igalia.com&gt;
+
+        [CSS Grid Layout] Fix raw function pointer usages
+        https://bugs.webkit.org/show_bug.cgi?id=143481
+
+        Reviewed by Antti Koivisto.
+
+        The argument list of
+        resolveContentBasedTrackSizingFunctionsForItems() became too long
+        and rather incomprehensible as it included up to 6 function
+        pointers. This replaces all of them by an enum which describes the
+        phase of the algorithm that is currently running. With that phase
+        we have enough information to select the right function to call.
+
+        In order not to tangle up too much the method, the new explicit
+        switch statements where moved to static helper functions.
+
+        No new tests as this is just a code refactoring.
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
+        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
+        (WebCore::RenderGrid::trackSizeForTrackSizeComputationPhase): New helper function.
+        (WebCore::RenderGrid::shouldProcessTrackForTrackSizeComputationPhase): Ditto.
+        (WebCore::RenderGrid::trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase): Ditto.
+        (WebCore::RenderGrid::updateTrackSizeForTrackSizeComputationPhase): Ditto.
+        (WebCore::RenderGrid::currentItemSizeForTrackSizeComputationPhase): Ditto.
+        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems):
+        (WebCore::RenderGrid::distributeSpaceToTracks):
+        * rendering/RenderGrid.h:
+
</ins><span class="cx"> 2015-04-10  Adam Bergkvist  &lt;adam.bergkvist@ericsson.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebRTC: Remove AudioStreamTrack and VideoStreamTrack (removed in spec)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (182627 => 182628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp        2015-04-10 10:48:47 UTC (rev 182627)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp        2015-04-10 10:51:01 UTC (rev 182628)
</span><span class="lines">@@ -372,7 +372,7 @@
</span><span class="cx">             tracksForDistribution[i]-&gt;setPlannedSize(tracksForDistribution[i]-&gt;baseSize());
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        distributeSpaceToTracks(tracksForDistribution, nullptr, &amp;GridTrack::baseSize, availableLogicalSpace);
</del><ins>+        distributeSpaceToTracks&lt;DistributeSpaceToBaseSizes&gt;(tracksForDistribution, nullptr, availableLogicalSpace);
</ins><span class="cx"> 
</span><span class="cx">         for (auto* track : tracksForDistribution)
</span><span class="cx">             track-&gt;setBaseSize(track-&gt;plannedSize());
</span><span class="lines">@@ -642,10 +642,10 @@
</span><span class="cx">     auto end = sizingData.itemsSortedByIncreasingSpan.end();
</span><span class="cx">     while (it != end) {
</span><span class="cx">         GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) };
</span><del>-        resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &amp;GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &amp;RenderGrid::minContentForChild, &amp;GridTrack::baseSize, &amp;GridTrack::baseSize, &amp;GridTrack::setBaseSize, &amp;GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
-        resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &amp;GridTrackSize::hasMaxContentMinTrackBreadth, &amp;RenderGrid::maxContentForChild, &amp;GridTrack::baseSize, &amp;GridTrack::baseSize, &amp;GridTrack::setBaseSize, &amp;GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
-        resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &amp;GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &amp;RenderGrid::minContentForChild, &amp;GridTrack::growthLimit, &amp;GridTrack::growthLimitIfNotInfinite, &amp;GridTrack::setGrowthLimit);
-        resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &amp;GridTrackSize::hasMaxContentMaxTrackBreadth, &amp;RenderGrid::maxContentForChild, &amp;GridTrack::growthLimit, &amp;GridTrack::growthLimitIfNotInfinite, &amp;GridTrack::setGrowthLimit);
</del><ins>+        resolveContentBasedTrackSizingFunctionsForItems&lt;ResolveIntrinsicMinimums&gt;(direction, sizingData, spanGroupRange);
+        resolveContentBasedTrackSizingFunctionsForItems&lt;ResolveMaxContentMinimums&gt;(direction, sizingData, spanGroupRange);
+        resolveContentBasedTrackSizingFunctionsForItems&lt;ResolveIntrinsicMaximums&gt;(direction, sizingData, spanGroupRange);
+        resolveContentBasedTrackSizingFunctionsForItems&lt;ResolveMaxContentMaximums&gt;(direction, sizingData, spanGroupRange);
</ins><span class="cx">         it = spanGroupRange.rangeEnd;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -672,12 +672,94 @@
</span><span class="cx">         track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gridItem, direction, columnTracks)));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, const GridItemsSpanGroupRange&amp; gridItemsWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackSize, AccumulatorGetter correctedTrackSize, AccumulatorGrowFunction trackGrowthFunction, FilterFunction growAboveMaxBreadthFilterFunction)
</del><ins>+const LayoutUnit&amp; RenderGrid::trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, GridTrack&amp; track, TrackSizeRestriction restriction)
</ins><span class="cx"> {
</span><ins>+    switch (phase) {
+    case ResolveIntrinsicMinimums:
+    case ResolveMaxContentMinimums:
+        return track.baseSize();
+        break;
+    case ResolveIntrinsicMaximums:
+    case ResolveMaxContentMaximums:
+        return restriction == AllowInfinity ? track.growthLimit() : track.growthLimitIfNotInfinite();
+        break;
+    }
+
+    ASSERT_NOT_REACHED();
+    return track.baseSize();
+}
+
+bool RenderGrid::shouldProcessTrackForTrackSizeComputationPhase(TrackSizeComputationPhase phase, const GridTrackSize&amp; trackSize)
+{
+    switch (phase) {
+    case ResolveIntrinsicMinimums:
+        return trackSize.hasMinOrMaxContentMinTrackBreadth();
+    case ResolveMaxContentMinimums:
+        return trackSize.hasMaxContentMinTrackBreadth();
+    case ResolveIntrinsicMaximums:
+        return trackSize.hasMinOrMaxContentMaxTrackBreadth();
+    case ResolveMaxContentMaximums:
+        return trackSize.hasMaxContentMaxTrackBreadth();
+    }
+
+    ASSERT_NOT_REACHED();
+    return false;
+}
+
+bool RenderGrid::trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(TrackSizeComputationPhase phase, const GridTrackSize&amp; trackSize)
+{
+    switch (phase) {
+    case ResolveIntrinsicMinimums:
+        return trackSize.hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth();
+    case ResolveMaxContentMinimums:
+        return trackSize.hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth();
+    case ResolveIntrinsicMaximums:
+    case ResolveMaxContentMaximums:
+        return true;
+    }
+
+    ASSERT_NOT_REACHED();
+    return false;
+}
+
+void RenderGrid::updateTrackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, GridTrack&amp; track)
+{
+    switch (phase) {
+    case ResolveIntrinsicMinimums:
+    case ResolveMaxContentMinimums:
+        track.setBaseSize(track.plannedSize());
+        return;
+    case ResolveIntrinsicMaximums:
+    case ResolveMaxContentMaximums:
+        track.setGrowthLimit(track.plannedSize());
+        return;
+    }
+
+    ASSERT_NOT_REACHED();
+}
+
+LayoutUnit RenderGrid::currentItemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, RenderBox&amp; gridItem, GridTrackSizingDirection direction, Vector&lt;GridTrack&gt;&amp; columnTracks)
+{
+    switch (phase) {
+    case ResolveIntrinsicMinimums:
+    case ResolveIntrinsicMaximums:
+        return minContentForChild(gridItem, direction, columnTracks);
+    case ResolveMaxContentMinimums:
+    case ResolveMaxContentMaximums:
+        return maxContentForChild(gridItem, direction, columnTracks);
+    }
+
+    ASSERT_NOT_REACHED();
+    return 0;
+}
+
+template &lt;RenderGrid::TrackSizeComputationPhase phase&gt;
+void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, const GridItemsSpanGroupRange&amp; gridItemsWithSpan)
+{
</ins><span class="cx">     Vector&lt;GridTrack&gt;&amp; tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
</span><span class="cx">     for (const auto&amp; trackIndex : sizingData.contentSizedTracksIndex) {
</span><span class="cx">         GridTrack&amp; track = tracks[trackIndex];
</span><del>-        track.setPlannedSize((track.*trackSize)());
</del><ins>+        track.setPlannedSize(trackSizeForTrackSizeComputationPhase(phase, track, AllowInfinity));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEnd; ++it) {
</span><span class="lines">@@ -692,31 +774,40 @@
</span><span class="cx">         for (auto&amp; trackPosition : itemSpan) {
</span><span class="cx">             const GridTrackSize&amp; trackSize = gridTrackSize(direction, trackPosition.toInt());
</span><span class="cx">             GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()];
</span><del>-            spanningTracksSize += (track.*correctedTrackSize)();
-            if (!(trackSize.*filterFunction)())
</del><ins>+            spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity);
+            if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize))
</ins><span class="cx">                 continue;
</span><span class="cx"> 
</span><span class="cx">             sizingData.filteredTracks.append(&amp;track);
</span><span class="cx"> 
</span><del>-            if (!growAboveMaxBreadthFilterFunction || (trackSize.*growAboveMaxBreadthFilterFunction)())
</del><ins>+            if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(phase, trackSize))
</ins><span class="cx">                 sizingData.growBeyondGrowthLimitsTracks.append(&amp;track);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (sizingData.filteredTracks.isEmpty())
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><ins>+        LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phase, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTracksSize;
</ins><span class="cx">         // Specs mandate to floor extraSpace to 0. Instead we directly avoid the function call in those cases as it will be
</span><span class="cx">         // a noop in terms of track sizing.
</span><del>-        LayoutUnit extraSpace = (this-&gt;*sizingFunction)(gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTracksSize;
</del><span class="cx">         if (extraSpace &gt; 0) {
</span><span class="cx">             auto* tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimitsTracks.isEmpty() ? &amp;sizingData.filteredTracks : &amp;sizingData.growBeyondGrowthLimitsTracks;
</span><del>-            distributeSpaceToTracks(sizingData.filteredTracks, tracksToGrowBeyondGrowthLimits, correctedTrackSize, extraSpace);
</del><ins>+            switch (phase) {
+            case ResolveIntrinsicMinimums:
+            case ResolveMaxContentMinimums:
+                distributeSpaceToTracks&lt;DistributeSpaceToBaseSizes&gt;(sizingData.filteredTracks, tracksToGrowBeyondGrowthLimits, extraSpace);
+                break;
+            case ResolveIntrinsicMaximums:
+            case ResolveMaxContentMaximums:
+                distributeSpaceToTracks&lt;DistributeSpaceToGrowthLimits&gt;(sizingData.filteredTracks, tracksToGrowBeyondGrowthLimits, extraSpace);
+                break;
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (const auto&amp; trackIndex : sizingData.contentSizedTracksIndex) {
</span><span class="cx">         GridTrack&amp; track = tracks[trackIndex];
</span><del>-        (track.*trackGrowthFunction)(track.plannedSize());
</del><ins>+        updateTrackSizeForTrackSizeComputationPhase(phase, track);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -733,7 +824,8 @@
</span><span class="cx">     return (track1-&gt;growthLimit() - track1-&gt;baseSize()) &lt; (track2-&gt;growthLimit() - track2-&gt;baseSize());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp; tracks, const Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, AccumulatorGetter trackGetter, LayoutUnit&amp; availableLogicalSpace)
</del><ins>+template &lt;RenderGrid::DistributeSpacePhase phase&gt;
+void RenderGrid::distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp; tracks, const Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, LayoutUnit&amp; availableLogicalSpace)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(availableLogicalSpace &gt; 0);
</span><span class="cx">     std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
</span><span class="lines">@@ -742,7 +834,15 @@
</span><span class="cx"> 
</span><span class="cx">     for (unsigned i = 0; i &lt; tracksSize; ++i) {
</span><span class="cx">         GridTrack&amp; track = *tracks[i];
</span><del>-        const LayoutUnit&amp; trackBreadth = (track.*trackGetter)();
</del><ins>+        LayoutUnit trackBreadth;
+        switch (phase) {
+        case DistributeSpaceToBaseSizes:
+            trackBreadth = track.baseSize();
+            break;
+        case DistributeSpaceToGrowthLimits:
+            trackBreadth = track.growthLimitIfNotInfinite();
+            break;
+        }
</ins><span class="cx">         bool infiniteGrowthPotential = track.growthLimitIsInfinite();
</span><span class="cx">         LayoutUnit trackGrowthPotential = infiniteGrowthPotential ? track.growthLimit() : track.growthLimit() - trackBreadth;
</span><span class="cx">         track.tempSize() = trackBreadth;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.h (182627 => 182628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.h        2015-04-10 10:48:47 UTC (rev 182627)
+++ trunk/Source/WebCore/rendering/RenderGrid.h        2015-04-10 10:51:01 UTC (rev 182628)
</span><span class="lines">@@ -87,14 +87,30 @@
</span><span class="cx">     void populateGridPositions(const GridSizingData&amp;);
</span><span class="cx">     void clearGrid();
</span><span class="cx"> 
</span><del>-    typedef LayoutUnit (RenderGrid::* SizingFunction)(RenderBox&amp;, GridTrackSizingDirection, Vector&lt;GridTrack&gt;&amp;);
-    typedef const LayoutUnit&amp; (GridTrack::* AccumulatorGetter)() const;
-    typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit);
-    typedef bool (GridTrackSize::* FilterFunction)() const;
</del><ins>+    enum TrackSizeRestriction {
+        AllowInfinity,
+        ForbidInfinity,
+    };
+    enum TrackSizeComputationPhase {
+        ResolveIntrinsicMinimums,
+        ResolveMaxContentMinimums,
+        ResolveIntrinsicMaximums,
+        ResolveMaxContentMaximums,
+    };
+    enum DistributeSpacePhase {
+        DistributeSpaceToBaseSizes,
+        DistributeSpaceToGrowthLimits,
+    };
+    static const LayoutUnit&amp; trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase, GridTrack&amp;, TrackSizeRestriction);
+    static bool shouldProcessTrackForTrackSizeComputationPhase(TrackSizeComputationPhase, const GridTrackSize&amp;);
+    static bool trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(TrackSizeComputationPhase, const GridTrackSize&amp;);
+    static void updateTrackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase, GridTrack&amp;);
+    LayoutUnit currentItemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase, RenderBox&amp;, GridTrackSizingDirection, Vector&lt;GridTrack&gt;&amp; columnTracks);
+
</ins><span class="cx">     typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
</span><span class="cx">     void resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection, const GridCoordinate&amp;, RenderBox&amp; gridItem, GridTrack&amp;, Vector&lt;GridTrack&gt;&amp; columnTracks);
</span><del>-    void resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection, GridSizingData&amp;, const GridItemsSpanGroupRange&amp;, FilterFunction, SizingFunction, AccumulatorGetter trackSize, AccumulatorGetter correctedTrackSize, AccumulatorGrowFunction, FilterFunction growAboveMaxBreadthFilterFunction = nullptr);
-    void distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp;, const Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, AccumulatorGetter, LayoutUnit&amp; availableLogicalSpace);
</del><ins>+    template &lt;TrackSizeComputationPhase&gt; void resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection, GridSizingData&amp;, const GridItemsSpanGroupRange&amp;);
+    template &lt;DistributeSpacePhase&gt; void distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp;, const Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, LayoutUnit&amp; availableLogicalSpace);
</ins><span class="cx"> 
</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></pre>
</div>
</div>

</body>
</html>