| Index: Source/core/layout/LayoutGrid.cpp
|
| diff --git a/Source/core/layout/LayoutGrid.cpp b/Source/core/layout/LayoutGrid.cpp
|
| index 8138448479b41f703647d28533068f7a7e3a3f61..19cb9d919c83c0b36cc0d4f0e5e2e5e89697e25a 100644
|
| --- a/Source/core/layout/LayoutGrid.cpp
|
| +++ b/Source/core/layout/LayoutGrid.cpp
|
| @@ -139,6 +139,11 @@ struct GridTrackForNormalization {
|
| LayoutUnit m_normalizedFlexValue;
|
| };
|
|
|
| +enum TrackSizeRestriction {
|
| + AllowInfinity,
|
| + ForbidInfinity,
|
| +};
|
| +
|
| class LayoutGrid::GridIterator {
|
| WTF_MAKE_NONCOPYABLE(GridIterator);
|
| public:
|
| @@ -462,7 +467,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
|
| }
|
| }
|
|
|
| - distributeSpaceToTracks(tracksForDistribution, needToStretch ? &tracksToStretch : nullptr, &GridTrack::baseSize, sizingData, freeSpace);
|
| + distributeSpaceToTracks<MaximizeTracks>(tracksForDistribution, needToStretch ? &tracksToStretch : nullptr, sizingData, freeSpace);
|
|
|
| for (auto* track : tracksForDistribution)
|
| track->growBaseSize(track->m_plannedIncrease);
|
| @@ -762,10 +767,10 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
|
| auto end = sizingData.itemsSortedByIncreasingSpan.end();
|
| while (it != end) {
|
| GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) };
|
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &LayoutGrid::minContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
|
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &GridTrackSize::hasMaxContentMinTrackBreadth, &LayoutGrid::maxContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
|
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &LayoutGrid::minContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit);
|
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, spanGroupRange, &GridTrackSize::hasMaxContentMaxTrackBreadth, &LayoutGrid::maxContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit);
|
| + resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMinimums>(direction, sizingData, spanGroupRange);
|
| + resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMinimums>(direction, sizingData, spanGroupRange);
|
| + resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMaximums>(direction, sizingData, spanGroupRange);
|
| + resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMaximums>(direction, sizingData, spanGroupRange);
|
| it = spanGroupRange.rangeEnd;
|
| }
|
|
|
| @@ -792,7 +797,102 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid
|
| track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gridItem, direction, columnTracks)));
|
| }
|
|
|
| -void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, const GridItemsSpanGroupRange& gridItemsWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction growAboveMaxBreadthFilterFunction)
|
| +static const LayoutUnit& trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, const GridTrack& track, TrackSizeRestriction restriction)
|
| +{
|
| + switch (phase) {
|
| + case ResolveIntrinsicMinimums:
|
| + case ResolveMaxContentMinimums:
|
| + case MaximizeTracks:
|
| + return track.baseSize();
|
| + break;
|
| + case ResolveIntrinsicMaximums:
|
| + case ResolveMaxContentMaximums:
|
| + return restriction == AllowInfinity ? track.growthLimit() : track.growthLimitIfNotInfinite();
|
| + break;
|
| + }
|
| +
|
| + ASSERT_NOT_REACHED();
|
| + return track.baseSize();
|
| +}
|
| +
|
| +static bool shouldProcessTrackForTrackSizeComputationPhase(TrackSizeComputationPhase phase, const GridTrackSize& trackSize)
|
| +{
|
| + switch (phase) {
|
| + case ResolveIntrinsicMinimums:
|
| + return trackSize.hasMinOrMaxContentMinTrackBreadth();
|
| + case ResolveMaxContentMinimums:
|
| + return trackSize.hasMaxContentMinTrackBreadth();
|
| + case ResolveIntrinsicMaximums:
|
| + return trackSize.hasMinOrMaxContentMaxTrackBreadth();
|
| + case ResolveMaxContentMaximums:
|
| + return trackSize.hasMaxContentMaxTrackBreadth();
|
| + case MaximizeTracks:
|
| + ASSERT_NOT_REACHED();
|
| + return false;
|
| + }
|
| +
|
| + ASSERT_NOT_REACHED();
|
| + return false;
|
| +}
|
| +
|
| +static bool trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(TrackSizeComputationPhase phase, const GridTrackSize& trackSize)
|
| +{
|
| + switch (phase) {
|
| + case ResolveIntrinsicMinimums:
|
| + return trackSize.hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth();
|
| + case ResolveMaxContentMinimums:
|
| + return trackSize.hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth();
|
| + case ResolveIntrinsicMaximums:
|
| + case ResolveMaxContentMaximums:
|
| + return true;
|
| + case MaximizeTracks:
|
| + ASSERT_NOT_REACHED();
|
| + return false;
|
| + }
|
| +
|
| + ASSERT_NOT_REACHED();
|
| + return false;
|
| +}
|
| +
|
| +static void updateTrackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, GridTrack& track)
|
| +{
|
| + switch (phase) {
|
| + case ResolveIntrinsicMinimums:
|
| + case ResolveMaxContentMinimums:
|
| + track.growBaseSize(track.m_plannedIncrease);
|
| + return;
|
| + case ResolveIntrinsicMaximums:
|
| + case ResolveMaxContentMaximums:
|
| + track.growGrowthLimit(track.m_plannedIncrease);
|
| + return;
|
| + case MaximizeTracks:
|
| + ASSERT_NOT_REACHED();
|
| + return;
|
| + }
|
| +
|
| + ASSERT_NOT_REACHED();
|
| +}
|
| +
|
| +LayoutUnit LayoutGrid::currentItemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, LayoutBox& gridItem, GridTrackSizingDirection direction, Vector<GridTrack>& columnTracks)
|
| +{
|
| + switch (phase) {
|
| + case ResolveIntrinsicMinimums:
|
| + case ResolveIntrinsicMaximums:
|
| + return minContentForChild(gridItem, direction, columnTracks);
|
| + case ResolveMaxContentMinimums:
|
| + case ResolveMaxContentMaximums:
|
| + return maxContentForChild(gridItem, direction, columnTracks);
|
| + case MaximizeTracks:
|
| + ASSERT_NOT_REACHED();
|
| + return 0;
|
| + }
|
| +
|
| + ASSERT_NOT_REACHED();
|
| + return 0;
|
| +}
|
| +
|
| +template <TrackSizeComputationPhase phase>
|
| +void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, const GridItemsSpanGroupRange& gridItemsWithSpan)
|
| {
|
| Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
|
| for (const auto& trackIndex : sizingData.contentSizedTracksIndex)
|
| @@ -810,13 +910,13 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
|
| for (const auto& trackPosition : itemSpan) {
|
| GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt());
|
| GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()];
|
| - spanningTracksSize += (track.*trackGetter)();
|
| - if (!(trackSize.*filterFunction)())
|
| + spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity);
|
| + if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize))
|
| continue;
|
|
|
| sizingData.filteredTracks.append(&track);
|
|
|
| - if (!growAboveMaxBreadthFilterFunction || (trackSize.*growAboveMaxBreadthFilterFunction)())
|
| + if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(phase, trackSize))
|
| sizingData.growBeyondGrowthLimitsTracks.append(&track);
|
| }
|
|
|
| @@ -825,17 +925,17 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
|
|
|
| // Specs mandate to floor extraSpace to 0. Instead we directly avoid the function call in those cases as it will be
|
| // a noop in terms of track sizing.
|
| - LayoutUnit extraSpace = (this->*sizingFunction)(gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTracksSize;
|
| + LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phase, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTracksSize;
|
| if (extraSpace > 0) {
|
| Vector<GridTrack*>* tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimitsTracks.isEmpty() ? &sizingData.filteredTracks : &sizingData.growBeyondGrowthLimitsTracks;
|
| - distributeSpaceToTracks(sizingData.filteredTracks, tracksToGrowBeyondGrowthLimits, trackGetter, sizingData, extraSpace);
|
| + distributeSpaceToTracks<phase>(sizingData.filteredTracks, tracksToGrowBeyondGrowthLimits, sizingData, extraSpace);
|
| }
|
| }
|
|
|
| for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
|
| GridTrack& track = tracks[trackIndex];
|
| if (track.m_plannedIncrease)
|
| - (track.*trackGrowthFunction)(track.m_plannedIncrease);
|
| + updateTrackSizeForTrackSizeComputationPhase(phase, track);
|
| }
|
| }
|
|
|
| @@ -852,7 +952,8 @@ static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr
|
| return (track1->growthLimit() - track1->baseSize()) < (track2->growthLimit() - track2->baseSize());
|
| }
|
|
|
| -void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vector<GridTrack*>* growBeyondGrowthLimitsTracks, AccumulatorGetter trackGetter, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
|
| +template <TrackSizeComputationPhase phase>
|
| +void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vector<GridTrack*>* growBeyondGrowthLimitsTracks, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
|
| {
|
| ASSERT(availableLogicalSpace > 0);
|
| std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
|
| @@ -861,7 +962,7 @@ void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vecto
|
| for (size_t i = 0; i < tracksSize; ++i) {
|
| GridTrack& track = *tracks[i];
|
| LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksSize - i);
|
| - const LayoutUnit& trackBreadth = (track.*trackGetter)();
|
| + const LayoutUnit& trackBreadth = trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity);
|
| LayoutUnit growthShare = track.growthLimitIsInfinite() ? availableLogicalSpaceShare : std::min(availableLogicalSpaceShare, track.growthLimit() - trackBreadth);
|
| ASSERT_WITH_MESSAGE(growthShare >= 0, "We must never shrink any grid track or else we can't guarantee we abide by our min-sizing function.");
|
| track.m_increaseDuringDistribution = growthShare;
|
|
|