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..d091cc586c04ce095de9becd8d11bf3104d2df4d 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
@@ -1793,10 +1793,17 @@ GridAxisPosition LayoutGrid::rowAxisPositionForChild(const LayoutBox& child) con |
return GridAxisStart; |
} |
+static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distribution, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth) |
+{ |
+ return (distribution == ContentDistributionStretch || ContentDistributionStretch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPositions[0] - childBreadth; |
+ |
+} |
+ |
LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
{ |
const GridCoordinate& coordinate = cachedGridCoordinate(child); |
- LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()]; |
+ size_t childStartLine = coordinate.rows.resolvedInitialPosition.toInt(); |
+ LayoutUnit startOfRow = m_rowPositions[childStartLine]; |
LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); |
if (hasAutoMarginsInColumnAxis(child)) |
return startPosition; |
@@ -1806,8 +1813,12 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
return startPosition; |
case GridAxisEnd: |
case GridAxisCenter: { |
- LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()]; |
- LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, child.logicalHeight() + child.marginLogicalHeight()); |
+ size_t childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt(); |
+ LayoutUnit endOfRow = m_rowPositions[childEndLine]; |
+ LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHeight(); |
+ if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.size() - 1) |
+ endOfRow -= offsetBetweenTracks(styleRef().alignContentDistribution(), m_rowPositions, childBreadth); |
+ LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, childBreadth); |
return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); |
} |
} |
@@ -1819,7 +1830,8 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
{ |
const GridCoordinate& coordinate = cachedGridCoordinate(child); |
- LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()]; |
+ size_t childStartLine = coordinate.columns.resolvedInitialPosition.toInt(); |
+ LayoutUnit startOfColumn = m_columnPositions[childStartLine]; |
LayoutUnit startPosition = startOfColumn + marginStartForChild(child); |
if (hasAutoMarginsInRowAxis(child)) |
return startPosition; |
@@ -1829,8 +1841,12 @@ LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
return startPosition; |
case GridAxisEnd: |
case GridAxisCenter: { |
- LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()]; |
- LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, child.logicalWidth() + child.marginLogicalWidth()); |
+ size_t childEndLine = coordinate.columns.resolvedFinalPosition.next().toInt(); |
+ LayoutUnit endOfColumn = m_columnPositions[childEndLine]; |
+ LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidth(); |
+ if (childEndLine - childStartLine > 1 && childEndLine < m_columnPositions.size() - 1) |
+ endOfColumn -= offsetBetweenTracks(styleRef().justifyContentDistribution(), m_columnPositions, childBreadth); |
+ LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(child.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childBreadth); |
return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); |
} |
} |