Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 83a03053fe72eed39985a0851379f13d93b2fbdc..df992aecfbf0d1aed805aef07512e2ef63b9f324 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -924,7 +924,12 @@ void RenderGrid::layoutGridItems() |
// now, just size as if we were a regular child. |
child->layoutIfNeeded(); |
- child->setLogicalLocation(findChildLogicalPosition(child, sizingData)); |
+#ifndef NDEBUG |
+ const GridCoordinate& coordinate = cachedGridCoordinate(child); |
+ ASSERT(coordinate.columns.initialPositionIndex < sizingData.columnTracks.size()); |
+ ASSERT(coordinate.rows.initialPositionIndex < sizingData.rowTracks.size()); |
+#endif |
+ child->setLogicalLocation(findChildLogicalPosition(child)); |
// For correctness, we disable some painting optimizations if we have a child overflowing its grid area. |
m_gridItemOverflowGridArea = child->logicalHeight() > overrideContainingBlockContentLogicalHeight |
@@ -1127,14 +1132,127 @@ void RenderGrid::populateGridPositions(const GridSizingData& sizingData) |
m_rowPositions[i + 1] = m_rowPositions[i] + sizingData.rowTracks[i].m_usedBreadth; |
} |
-LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const GridSizingData& sizingData) |
+LayoutUnit RenderGrid::startOfColumnForChild(const RenderBox* child) const |
{ |
const GridCoordinate& coordinate = cachedGridCoordinate(child); |
- ASSERT(coordinate.columns.initialPositionIndex < sizingData.columnTracks.size()); |
- ASSERT(coordinate.rows.initialPositionIndex < sizingData.rowTracks.size()); |
+ LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.initialPositionIndex]; |
+ // 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); |
+} |
+LayoutUnit RenderGrid::endOfColumnForChild(const RenderBox* child) const |
+{ |
+ const GridCoordinate& coordinate = cachedGridCoordinate(child); |
+ LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.initialPositionIndex]; |
// The grid items should be inside the grid container's border box, that's why they need to be shifted. |
- return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex] + marginStartForChild(child), m_rowPositions[coordinate.rows.initialPositionIndex] + marginBeforeForChild(child)); |
+ LayoutUnit columnPosition = startOfColumn + marginStartForChild(child); |
+ |
+ LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.finalPositionIndex + 1]; |
+ // FIXME: This should account for the grid item's <overflow-position>. |
+ return columnPosition + std::max<LayoutUnit>(0, endOfColumn - m_columnPositions[coordinate.columns.initialPositionIndex] - child->logicalWidth()); |
+} |
+ |
+LayoutUnit RenderGrid::columnPositionAlignedWithGridContainerStart(const RenderBox* child) const |
+{ |
+ if (style()->isLeftToRightDirection()) |
+ return startOfColumnForChild(child); |
+ |
+ return endOfColumnForChild(child); |
+} |
+ |
+LayoutUnit RenderGrid::columnPositionAlignedWithGridContainerEnd(const RenderBox* child) const |
+{ |
+ if (!style()->isLeftToRightDirection()) |
+ return startOfColumnForChild(child); |
+ |
+ return endOfColumnForChild(child); |
+} |
+ |
+LayoutUnit RenderGrid::centeredColumnPositionForChild(const RenderBox* child) const |
+{ |
+ const GridCoordinate& coordinate = cachedGridCoordinate(child); |
+ LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.initialPositionIndex]; |
+ LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.finalPositionIndex + 1]; |
+ LayoutUnit columnPosition = startOfColumn + marginStartForChild(child); |
+ return columnPosition + std::max<LayoutUnit>(0, endOfColumn - startOfColumn - child->logicalWidth()) / 2; |
+} |
+ |
+LayoutUnit RenderGrid::columnPositionForChild(const RenderBox* child) const |
+{ |
+ ItemPosition childJustifySelf = child->style()->justifySelf(); |
+ switch (childJustifySelf) { |
+ case ItemPositionSelfStart: |
+ // self-start is based on the child's direction. That's why we need to check against the grid container's direction. |
+ if (child->style()->direction() != style()->direction()) |
+ return columnPositionAlignedWithGridContainerEnd(child); |
+ |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ case ItemPositionSelfEnd: |
+ // self-end is based on the child's direction. That's why we need to check against the grid container's direction. |
+ if (child->style()->direction() != style()->direction()) |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
+ return columnPositionAlignedWithGridContainerEnd(child); |
+ |
+ case ItemPositionFlexStart: |
+ case ItemPositionFlexEnd: |
+ // Only used in flex layout, for other layout, it's equivalent to 'start'. |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
+ case ItemPositionLeft: |
+ // If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’. |
+ if (!isHorizontalWritingMode()) |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
+ if (style()->isLeftToRightDirection()) |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
+ return columnPositionAlignedWithGridContainerEnd(child); |
+ case ItemPositionRight: |
+ // If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’. |
+ if (!isHorizontalWritingMode()) |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
+ if (style()->isLeftToRightDirection()) |
+ return columnPositionAlignedWithGridContainerEnd(child); |
+ |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
+ case ItemPositionCenter: |
+ return centeredColumnPositionForChild(child); |
+ case ItemPositionStart: |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ case ItemPositionEnd: |
+ return columnPositionAlignedWithGridContainerEnd(child); |
+ |
+ case ItemPositionAuto: |
+ case ItemPositionStretch: |
+ case ItemPositionBaseline: |
+ // FIXME: Implement the previous values. For now, we always start align the child. |
+ return startOfColumnForChild(child); |
+ } |
+ |
+ ASSERT_NOT_REACHED(); |
+ return 0; |
+} |
+ |
+LayoutUnit RenderGrid::rowPositionForChild(const RenderBox* child) const |
+{ |
+ const GridCoordinate& coordinate = cachedGridCoordinate(child); |
+ |
+ // 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.initialPositionIndex]; |
+ LayoutUnit rowPosition = startOfRow + marginBeforeForChild(child); |
+ |
+ // FIXME: This function should account for 'align-self'. |
+ |
+ return rowPosition; |
+} |
+ |
+LayoutPoint RenderGrid::findChildLogicalPosition(const RenderBox* child) const |
+{ |
+ return LayoutPoint(columnPositionForChild(child), rowPositionForChild(child)); |
} |
static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUnit start, LayoutUnit end) |