| 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 e1821fe27a911889d48784bac700f6259646c333..2d3d570b05acc7bf75b628af315bf7f37b0bff82 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| @@ -400,7 +400,7 @@ LayoutUnit LayoutGrid::computeTrackBasedLogicalHeight(const GridSizingData& sizi
|
| for (const auto& row : sizingData.rowTracks)
|
| logicalHeight += row.baseSize();
|
|
|
| - logicalHeight += guttersSize(ForRows, 0, sizingData.rowTracks.size());
|
| + logicalHeight += guttersSize(ForRows, 0, sizingData.rowTracks.size(), sizingData.sizingOperation);
|
|
|
| return logicalHeight;
|
| }
|
| @@ -409,7 +409,7 @@ void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection directio
|
| {
|
| DCHECK(sizingData.isValidTransition(direction));
|
| sizingData.setAvailableSpace(availableSpace);
|
| - sizingData.freeSpace(direction) = availableSpace - guttersSize(direction, 0, direction == ForRows ? gridRowCount() : gridColumnCount());
|
| + sizingData.freeSpace(direction) = availableSpace - guttersSize(direction, 0, direction == ForRows ? gridRowCount() : gridColumnCount(), sizingData.sizingOperation);
|
| sizingData.sizingOperation = TrackSizing;
|
|
|
| LayoutUnit baseSizes, growthLimits;
|
| @@ -529,18 +529,23 @@ bool LayoutGrid::isEmptyAutoRepeatTrack(GridTrackSizingDirection direction, size
|
| return direction == ForColumns ? m_autoRepeatEmptyColumns->contains(line) : m_autoRepeatEmptyRows->contains(line);
|
| }
|
|
|
| -LayoutUnit LayoutGrid::gridGapForDirection(GridTrackSizingDirection direction) const
|
| +LayoutUnit LayoutGrid::gridGapForDirection(GridTrackSizingDirection direction, SizingOperation sizingOperation) const
|
| {
|
| - return valueForLength(direction == ForColumns ? styleRef().gridColumnGap() : styleRef().gridRowGap(), LayoutUnit());
|
| + LayoutUnit availableSize;
|
| + if (sizingOperation == TrackSizing)
|
| + availableSize = direction == ForColumns ? availableLogicalWidth() : availableLogicalHeightForPercentageComputation();
|
| +
|
| + // TODO(rego): Maybe we could cache the computed percentage as a performance improvement.
|
| + return valueForLength(direction == ForColumns ? styleRef().gridColumnGap() : styleRef().gridRowGap(), availableSize);
|
| }
|
|
|
| -LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t startLine, size_t span) const
|
| +LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t startLine, size_t span, SizingOperation sizingOperation) const
|
| {
|
| if (span <= 1)
|
| return LayoutUnit();
|
|
|
| bool isRowAxis = direction == ForColumns;
|
| - LayoutUnit gap = gridGapForDirection(direction);
|
| + LayoutUnit gap = gridGapForDirection(direction, sizingOperation);
|
|
|
| // Fast path, no collapsing tracks.
|
| if (!hasAutoRepeatEmptyTracks(direction))
|
| @@ -600,7 +605,7 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
|
| sizingData.sizingOperation = IntrinsicSizeComputation;
|
| computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
|
|
|
| - LayoutUnit totalGuttersSize = guttersSize(ForColumns, 0, sizingData.columnTracks.size());
|
| + LayoutUnit totalGuttersSize = guttersSize(ForColumns, 0, sizingData.columnTracks.size(), sizingData.sizingOperation);
|
| minLogicalWidth += totalGuttersSize;
|
| maxLogicalWidth += totalGuttersSize;
|
|
|
| @@ -617,7 +622,7 @@ void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData)
|
| sizingData.sizingOperation = IntrinsicSizeComputation;
|
| computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_maxContentHeight);
|
|
|
| - LayoutUnit totalGuttersSize = guttersSize(ForRows, 0, gridRowCount());
|
| + LayoutUnit totalGuttersSize = guttersSize(ForRows, 0, gridRowCount(), sizingData.sizingOperation);
|
| m_minContentHeight += totalGuttersSize;
|
| m_maxContentHeight += totalGuttersSize;
|
|
|
| @@ -1309,7 +1314,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
|
| if (sizingData.filteredTracks.isEmpty())
|
| continue;
|
|
|
| - spanningTracksSize += guttersSize(direction, itemSpan.startLine(), itemSpan.integerSpan());
|
| + spanningTracksSize += guttersSize(direction, itemSpan.startLine(), itemSpan.integerSpan(), sizingData.sizingOperation);
|
|
|
| LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phase, gridItemWithSpan.gridItem(), direction, sizingData) - spanningTracksSize;
|
| extraSpace = extraSpace.clampNegativeToZero();
|
| @@ -1498,7 +1503,7 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi
|
|
|
| // Add gutters as if there where only 1 auto repeat track. Gaps between auto repeat tracks will be added later when
|
| // computing the repetitions.
|
| - LayoutUnit gapSize = gridGapForDirection(direction);
|
| + LayoutUnit gapSize = gridGapForDirection(direction, sizingOperation);
|
| tracksSize += gapSize * trackSizes.size();
|
|
|
| LayoutUnit freeSpace = availableSize - tracksSize;
|
| @@ -1820,7 +1825,7 @@ Vector<LayoutUnit> LayoutGrid::trackSizesForComputedStyle(GridTrackSizingDirecti
|
| return tracks;
|
|
|
| bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction);
|
| - LayoutUnit gap = !hasCollapsedTracks ? gridGapForDirection(direction) : LayoutUnit();
|
| + LayoutUnit gap = !hasCollapsedTracks ? gridGapForDirection(direction, TrackSizing) : LayoutUnit();
|
| tracks.reserveCapacity(numPositions - 1);
|
| for (size_t i = 0; i < numPositions - 2; ++i)
|
| tracks.append(positions[i + 1] - positions[i] - offsetBetweenTracks - gap);
|
| @@ -1831,7 +1836,7 @@ Vector<LayoutUnit> LayoutGrid::trackSizesForComputedStyle(GridTrackSizingDirecti
|
|
|
| size_t remainingEmptyTracks = isRowAxis ? m_autoRepeatEmptyColumns->size() : m_autoRepeatEmptyRows->size();
|
| size_t lastLine = tracks.size();
|
| - gap = gridGapForDirection(direction);
|
| + gap = gridGapForDirection(direction, TrackSizing);
|
| for (size_t i = 1; i < lastLine; ++i) {
|
| if (isEmptyAutoRepeatTrack(direction, i - 1)) {
|
| --remainingEmptyTracks;
|
| @@ -2037,7 +2042,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
|
|
|
| // These vectors store line positions including gaps, but we shouldn't consider them for the edges of the grid.
|
| if (endLine > 0 && endLine < lastLine) {
|
| - end -= guttersSize(direction, endLine - 1, 2);
|
| + end -= guttersSize(direction, endLine - 1, 2, TrackSizing);
|
| end -= isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows;
|
| }
|
| }
|
| @@ -2054,7 +2059,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
|
| offset = translateRTLCoordinate(m_columnPositions[endLine]) - borderLogicalLeft();
|
|
|
| if (endLine > 0 && endLine < lastLine) {
|
| - offset += guttersSize(direction, endLine - 1, 2);
|
| + offset += guttersSize(direction, endLine - 1, 2, TrackSizing);
|
| offset += isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows;
|
| }
|
| }
|
| @@ -2089,7 +2094,7 @@ LayoutUnit LayoutGrid::assumedRowsSizeForOrthogonalChild(const LayoutBox& child,
|
| gridAreaSize += valueForLength(maxTrackSize.length(), containingBlockAvailableSize);
|
| }
|
|
|
| - gridAreaSize += guttersSize(ForRows, span.startLine(), span.integerSpan());
|
| + gridAreaSize += guttersSize(ForRows, span.startLine(), span.integerSpan(), sizingOperation);
|
|
|
| return gridAreaIsIndefinite ? std::max(child.maxPreferredLogicalWidth(), gridAreaSize) : gridAreaSize;
|
| }
|
| @@ -2108,7 +2113,7 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack
|
| for (const auto& trackPosition : span)
|
| gridAreaBreadth += tracks[trackPosition].baseSize();
|
|
|
| - gridAreaBreadth += guttersSize(direction, span.startLine(), span.integerSpan());
|
| + gridAreaBreadth += guttersSize(direction, span.startLine(), span.integerSpan(), sizingData.sizingOperation);
|
|
|
| return gridAreaBreadth;
|
| }
|
| @@ -2149,7 +2154,7 @@ void LayoutGrid::populateGridPositionsForDirection(GridSizingData& sizingData, G
|
| // If we have collapsed tracks we just ignore gaps here and add them later as we might not
|
| // compute the gap between two consecutive tracks without examining the surrounding ones.
|
| bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction);
|
| - LayoutUnit gap = !hasCollapsedTracks ? gridGapForDirection(direction) : LayoutUnit();
|
| + LayoutUnit gap = !hasCollapsedTracks ? gridGapForDirection(direction, sizingData.sizingOperation) : LayoutUnit();
|
| size_t nextToLastLine = numberOfLines - 2;
|
| for (size_t i = 0; i < nextToLastLine; ++i)
|
| positions[i + 1] = positions[i] + offset.distributionOffset + tracks[i].baseSize() + gap;
|
| @@ -2158,7 +2163,7 @@ void LayoutGrid::populateGridPositionsForDirection(GridSizingData& sizingData, G
|
| // Adjust collapsed gaps. Collapsed tracks cause the surrounding gutters to collapse (they
|
| // coincide exactly) except on the edges of the grid where they become 0.
|
| if (hasCollapsedTracks) {
|
| - gap = gridGapForDirection(direction);
|
| + gap = gridGapForDirection(direction, sizingData.sizingOperation);
|
| size_t remainingEmptyTracks = isRowAxis ? m_autoRepeatEmptyColumns->size() : m_autoRepeatEmptyRows->size();
|
| LayoutUnit gapAccumulator;
|
| for (size_t i = 1; i < lastLine; ++i) {
|
| @@ -2480,7 +2485,7 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child, GridSizi
|
| // m_rowPositions include distribution offset (because of content alignment) and gutters
|
| // so we need to subtract them to get the actual end position for a given row
|
| // (this does not have to be done for the last track as there are no more m_columnPositions after it).
|
| - LayoutUnit trackGap = gridGapForDirection(ForRows);
|
| + LayoutUnit trackGap = gridGapForDirection(ForRows, sizingData.sizingOperation);
|
| if (childEndLine < m_rowPositions.size() - 1) {
|
| endOfRow -= trackGap;
|
| endOfRow -= m_offsetBetweenRows;
|
| @@ -2515,7 +2520,7 @@ LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child, GridSizingD
|
| // m_columnPositions include distribution offset (because of content alignment) and gutters
|
| // so we need to subtract them to get the actual end position for a given column
|
| // (this does not have to be done for the last track as there are no more m_columnPositions after it).
|
| - LayoutUnit trackGap = gridGapForDirection(ForColumns);
|
| + LayoutUnit trackGap = gridGapForDirection(ForColumns, sizingData.sizingOperation);
|
| if (childEndLine < m_columnPositions.size() - 1) {
|
| endOfColumn -= trackGap;
|
| endOfColumn -= m_offsetBetweenColumns;
|
|
|