Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1089)

Unified Diff: Source/core/rendering/RenderGrid.cpp

Issue 582733003: [CSSGridLayout] Pass the valid tracks for |tracksForGrowAboveMaxBreadth| (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/RenderGrid.cpp
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
index 508b5fe0f880dec58c923b9335334aa292519cde..80cf4b8afb51cede78547ff1096dbd7d5e66a8c5 100644
--- a/Source/core/rendering/RenderGrid.cpp
+++ b/Source/core/rendering/RenderGrid.cpp
@@ -184,6 +184,7 @@ public:
// Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free.
Vector<LayoutUnit> distributeTrackVector;
Vector<GridTrack*> filteredTracks;
+ Vector<size_t> growAboveMaxBreadthTrackIndexes;
};
RenderGrid::RenderGrid(Element* element)
@@ -701,8 +702,8 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
for (Vector<GridItemWithSpan>::iterator it = itemsSortedByIncreasingSpan.begin(); it != end; ++it) {
RenderBox* gridItem = it->first;
- resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
- resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
+ resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
+ resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
}
@@ -713,12 +714,13 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
}
}
-void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction)
+void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction growAboveMaxBreadthFilterFunction)
{
const GridCoordinate coordinate = cachedGridCoordinate(gridItem);
const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition;
+ sizingData.growAboveMaxBreadthTrackIndexes.shrink(0);
sizingData.filteredTracks.shrink(0);
for (GridResolvedPosition trackPosition = initialTrackPosition; trackPosition <= finalTrackPosition; ++trackPosition) {
const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition.toInt());
@@ -727,6 +729,9 @@ void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()];
sizingData.filteredTracks.append(&track);
+
+ if (growAboveMaxBreadthFilterFunction && (trackSize.*growAboveMaxBreadthFilterFunction)())
+ sizingData.growAboveMaxBreadthTrackIndexes.append(sizingData.filteredTracks.size() - 1);
Julien - ping for review 2014/09/30 17:36:57 This line seems really weird: we are checking the
svillar 2014/10/01 07:48:56 The reason is because this function and distribute
Julien - ping for review 2014/10/21 16:58:08 Now I understand the rationale for the logic but s
svillar 2014/10/22 07:16:17 Exactly that's the reason why I used the indexes,
}
if (sizingData.filteredTracks.isEmpty())
@@ -738,12 +743,10 @@ void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
additionalBreadthSpace -= (track.*trackGetter)();
}
- // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadth|.
-
// Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0. Instead we directly avoid the function
// call in those cases as it will be a noop in terms of track sizing.
if (additionalBreadthSpace > 0)
- distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.filteredTracks, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace);
+ distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.growAboveMaxBreadthTrackIndexes, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace);
}
static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTrack* track2)
@@ -759,7 +762,7 @@ static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr
return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadth - track2->m_usedBreadth);
}
-void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<GridTrack*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
+void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<size_t>* growAboveMaxBreadthTrackIndexes, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
{
ASSERT(availableLogicalSpace > 0);
std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
@@ -781,11 +784,15 @@ void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid
}
}
- if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) {
- tracksSize = tracksForGrowthAboveMaxBreadth->size();
- for (size_t i = 0; i < tracksSize; ++i) {
- LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i);
- sizingData.distributeTrackVector[i] += growthShare;
+ if (availableLogicalSpace > 0 && growAboveMaxBreadthTrackIndexes) {
+ size_t indexesSize = growAboveMaxBreadthTrackIndexes->size();
+ size_t tracksGrowingAboveMaxBreadthSize = indexesSize ? indexesSize : tracksSize;
+ // If we have a non-null empty vector of track indexes to grow above max breadth means that we should grow all
+ // affected tracks.
Julien - ping for review 2014/09/30 17:36:57 The specification uses 2 passes for growth. Is thi
svillar 2014/10/01 07:48:57 Hmm I don't get this. Which 2 passes are you talki
Julien - ping for review 2014/10/21 16:58:08 I think I was referring to this text from step 2:
svillar 2014/10/22 07:16:17 Yeah it isn't obvious after a first read but the f
+ for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) {
+ LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAboveMaxBreadthSize - i);
+ size_t distributeTrackIndex = indexesSize ? growAboveMaxBreadthTrackIndexes->at(i) : i;
+ sizingData.distributeTrackVector[distributeTrackIndex] += growthShare;
availableLogicalSpace -= growthShare;
}
}

Powered by Google App Engine
This is Rietveld 408576698