Chromium Code Reviews| 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; |