Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Unified Diff: Source/core/rendering/RenderGrid.cpp

Issue 706903003: [CSS Grid Layout] Partial implementation of justify-content for Grid. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Don't assert flex tracks exhaust the availableFreeSpace Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderGrid.cpp
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
index 11474d6b9153b483983e0f05f4bbff8f4b23fdc0..cf6c9e45fcfc4d3906a8077735b2a210d08f5c84 100644
--- a/Source/core/rendering/RenderGrid.cpp
+++ b/Source/core/rendering/RenderGrid.cpp
@@ -506,7 +506,10 @@ 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;
}
+
+ // FIXME: Should ASSERT flexible tracks exhaust the availableLogicalSpace ? (see issue 739613002).
}
LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(GridTrackSizingDirection direction, const GridLength& gridLength) const
@@ -1087,13 +1090,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 +1166,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 +1504,81 @@ 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:
+ return ContentPositionCenter;
+ case ContentDistributionStretch:
+ return ContentPositionStart;
+ case ContentDistributionDefault:
+ return ContentPositionAuto;
+ }
+
+ ASSERT_NOT_REACHED();
+ return ContentPositionAuto;
+}
+
+static inline LayoutUnit offsetToStartEdge(bool isLeftToRight, LayoutUnit availableSpace)
+{
+ return isLeftToRight ? LayoutUnit(0) : availableSpace;
+}
+
+static inline LayoutUnit offsetToEndEdge(bool isLeftToRight, LayoutUnit availableSpace)
+{
+ return !isLeftToRight ? LayoutUnit(0) : availableSpace;
+}
+
+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);
+
+ // FIXME: still pending of implementing support for the <overflow-position> keyword
+ // in justify-content and aling-content properties.
+ switch (position) {
+ case ContentPositionLeft:
+ // If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’.
+ if (!isHorizontalWritingMode())
+ return offsetToStartEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ return offsetToStartEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ case ContentPositionRight:
+ // If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’.
+ if (!isHorizontalWritingMode())
+ return offsetToStartEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ return offsetToEndEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ case ContentPositionCenter:
+ return availableFreeSpace / 2;
+ case ContentPositionFlexEnd:
+ // Only used in flex layout, for other layout, it's equivalent to 'End'.
+ case ContentPositionEnd:
+ return offsetToEndEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ case ContentPositionFlexStart:
+ // Only used in flex layout, for other layout, it's equivalent to 'Start'.
+ case ContentPositionStart:
+ return offsetToStartEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ case ContentPositionBaseline:
+ case ContentPositionLastBaseline:
+ // FIXME: Implement the previous values. For now, we always start align.
+ // crbug.com/234191
+ return offsetToStartEdge(style()->isLeftToRightDirection(), availableFreeSpace);
+ case ContentPositionAuto:
+ break;
+ }
+
+ ASSERT_NOT_REACHED();
+ return 0;
+}
+
LayoutPoint RenderGrid::findChildLogicalPosition(const RenderBox& child) const
{
return LayoutPoint(columnPositionForChild(child), rowPositionForChild(child));
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698