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 1ac1d2d35d3cc99dcec4971c84193397ebd0a8ea..786388161c150f34d2f6d28363e7bdce7349e9c0 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| @@ -249,12 +249,17 @@ public: |
| Vector<GridTrack*> growBeyondGrowthLimitsTracks; |
| LayoutUnit& freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; } |
| + void setTrackGapsForDirection(GridTrackSizingDirection direction, LayoutUnit gap) { direction == ForColumns ? gapsForColumns = gap : gapsForRows = gap; } |
|
cbiesinger
2016/06/22 18:46:13
Please don't use the ternary operator instead of a
jfernandez
2016/06/27 23:56:47
Acknowledged.
|
| + 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 }; |
| private: |
| LayoutUnit freeSpaceForColumns { }; |
| LayoutUnit freeSpaceForRows { }; |
| + LayoutUnit gapsForColumns { }; |
| + LayoutUnit gapsForRows { }; |
| }; |
| struct GridItemsSpanGroupRange { |
| @@ -348,14 +353,14 @@ 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; |
| } |
| void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit freeSpace) |
| { |
| - 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; |
| @@ -393,14 +398,20 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) |
| // properly resolves intrinsic sizes. We cannot do the same for heights though because many code |
| // paths inside updateLogicalHeight() require a previous call to setLogicalHeight() to resolve |
| // heights properly (like for positioned items for example). |
| - computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWidth()); |
| + LayoutUnit availableWidth = availableLogicalWidth(); |
| + sizingData.setTrackGapsForDirection(ForColumns, guttersSize(ForColumns, 2, availableWidth)); |
| + computeTrackSizesForDirection(ForColumns, sizingData, availableWidth); |
| // 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); |
|
cbiesinger
2016/06/22 18:46:13
Does this code do something reasonable with an uns
jfernandez
2016/06/27 23:56:48
This branch of code supposes height is "definite",
|
| + sizingData.setTrackGapsForDirection(ForRows, guttersSize(ForRows, 2, availableHeight)); |
| + computeTrackSizesForDirection(ForRows, sizingData, availableHeight); |
| + } |
| setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddingLogicalHeight() + scrollbarLogicalHeight()); |
| LayoutUnit oldClientAfterEdge = clientLogicalBottom(); |
| @@ -434,13 +445,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 |
| @@ -450,9 +461,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()); |
| minLogicalWidth += totalGuttersSize; |
| maxLogicalWidth += totalGuttersSize; |
| @@ -466,9 +478,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()); |
| m_minContentHeight += totalGuttersSize; |
| m_maxContentHeight += totalGuttersSize; |
| @@ -505,7 +518,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); |
| @@ -513,7 +527,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) { |
| @@ -1096,7 +1110,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)); |
| @@ -1112,7 +1127,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; |
| @@ -1126,7 +1141,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(); |
| @@ -1289,7 +1304,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; |
| @@ -1729,6 +1744,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
| } |
| } |
| + bool logicalHeightWasIndefinite = computeContentLogicalHeight(MainOrPreferredSize, style()->logicalHeight(), LayoutUnit(-1)) == LayoutUnit(-1); |
| LayoutUnit end = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); |
| if (!endIsAuto) { |
| if (isForColumns) { |
| @@ -1742,7 +1758,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() : logicalHeight()); |
|
cbiesinger
2016/06/22 18:46:13
Again, I think this needs to be contentLogicalHeig
jfernandez
2016/06/27 23:56:47
Done.
|
| end -= isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows; |
| } |
| } |
| @@ -1759,7 +1775,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() : logicalHeight()); |
| offset += isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows; |
| } |
| } |
| @@ -1781,13 +1797,14 @@ GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDi |
| LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrackSizingDirection direction, const GridSizingData& sizingData) const |
| { |
| - const Vector<GridTrack>& tracks = direction == ForColumns ? sizingData.columnTracks : sizingData.rowTracks; |
| + bool isRowAxis = direction == ForColumns; |
| + const Vector<GridTrack>& tracks = isRowAxis ? sizingData.columnTracks : sizingData.rowTracks; |
| const GridSpan& span = cachedGridSpan(child, direction); |
| LayoutUnit gridAreaBreadth; |
| for (const auto& trackPosition : span) |
| gridAreaBreadth += tracks[trackPosition].baseSize(); |
| - gridAreaBreadth += guttersSize(direction, span.integerSpan()); |
| + gridAreaBreadth += sizingData.guttersSize(direction, span.integerSpan()); |
| return gridAreaBreadth; |
| } |
| @@ -1820,7 +1837,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(); |
| @@ -2080,7 +2097,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; |
| @@ -2115,7 +2132,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; |