| Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| index b6c769edce8e32388342fbea034b8292f508e30c..7bf340f7cfcc26b830b9dddb86589a4ab5cefcb3 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| @@ -250,7 +250,6 @@ public:
|
|
|
| LayoutUnit& freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
|
|
|
| - enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
|
| SizingOperation sizingOperation { TrackSizing };
|
|
|
| private:
|
| @@ -357,7 +356,7 @@ LayoutUnit LayoutGrid::computeTrackBasedLogicalHeight(const GridSizingData& sizi
|
| void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit freeSpace)
|
| {
|
| sizingData.freeSpaceForDirection(direction) = freeSpace - guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
|
| - sizingData.sizingOperation = GridSizingData::TrackSizing;
|
| + sizingData.sizingOperation = TrackSizing;
|
|
|
| LayoutUnit baseSizes, growthLimits;
|
| computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimits);
|
| @@ -450,7 +449,7 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
|
|
|
| GridSizingData sizingData(gridColumnCount(), gridRowCount());
|
| sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit();
|
| - sizingData.sizingOperation = GridSizingData::IntrinsicSizeComputation;
|
| + sizingData.sizingOperation = IntrinsicSizeComputation;
|
| const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
|
|
|
| LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTracks.size());
|
| @@ -466,7 +465,7 @@ void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData)
|
| {
|
| ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
|
| sizingData.freeSpaceForDirection(ForRows) = LayoutUnit();
|
| - sizingData.sizingOperation = GridSizingData::IntrinsicSizeComputation;
|
| + sizingData.sizingOperation = IntrinsicSizeComputation;
|
| computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_maxContentHeight);
|
|
|
| LayoutUnit totalGuttersSize = guttersSize(ForRows, gridRowCount());
|
| @@ -512,14 +511,14 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
|
|
|
| LayoutUnit maxSize = std::max(LayoutUnit(), initialFreeSpace);
|
| // Grid gutters were removed from freeSpace by the caller, but we must use them to compute relative (i.e. percentages) sizes.
|
| - bool hasDefiniteFreeSpace = sizingData.sizingOperation == GridSizingData::TrackSizing;
|
| + bool hasDefiniteFreeSpace = sizingData.sizingOperation == TrackSizing;
|
| if (hasDefiniteFreeSpace)
|
| maxSize += guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
|
|
|
| // 1. Initialize per Grid track variables.
|
| for (size_t i = 0; i < tracks.size(); ++i) {
|
| GridTrack& track = tracks[i];
|
| - GridTrackSize trackSize = gridTrackSize(direction, i);
|
| + GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
|
| const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
|
| const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth();
|
|
|
| @@ -686,11 +685,6 @@ double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
|
| return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverSpace, flexibleTracksIndexes);
|
| }
|
|
|
| -bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) const
|
| -{
|
| - return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogicalWidth();
|
| -}
|
| -
|
| static bool hasOverrideContainingBlockContentSizeForChild(const LayoutBox& child, GridTrackSizingDirection direction)
|
| {
|
| return direction == ForColumns ? child.hasOverrideContainingBlockLogicalWidth() : child.overrideContainingBlockContentLogicalHeight();
|
| @@ -747,21 +741,20 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(GridTrackSizingDirection direc
|
| return trackStyles[untranslatedIndex - repetitions];
|
| }
|
|
|
| -GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex) const
|
| +GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex, SizingOperation sizingOperation) const
|
| {
|
| const GridTrackSize& trackSize = rawGridTrackSize(direction, translatedIndex);
|
|
|
| GridLength minTrackBreadth = trackSize.minTrackBreadth();
|
| GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
|
|
|
| - // If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>
|
| - if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) {
|
| - if (!hasDefiniteLogicalSize(direction)) {
|
| - if (minTrackBreadth.hasPercentage())
|
| - minTrackBreadth = Length(Auto);
|
| - if (maxTrackBreadth.hasPercentage())
|
| - maxTrackBreadth = Length(Auto);
|
| - }
|
| + // If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>.
|
| + // For the inline axis this only happens when we're computing the intrinsic sizes (AvailableSpaceIndefinite).
|
| + if (sizingOperation == IntrinsicSizeComputation || (direction == ForRows && !hasDefiniteLogicalHeight())) {
|
| + if (minTrackBreadth.hasPercentage())
|
| + minTrackBreadth = Length(Auto);
|
| + if (maxTrackBreadth.hasPercentage())
|
| + maxTrackBreadth = Length(Auto);
|
| }
|
|
|
| // Flex sizes are invalid as a min sizing function. However we still can have a flexible |minTrackBreadth|
|
| @@ -815,7 +808,7 @@ LayoutUnit LayoutGrid::minSizeForChild(LayoutBox& child, GridTrackSizingDirectio
|
|
|
| bool overrideSizeHasChanged = updateOverrideContainingBlockContentSizeForChild(child, childInlineDirection, sizingData);
|
| if (isRowAxis) {
|
| - LayoutUnit marginLogicalWidth = sizingData.sizingOperation == GridSizingData::TrackSizing ? computeMarginLogicalSizeForChild(InlineDirection, child) : marginIntrinsicLogicalWidthForChild(child);
|
| + LayoutUnit marginLogicalWidth = sizingData.sizingOperation == TrackSizing ? computeMarginLogicalSizeForChild(InlineDirection, child) : marginIntrinsicLogicalWidthForChild(child);
|
| return child.computeLogicalWidthUsing(MinSize, childMinSize, overrideContainingBlockContentSizeForChild(child, childInlineDirection), this) + marginLogicalWidth;
|
| }
|
|
|
| @@ -902,10 +895,10 @@ private:
|
| GridSpan m_gridSpan;
|
| };
|
|
|
| -bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction) const
|
| +bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction, SizingOperation sizingOperation) const
|
| {
|
| for (const auto& trackPosition : span) {
|
| - const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition);
|
| + const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition, sizingOperation);
|
| if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex())
|
| return true;
|
| }
|
| @@ -926,7 +919,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
|
| const GridSpan& span = cachedGridSpan(*gridItem, direction);
|
| if (span.integerSpan() == 1) {
|
| resolveContentBasedTrackSizingFunctionsForNonSpanningItems(direction, span, *gridItem, track, sizingData);
|
| - } else if (!spanningItemCrossesFlexibleSizedTracks(span, direction)) {
|
| + } else if (!spanningItemCrossesFlexibleSizedTracks(span, direction, sizingData.sizingOperation)) {
|
| sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
|
| }
|
| }
|
| @@ -957,7 +950,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
|
| void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridTrack& track, GridSizingData& sizingData)
|
| {
|
| const size_t trackPosition = span.startLine();
|
| - GridTrackSize trackSize = gridTrackSize(direction, trackPosition);
|
| + GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData.sizingOperation);
|
|
|
| if (trackSize.hasMinContentMinTrackBreadth())
|
| track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem, direction, sizingData)));
|
| @@ -1201,7 +1194,7 @@ bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire
|
| const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
|
| LayoutUnit& maxSize = sizingData.freeSpaceForDirection(direction);
|
| for (size_t i = 0; i < tracks.size(); ++i) {
|
| - GridTrackSize trackSize = gridTrackSize(direction, i);
|
| + GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
|
| const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
|
| if (computeUsedBreadthOfMinLength(minTrackBreadth, maxSize) > tracks[i].baseSize())
|
| return false;
|
|
|