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; |