Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 11474d6b9153b483983e0f05f4bbff8f4b23fdc0..7ec76fca15a529d2b8e8f4e939a04296233ccf4d 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -506,7 +506,13 @@ void RenderGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi |
GridTrackSize trackSize = gridTrackSize(direction, trackIndex); |
tracks[trackIndex].m_usedBreadth = std::max<LayoutUnit>(tracks[trackIndex].m_usedBreadth, normalizedFractionBreadth * trackSize.maxTrackBreadth().flex()); |
+ availableLogicalSpace -= tracks[trackIndex].m_usedBreadth; |
} |
+ |
+ // Flexible tracks will exhaust the availableLogicalSpace. |
+ // FIXME: Flexible tracks sizing algorithm is wrong (see issue 739613002), which makes this |
+ // ASSERT to be violated in certain cases. |
+ ASSERT(availableLogicalSpace <= 0); |
} |
LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(GridTrackSizingDirection direction, const GridLength& gridLength) const |
@@ -1087,13 +1093,15 @@ void RenderGrid::layoutGridItems() |
{ |
placeItemsOnGrid(); |
+ LayoutUnit availableSpaceForColumns = availableLogicalWidth(); |
+ LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorderPadding); |
GridSizingData sizingData(gridColumnCount(), gridRowCount()); |
- computeUsedBreadthOfGridTracks(ForColumns, sizingData); |
+ computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColumns); |
ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks)); |
- computeUsedBreadthOfGridTracks(ForRows, sizingData); |
+ computeUsedBreadthOfGridTracks(ForRows, sizingData, availableSpaceForRows); |
ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks)); |
- populateGridPositions(sizingData); |
+ populateGridPositions(sizingData, availableSpaceForColumns, availableSpaceForRows); |
m_gridItemsOverflowingGridArea.resize(0); |
for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { |
@@ -1161,10 +1169,13 @@ LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox& child, GridTrack |
return gridAreaBreadth; |
} |
-void RenderGrid::populateGridPositions(const GridSizingData& sizingData) |
+void RenderGrid::populateGridPositions(const GridSizingData& sizingData, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows) |
{ |
- m_columnPositions.resize(sizingData.columnTracks.size() + 1); |
- m_columnPositions[0] = borderAndPaddingStart(); |
+ unsigned numberOfColumnTracks = sizingData.columnTracks.size(); |
+ LayoutUnit columnOffset = contentPositionAndDistributionOffset(availableSpaceForColumns, style()->justifyContent(), style()->justifyContentDistribution(), numberOfColumnTracks); |
+ |
+ m_columnPositions.resize(numberOfColumnTracks + 1); |
+ m_columnPositions[0] = borderAndPaddingStart() + columnOffset; |
for (size_t i = 0; i < m_columnPositions.size() - 1; ++i) |
m_columnPositions[i + 1] = m_columnPositions[i] + sizingData.columnTracks[i].m_usedBreadth; |
@@ -1496,6 +1507,72 @@ LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
return 0; |
} |
+ContentPosition static resolveContentDistributionFallback(ContentDistributionType distribution) |
+{ |
+ switch (distribution) { |
+ case ContentDistributionSpaceBetween: |
+ return ContentPositionStart; |
+ case ContentDistributionSpaceAround: |
+ return ContentPositionCenter; |
+ case ContentDistributionSpaceEvenly: |
Julien - ping for review
2014/11/20 16:31:03
Those 3 values will need to be implemented too. Un
jfernandez
2014/11/20 23:01:14
This function just resolved the default <content-p
|
+ return ContentPositionCenter; |
+ case ContentDistributionStretch: |
+ return ContentPositionStart; |
+ case ContentDistributionDefault: |
+ return ContentPositionAuto; |
+ } |
+ |
+ ASSERT_NOT_REACHED(); |
+ return ContentPositionAuto; |
+} |
+ |
+LayoutUnit RenderGrid::contentPositionAndDistributionOffset(LayoutUnit availableFreeSpace, ContentPosition position, ContentDistributionType distribution, unsigned numberOfGridTracks) const |
+{ |
+ if (availableFreeSpace <= 0) |
+ return 0; |
+ |
+ // FIXME: for the time being, spec states that it will always fallback for Grids, but |
+ // discussion is ongoing. |
+ if (distribution != ContentDistributionDefault && position == ContentPositionAuto) |
+ position = resolveContentDistributionFallback(distribution); |
+ |
Julien - ping for review
2014/11/20 16:31:03
We need a FIXME for supporting the <overflow-posit
jfernandez
2014/11/20 23:01:14
Acknowledged.
|
+ switch (position) { |
+ case ContentPositionLeft: |
+ // If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’. |
+ if (!isHorizontalWritingMode()) |
+ return 0; |
+ if (style()->isLeftToRightDirection()) |
+ return 0; |
+ return availableFreeSpace; |
+ case ContentPositionRight: |
+ // If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’. |
+ if (!isHorizontalWritingMode()) |
+ return 0; |
+ if (style()->isLeftToRightDirection()) |
+ return availableFreeSpace; |
+ return 0; |
+ case ContentPositionCenter: |
+ return availableFreeSpace / 2; |
+ case ContentPositionFlexEnd: |
+ // Only used in flex layout, for other layout, it's equivalent to 'End'. |
+ case ContentPositionEnd: |
+ return availableFreeSpace; |
+ case ContentPositionFlexStart: |
+ // Only used in flex layout, for other layout, it's equivalent to 'Start'. |
+ case ContentPositionStart: |
+ return 0; |
+ case ContentPositionBaseline: |
+ case ContentPositionLastBaseline: |
+ // FIXME: Implement the previous values. For now, we always start align. |
Julien - ping for review
2014/11/20 16:31:02
This is probably blocked on implementing baselines
jfernandez
2014/11/20 23:01:14
Acknowledged.
|
+ return 0; |
+ case ContentPositionAuto: |
+ break; |
+ } |
+ |
+ ASSERT_NOT_REACHED(); |
+ return 0; |
+} |
+ |
LayoutPoint RenderGrid::findChildLogicalPosition(const RenderBox& child) const |
{ |
return LayoutPoint(columnPositionForChild(child), rowPositionForChild(child)); |