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

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

Issue 2057113002: [css-grid] Allow percentage values for column and row gutters (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Grid gaps don't support unitless quirk. Created 4 years, 6 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
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 6d8864e4a0d6d97a786ebe9bb66b5cfebf6bd4b9..fcc7b1ee9ad30d1df1942d68c2b6c6631661a555 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -251,6 +251,15 @@ public:
Vector<GridTrack*> growBeyondGrowthLimitsTracks;
LayoutUnit& freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
+ void setTrackGapsForDirection(GridTrackSizingDirection direction, LayoutUnit gap)
+ {
+ if (direction == ForColumns)
+ gapsForColumns = gap;
+ else
+ gapsForRows = gap;
+ }
+ LayoutUnit trackGapsForDirection(GridTrackSizingDirection direction) const { return direction == ForColumns ? gapsForColumns : gapsForRows; }
+ LayoutUnit guttersSize(GridTrackSizingDirection direction, size_t span) const { return span <= 1 ? LayoutUnit() : trackGapsForDirection(direction) * (span - 1); }
SizingOperation sizingOperation { TrackSizing };
enum SizingState { ColumnSizingFirstIteration, RowSizingFirstIteration, ColumnSizingSecondIteration, RowSizingSecondIteration};
@@ -294,6 +303,8 @@ public:
private:
LayoutUnit freeSpaceForColumns { };
LayoutUnit freeSpaceForRows { };
+ LayoutUnit gapsForColumns { };
+ LayoutUnit gapsForRows { };
};
struct GridItemsSpanGroupRange {
@@ -387,7 +398,7 @@ LayoutUnit LayoutGrid::computeTrackBasedLogicalHeight(const GridSizingData& sizi
for (const auto& row : sizingData.rowTracks)
logicalHeight += row.baseSize();
- logicalHeight += guttersSize(ForRows, sizingData.rowTracks.size());
+ logicalHeight += sizingData.guttersSize(ForRows, sizingData.rowTracks.size());
return logicalHeight;
}
@@ -395,7 +406,7 @@ LayoutUnit LayoutGrid::computeTrackBasedLogicalHeight(const GridSizingData& sizi
void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit freeSpace)
{
DCHECK(sizingData.isValidTransitionForDirection(direction));
- sizingData.freeSpaceForDirection(direction) = freeSpace - guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
+ sizingData.freeSpaceForDirection(direction) = freeSpace - sizingData.guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
sizingData.sizingOperation = TrackSizing;
LayoutUnit baseSizes, growthLimits;
@@ -453,14 +464,19 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
// paths inside updateLogicalHeight() require a previous call to setLogicalHeight() to resolve
// heights properly (like for positioned items for example).
LayoutUnit availableSpaceForColumns = availableLogicalWidth();
+ sizingData.setTrackGapsForDirection(ForColumns, guttersSize(ForColumns, 2, availableSpaceForColumns));
computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForColumns);
// 2- Next, the track sizing algorithm resolves the sizes of the grid rows, using the
// grid column sizes calculated in the previous step.
- if (logicalHeightWasIndefinite)
+ if (logicalHeightWasIndefinite) {
+ sizingData.setTrackGapsForDirection(ForRows, guttersSize(ForRows, 2, LayoutUnit()));
computeIntrinsicLogicalHeight(sizingData);
- else
- computeTrackSizesForDirection(ForRows, sizingData, availableLogicalHeight(ExcludeMarginBorderPadding));
+ } else {
+ LayoutUnit availableHeight = availableLogicalHeight(ExcludeMarginBorderPadding);
+ sizingData.setTrackGapsForDirection(ForRows, guttersSize(ForRows, 2, availableHeight));
+ computeTrackSizesForDirection(ForRows, sizingData, availableHeight);
+ }
setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddingLogicalHeight() + scrollbarLogicalHeight());
LayoutUnit oldClientAfterEdge = clientLogicalBottom();
@@ -500,13 +516,13 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
clearNeedsLayout();
}
-LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t span) const
+LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t span, LayoutUnit availableSize) const
{
if (span <= 1)
return LayoutUnit();
const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap() : styleRef().gridRowGap();
- return valueForLength(trackGap, LayoutUnit()) * (span - 1);
+ return valueForLength(trackGap, availableSize) * (span - 1);
}
void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
@@ -516,9 +532,10 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
GridSizingData sizingData(gridColumnCount(), gridRowCount());
sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit();
sizingData.sizingOperation = IntrinsicSizeComputation;
+ sizingData.setTrackGapsForDirection(ForColumns, guttersSize(ForColumns, 2, LayoutUnit()));
const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
- LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTracks.size());
+ LayoutUnit totalGuttersSize = sizingData.guttersSize(ForColumns, sizingData.columnTracks.size());
Manuel Rego 2016/07/01 06:45:57 I think you've just calculated the gap size a few
minLogicalWidth += totalGuttersSize;
maxLogicalWidth += totalGuttersSize;
@@ -532,9 +549,10 @@ void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData)
ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
sizingData.freeSpaceForDirection(ForRows) = LayoutUnit();
sizingData.sizingOperation = IntrinsicSizeComputation;
+ sizingData.setTrackGapsForDirection(ForRows, guttersSize(ForRows, 2, LayoutUnit()));
computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_maxContentHeight);
- LayoutUnit totalGuttersSize = guttersSize(ForRows, gridRowCount());
+ LayoutUnit totalGuttersSize = sizingData.guttersSize(ForRows, gridRowCount());
Manuel Rego 2016/07/01 06:45:57 Ditto.
m_minContentHeight += totalGuttersSize;
m_maxContentHeight += totalGuttersSize;
@@ -571,7 +589,8 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
{
LayoutUnit& freeSpace = sizingData.freeSpaceForDirection(direction);
const LayoutUnit initialFreeSpace = freeSpace;
- Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
+ bool isRowAxis = direction == ForColumns;
+ Vector<GridTrack>& tracks = isRowAxis ? sizingData.columnTracks : sizingData.rowTracks;
Vector<size_t> flexibleSizedTracksIndex;
sizingData.contentSizedTracksIndex.shrink(0);
@@ -579,7 +598,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
// 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 == TrackSizing;
if (hasDefiniteFreeSpace)
- maxSize += guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
+ maxSize += sizingData.guttersSize(direction, isRowAxis ? gridColumnCount() : gridRowCount());
// 1. Initialize per Grid track variables.
for (size_t i = 0; i < tracks.size(); ++i) {
@@ -1173,7 +1192,8 @@ LayoutUnit LayoutGrid::currentItemSizeForTrackSizeComputationPhase(TrackSizeComp
template <TrackSizeComputationPhase phase>
void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, const GridItemsSpanGroupRange& gridItemsWithSpan)
{
- Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
+ bool isRowAxis = direction == ForColumns;
+ Vector<GridTrack>& tracks = isRowAxis ? sizingData.columnTracks : sizingData.rowTracks;
for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
GridTrack& track = tracks[trackIndex];
track.setPlannedSize(trackSizeForTrackSizeComputationPhase(phase, track, AllowInfinity));
@@ -1189,7 +1209,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
LayoutUnit spanningTracksSize;
for (const auto& trackPosition : itemSpan) {
GridTrackSize trackSize = gridTrackSize(direction, trackPosition);
- GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition] : sizingData.rowTracks[trackPosition];
+ GridTrack& track = isRowAxis ? sizingData.columnTracks[trackPosition] : sizingData.rowTracks[trackPosition];
spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity);
if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize))
continue;
@@ -1203,7 +1223,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
if (sizingData.filteredTracks.isEmpty())
continue;
- spanningTracksSize += guttersSize(direction, itemSpan.integerSpan());
+ spanningTracksSize += sizingData.guttersSize(direction, itemSpan.integerSpan());
LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phase, gridItemWithSpan.gridItem(), direction, sizingData) - spanningTracksSize;
extraSpace = extraSpace.clampNegativeToZero();
@@ -1366,7 +1386,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 = guttersSize(direction, 2);
+ LayoutUnit gapSize = guttersSize(direction, 2, availableSize);
tracksSize += gapSize * trackSizes.size();
LayoutUnit freeSpace = availableSize - tracksSize;
@@ -1809,6 +1829,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
}
}
+ bool logicalHeightWasIndefinite = computeContentLogicalHeight(MainOrPreferredSize, style()->logicalHeight(), LayoutUnit(-1)) == LayoutUnit(-1);
Manuel Rego 2016/07/01 06:45:57 We know this check is wrong, but it's part of bug
LayoutUnit end = isForColumns ? clientLogicalWidth() : clientLogicalHeight();
if (!endIsAuto) {
if (isForColumns) {
@@ -1822,7 +1843,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, 2);
+ end -= guttersSize(direction, 2, isForColumns ? logicalWidth() : logicalHeightWasIndefinite ? LayoutUnit() : contentLogicalHeight());
Manuel Rego 2016/07/01 06:45:57 This is weird, you're using here logicalWidth() an
end -= isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows;
}
}
@@ -1839,7 +1860,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
offset = translateRTLCoordinate(m_columnPositions[endLine]) - borderLogicalLeft();
if (endLine > 0 && endLine < lastLine) {
- offset += guttersSize(direction, 2);
+ offset += guttersSize(direction, 2, isForColumns ? logicalWidth() : logicalHeightWasIndefinite ? LayoutUnit() : contentLogicalHeight());
Manuel Rego 2016/07/01 06:45:57 Ditto.
offset += isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows;
}
}
@@ -1874,7 +1895,7 @@ LayoutUnit LayoutGrid::assumedRowsSizeForOrthogonalChild(const LayoutBox& child,
gridAreaSize += valueForLength(maxTrackSize.length(), containingBlockAvailableSize);
}
- gridAreaSize += guttersSize(ForRows, span.integerSpan());
+ gridAreaSize += guttersSize(ForRows, span.integerSpan(), LayoutUnit());
Manuel Rego 2016/07/01 06:45:57 I'm not sure if this call is right, if the sizingO
return gridAreaIsIndefinite ? std::max(child.maxPreferredLogicalWidth(), gridAreaSize) : gridAreaSize;
}
@@ -1893,7 +1914,7 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack
for (const auto& trackPosition : span)
gridAreaBreadth += tracks[trackPosition].baseSize();
- gridAreaBreadth += guttersSize(direction, span.integerSpan());
+ gridAreaBreadth += sizingData.guttersSize(direction, span.integerSpan());
return gridAreaBreadth;
}
@@ -1926,7 +1947,7 @@ void LayoutGrid::populateGridPositionsForDirection(GridSizingData& sizingData, G
size_t numberOfLines = numberOfTracks + 1;
size_t lastLine = numberOfLines - 1;
ContentAlignmentData offset = computeContentPositionAndDistributionOffset(direction, sizingData.freeSpaceForDirection(direction), numberOfTracks);
- LayoutUnit trackGap = guttersSize(direction, 2);
+ LayoutUnit trackGap = sizingData.trackGapsForDirection(direction);
auto& positions = isRowAxis ? m_columnPositions : m_rowPositions;
positions.resize(numberOfLines);
auto borderAndPadding = isRowAxis ? borderAndPaddingLogicalLeft() : borderAndPaddingBefore();
@@ -2186,7 +2207,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 = guttersSize(ForRows, 2);
+ LayoutUnit trackGap = sizingData.trackGapsForDirection(ForRows);
if (childEndLine < m_rowPositions.size() - 1) {
endOfRow -= trackGap;
endOfRow -= m_offsetBetweenRows;
@@ -2221,7 +2242,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 = guttersSize(ForColumns, 2);
+ LayoutUnit trackGap = sizingData.trackGapsForDirection(ForColumns);
if (childEndLine < m_columnPositions.size() - 1) {
endOfColumn -= trackGap;
endOfColumn -= m_offsetBetweenColumns;

Powered by Google App Engine
This is Rietveld 408576698