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 ea88af2bb3a676f3f5f48e4f8fc7b7d10fbe8d93..3cae92bd15f0e1e9e0def01f20520db397f440d7 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
@@ -348,6 +348,17 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) |
clearNeedsLayout(); |
} |
+LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t span) const |
+{ |
+ ASSERT(span >= 1); |
+ |
+ if (span == 1) |
+ return 0; |
+ |
+ const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap() : styleRef().gridRowGap(); |
+ return valueForLength(trackGap, 0) * (span - 1); |
+} |
+ |
void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const |
{ |
const_cast<LayoutGrid*>(this)->placeItemsOnGrid(); |
@@ -364,6 +375,10 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo |
maxLogicalWidth += maxTrackBreadth; |
} |
+ LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTracks.size()); |
+ minLogicalWidth += totalGuttersSize; |
+ maxLogicalWidth += totalGuttersSize; |
+ |
LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); |
minLogicalWidth += scrollbarWidth; |
maxLogicalWidth += scrollbarWidth; |
@@ -937,6 +952,8 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing |
if (sizingData.filteredTracks.isEmpty()) |
continue; |
+ spanningTracksSize += guttersSize(direction, itemSpan.integerSpan()); |
+ |
LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phase, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTracksSize; |
extraSpace = std::max<LayoutUnit>(extraSpace, 0); |
auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimitsTracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimitsTracks; |
@@ -1292,6 +1309,11 @@ void LayoutGrid::layoutGridItems() |
LayoutUnit availableSpaceForColumns = availableLogicalWidth(); |
LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorderPadding); |
+ |
+ // Remove space consumed by gutters from the available logical space. |
+ availableSpaceForColumns -= guttersSize(ForColumns, gridColumnCount()); |
+ availableSpaceForRows -= guttersSize(ForRows, gridRowCount()); |
+ |
GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColumns); |
ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks)); |
@@ -1350,10 +1372,12 @@ void LayoutGrid::layoutGridItems() |
m_gridItemsOverflowingGridArea.append(child); |
} |
+ LayoutUnit height = borderAndPaddingLogicalHeight() + scrollbarLogicalHeight(); |
for (const auto& row : sizingData.rowTracks) |
- setLogicalHeight(logicalHeight() + row.baseSize()); |
+ height += row.baseSize(); |
+ |
+ height += guttersSize(ForRows, sizingData.rowTracks.size()); |
- LayoutUnit height = logicalHeight() + borderAndPaddingLogicalHeight() + scrollbarLogicalHeight(); |
if (hasLineIfEmpty()) |
height = std::max(height, minimumLogicalHeightForEmptyLine()); |
@@ -1466,6 +1490,9 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack |
LayoutUnit gridAreaBreadth = 0; |
for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span.end(); ++trackPosition) |
gridAreaBreadth += tracks[trackPosition.toInt()].baseSize(); |
+ |
+ gridAreaBreadth += guttersSize(direction, span.integerSpan()); |
+ |
return gridAreaBreadth; |
} |
@@ -1485,7 +1512,7 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La |
void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows) |
{ |
- // Since we add alignment offsets, grid lines are not always adjacent. Hence we will have to |
+ // Since we add alignment offsets and track gutters, grid lines are not always adjacent. Hence we will have to |
// assume from now on that we just store positions of the initial grid lines of each track, |
// except the last one, which is the only one considered as a final grid line of a track. |
// FIXME: This will affect the computed style value of grid tracks size, since we are |
@@ -1496,10 +1523,11 @@ void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit av |
unsigned lastLine = numberOfLines - 1; |
unsigned nextToLastLine = numberOfLines - 2; |
ContentAlignmentData offset = computeContentPositionAndDistributionOffset(ForColumns, availableSpaceForColumns, numberOfTracks); |
+ LayoutUnit trackGap = guttersSize(ForColumns, 2); |
m_columnPositions.resize(numberOfLines); |
m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; |
for (unsigned i = 0; i < lastLine; ++i) |
- m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOffset + sizingData.columnTracks[i].baseSize(); |
+ m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOffset + sizingData.columnTracks[i].baseSize() + trackGap; |
m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData.columnTracks[nextToLastLine].baseSize(); |
numberOfTracks = sizingData.rowTracks.size(); |
@@ -1507,10 +1535,11 @@ void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit av |
lastLine = numberOfLines - 1; |
nextToLastLine = numberOfLines - 2; |
offset = computeContentPositionAndDistributionOffset(ForRows, availableSpaceForRows, numberOfTracks); |
+ trackGap = guttersSize(ForRows, 2); |
m_rowPositions.resize(numberOfLines); |
m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; |
for (unsigned i = 0; i < lastLine; ++i) |
- m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize(); |
+ m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap; |
m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTracks[nextToLastLine].baseSize(); |
} |
@@ -1806,7 +1835,12 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
return startPosition; |
case GridAxisEnd: |
case GridAxisCenter: { |
- LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()]; |
+ size_t childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt(); |
+ LayoutUnit endOfRow = m_rowPositions[childEndLine]; |
+ // m_rowPositions include gutters so we need to substract 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_rowPositions after it) |
+ if (childEndLine < m_rowPositions.size() - 1) |
+ endOfRow -= guttersSize(ForRows, 2); |
LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, child.logicalHeight() + child.marginLogicalHeight()); |
return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); |
} |
@@ -1829,7 +1863,12 @@ LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
return startPosition; |
case GridAxisEnd: |
case GridAxisCenter: { |
- LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()]; |
+ size_t childEndLine = coordinate.columns.resolvedFinalPosition.next().toInt(); |
+ LayoutUnit endOfColumn = m_columnPositions[childEndLine]; |
+ // m_columnPositions include gutters so we need to substract 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) |
+ if (childEndLine < m_columnPositions.size() - 1) |
+ endOfColumn -= guttersSize(ForRows, 2); |
LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, child.logicalWidth() + child.marginLogicalWidth()); |
return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); |
} |