| Index: Source/core/rendering/RenderGrid.cpp
|
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
|
| index 8ad2d787df8d70497a998b80100fb615d471e3d6..30130b977b7b6cf8fb96c6c7fbd5c9d5139bcff7 100644
|
| --- a/Source/core/rendering/RenderGrid.cpp
|
| +++ b/Source/core/rendering/RenderGrid.cpp
|
| @@ -1166,12 +1166,27 @@ void RenderGrid::populateGridPositions(const GridSizingData& sizingData)
|
| m_rowPositions[i + 1] = m_rowPositions[i] + sizingData.rowTracks[i].m_usedBreadth;
|
| }
|
|
|
| +static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, LayoutUnit startOfTrack, LayoutUnit endOfTrack, LayoutUnit childBreadth)
|
| +{
|
| + LayoutUnit trackBreadth = endOfTrack - startOfTrack;
|
| + LayoutUnit offset = trackBreadth - childBreadth;
|
| +
|
| + // If overflow is 'safe', we have to make sure we don't overflow the 'start'
|
| + // edge (potentially cause some data loss as the overflow is unreachable).
|
| + if (overflow == OverflowAlignmentSafe)
|
| + offset = std::max<LayoutUnit>(0, offset);
|
| +
|
| + // If we overflow our alignment container and overflow is 'true' (default), we
|
| + // ignore the overflow and just return the value regardless (which may cause data
|
| + // loss as we overflow the 'start' edge).
|
| + return offset;
|
| +}
|
| +
|
| LayoutUnit RenderGrid::startOfColumnForChild(const RenderBox& child) const
|
| {
|
| const GridCoordinate& coordinate = cachedGridCoordinate(child);
|
| LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()];
|
| // The grid items should be inside the grid container's border box, that's why they need to be shifted.
|
| - // FIXME: This should account for the grid item's <overflow-position>.
|
| return startOfColumn + marginStartForChild(&child);
|
| }
|
|
|
| @@ -1183,8 +1198,9 @@ LayoutUnit RenderGrid::endOfColumnForChild(const RenderBox& child) const
|
| LayoutUnit columnPosition = startOfColumn + marginStartForChild(&child);
|
|
|
| LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()];
|
| - // FIXME: This should account for the grid item's <overflow-position>.
|
| - return columnPosition + std::max<LayoutUnit>(0, endOfColumn - m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()] - child.logicalWidth());
|
| + LayoutUnit offsetFromColumnPosition = computeOverflowAlignmentOffset(child.style()->justifySelfOverflowAlignment(), startOfColumn, endOfColumn, child.logicalWidth());
|
| +
|
| + return columnPosition + offsetFromColumnPosition;
|
| }
|
|
|
| LayoutUnit RenderGrid::columnPositionAlignedWithGridContainerStart(const RenderBox& child) const
|
| @@ -1209,8 +1225,9 @@ LayoutUnit RenderGrid::centeredColumnPositionForChild(const RenderBox& child) co
|
| LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()];
|
| LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()];
|
| LayoutUnit columnPosition = startOfColumn + marginStartForChild(&child);
|
| - // FIXME: This should account for the grid item's <overflow-position>.
|
| - return columnPosition + std::max<LayoutUnit>(0, endOfColumn - startOfColumn - child.logicalWidth()) / 2;
|
| + LayoutUnit offsetFromColumnPosition = computeOverflowAlignmentOffset(child.style()->justifySelfOverflowAlignment(), startOfColumn, endOfColumn, child.logicalWidth());
|
| +
|
| + return columnPosition + offsetFromColumnPosition / 2;
|
| }
|
|
|
| static ItemPosition resolveJustification(const RenderStyle* parentStyle, const RenderStyle* childStyle)
|
| @@ -1218,7 +1235,6 @@ static ItemPosition resolveJustification(const RenderStyle* parentStyle, const R
|
| ItemPosition justify = childStyle->justifySelf();
|
| if (justify == ItemPositionAuto)
|
| justify = (parentStyle->justifyItems() == ItemPositionAuto) ? ItemPositionStretch : parentStyle->justifyItems();
|
| -
|
| return justify;
|
| }
|
|
|
| @@ -1305,8 +1321,9 @@ LayoutUnit RenderGrid::endOfRowForChild(const RenderBox& child) const
|
| LayoutUnit rowPosition = startOfRow + marginBeforeForChild(&child);
|
|
|
| LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()];
|
| - // FIXME: This should account for the grid item's <overflow-position>.
|
| - return rowPosition + std::max<LayoutUnit>(0, endOfRow - startOfRow - child.logicalHeight());
|
| + LayoutUnit offsetFromRowPosition = computeOverflowAlignmentOffset(child.style()->alignSelfOverflowAlignment(), startOfRow, endOfRow, child.logicalHeight());
|
| +
|
| + return rowPosition + offsetFromRowPosition;
|
| }
|
|
|
| LayoutUnit RenderGrid::startOfRowForChild(const RenderBox& child) const
|
| @@ -1315,7 +1332,6 @@ LayoutUnit RenderGrid::startOfRowForChild(const RenderBox& child) const
|
|
|
| LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()];
|
| // The grid items should be inside the grid container's border box, that's why they need to be shifted.
|
| - // FIXME: This should account for the grid item's <overflow-position>.
|
| LayoutUnit rowPosition = startOfRow + marginBeforeForChild(&child);
|
|
|
| return rowPosition;
|
| @@ -1328,17 +1344,17 @@ LayoutUnit RenderGrid::centeredRowPositionForChild(const RenderBox& child) const
|
| // The grid items should be inside the grid container's border box, that's why they need to be shifted.
|
| LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()] + marginBeforeForChild(&child);
|
| LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()];
|
| + LayoutUnit rowPosition = startOfRow + marginBeforeForChild(&child);
|
| + LayoutUnit offsetFromRowPosition = computeOverflowAlignmentOffset(child.style()->alignSelfOverflowAlignment(), startOfRow, endOfRow, child.logicalHeight());
|
|
|
| - // FIXME: This should account for the grid item's <overflow-position>.
|
| - return startOfRow + std::max<LayoutUnit>(0, endOfRow - startOfRow - child.logicalHeight()) / 2;
|
| + return rowPosition + offsetFromRowPosition / 2;
|
| }
|
|
|
| LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const
|
| {
|
| bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode();
|
| - ItemPosition alignSelf = RenderStyle::resolveAlignment(style(), child.style());
|
|
|
| - switch (alignSelf) {
|
| + switch (RenderStyle::resolveAlignment(style(), child.style())) {
|
| case ItemPositionSelfStart:
|
| // If orthogonal writing-modes, this computes to 'Start'.
|
| // FIXME: grid track sizing and positioning does not support orthogonal modes yet.
|
|
|