Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 2323793002: [css-grid] Allow percentage values for column and row gutters (Closed)
Patch Set: Apply review comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698