| Index: Source/core/rendering/RenderGrid.cpp
|
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
|
| index 8ad2d787df8d70497a998b80100fb615d471e3d6..0c343bf05560ca4605969c74b5ea390c9957caed 100644
|
| --- a/Source/core/rendering/RenderGrid.cpp
|
| +++ b/Source/core/rendering/RenderGrid.cpp
|
| @@ -188,6 +188,7 @@ public:
|
| Vector<LayoutUnit> distributeTrackVector;
|
| Vector<GridTrack*> filteredTracks;
|
| WillBeHeapVector<GridItemWithSpan> itemsSortedByIncreasingSpan;
|
| + Vector<size_t> growAboveMaxBreadthTrackIndexes;
|
| };
|
|
|
| RenderGrid::RenderGrid(Element* element)
|
| @@ -735,8 +736,8 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
|
| Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingSpan.end();
|
| for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreasingSpan.begin(); it != end; ++it) {
|
| GridItemWithSpan itemWithSpan = *it;
|
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
|
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
|
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
|
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
|
| resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
|
| resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
|
| }
|
| @@ -749,12 +750,13 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
|
| }
|
| }
|
|
|
| -void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction)
|
| +void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction growAboveMaxBreadthFilterFunction)
|
| {
|
| const GridCoordinate coordinate = gridItemWithSpan.coordinate();
|
| 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) {
|
| GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt());
|
| @@ -763,6 +765,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);
|
| }
|
|
|
| if (sizingData.filteredTracks.isEmpty())
|
| @@ -774,12 +779,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)
|
| @@ -795,7 +798,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);
|
| @@ -816,11 +819,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.
|
| + 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;
|
| }
|
| }
|
|
|