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

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: Applied additional suggested changes. 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
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));

Powered by Google App Engine
This is Rietveld 408576698