Chromium Code Reviews| 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)); |