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

Unified Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 2161003003: [css-grid] repeat() syntax should take a <track-list> argument (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months 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: third_party/WebKit/Source/core/layout/LayoutGrid.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index c310533d05364a05b7b3dded3c7ce4408e07dc38..4e20e617f7335d6b9b226773739a423e7d5618ed 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -363,6 +363,13 @@ bool LayoutGrid::namedGridLinesDefinitionDidChange(const ComputedStyle& oldStyle
|| oldStyle.namedGridColumnLines() != styleRef().namedGridColumnLines();
}
+size_t LayoutGrid::autoRepeatTracksCount(GridTrackSizingDirection direction) const
+{
+ if (direction == ForColumns)
+ return m_autoRepeatColumns * styleRef().gridAutoRepeatColumns().size();
+ return m_autoRepeatRows * styleRef().gridAutoRepeatRows().size();
+}
+
size_t LayoutGrid::gridColumnCount() const
{
DCHECK(!m_gridIsDirty);
@@ -371,7 +378,7 @@ size_t LayoutGrid::gridColumnCount() const
// to get it from the style. Note that we know for sure that there are't any implicit tracks,
// because not having rows implies that there are no "normal" children (out-of-flow children are
// not stored in m_grid).
- return m_grid.size() ? m_grid[0].size() : GridPositionsResolver::explicitGridColumnCount(styleRef(), m_autoRepeatColumns);
+ return m_grid.size() ? m_grid[0].size() : GridPositionsResolver::explicitGridColumnCount(styleRef(), autoRepeatTracksCount(ForColumns));
}
size_t LayoutGrid::gridRowCount() const
@@ -850,12 +857,12 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(GridTrackSizingDirection direc
const Vector<GridTrackSize>& autoRepeatTrackStyles = isRowAxis ? styleRef().gridAutoRepeatColumns() : styleRef().gridAutoRepeatRows();
const GridTrackSize& autoTrackSize = isRowAxis ? styleRef().gridAutoColumns() : styleRef().gridAutoRows();
size_t insertionPoint = isRowAxis ? styleRef().gridAutoRepeatColumnsInsertionPoint() : styleRef().gridAutoRepeatRowsInsertionPoint();
- size_t repetitions = autoRepeatCountForDirection(direction);
+ size_t autoRepeatTracksCount = autoRepeatCountForDirection(direction) * autoRepeatTrackStyles.size();
// We should not use GridPositionsResolver::explicitGridXXXCount() for this because the
// explicit grid might be larger than the number of tracks in grid-template-rows|columns (if
// grid-template-areas is specified for example).
- size_t explicitTracksCount = trackStyles.size() + repetitions;
+ size_t explicitTracksCount = trackStyles.size() + autoRepeatTracksCount;
int untranslatedIndexAsInt = translatedIndex + (isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
if (untranslatedIndexAsInt < 0)
@@ -865,13 +872,15 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(GridTrackSizingDirection direc
if (untranslatedIndex >= explicitTracksCount)
return autoTrackSize;
- if (LIKELY(!repetitions) || untranslatedIndex < insertionPoint)
+ if (LIKELY(!autoRepeatTracksCount) || untranslatedIndex < insertionPoint)
return trackStyles[untranslatedIndex];
- if (untranslatedIndex < (insertionPoint + repetitions))
- return autoRepeatTrackStyles[0];
+ if (untranslatedIndex < (insertionPoint + autoRepeatTracksCount)) {
+ size_t autoRepeatLocalIndex = untranslatedIndexAsInt - insertionPoint;
+ return autoRepeatTrackStyles[autoRepeatLocalIndex % autoRepeatTrackStyles.size()];
+ }
- return trackStyles[untranslatedIndex - repetitions];
+ return trackStyles[untranslatedIndex - autoRepeatTracksCount];
jfernandez 2016/07/19 14:43:18 Are you sure this can't lead to a negative value a
eae 2016/07/19 20:59:48 Please add a DCHECK here to ensure it cannot go ne
svillar 2016/07/20 07:22:30 Replying to both, I am not changing the code here,
jfernandez 2016/07/20 08:51:50 Yes, you're right.
}
GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex, SizingOperation sizingOperation) const
@@ -1388,11 +1397,6 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi
if (!autoRepeatTracks.size())
return 0;
- DCHECK_EQ(autoRepeatTracks.size(), static_cast<size_t>(1));
- auto autoTrackSize = autoRepeatTracks.at(0);
- DCHECK(autoTrackSize.minTrackBreadth().isLength());
- DCHECK(!autoTrackSize.minTrackBreadth().isFlex());
-
LayoutUnit availableSize = isRowAxis ? availableLogicalWidth() : computeContentLogicalHeight(MainOrPreferredSize, styleRef().logicalHeight(), LayoutUnit(-1));
if (availableSize == -1) {
const Length& maxLength = isRowAxis ? styleRef().logicalMaxWidth() : styleRef().logicalMaxHeight();
@@ -1419,14 +1423,20 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi
needsToFulfillMinimumSize = true;
}
- bool hasDefiniteMaxTrackSizingFunction = autoTrackSize.maxTrackBreadth().isLength() && !autoTrackSize.maxTrackBreadth().isContentSized();
- const Length trackLength = hasDefiniteMaxTrackSizingFunction ? autoTrackSize.maxTrackBreadth().length() : autoTrackSize.minTrackBreadth().length();
+ LayoutUnit autoRepeatTracksSize;
+ for (auto autoTrackSize : autoRepeatTracks) {
+ DCHECK(autoTrackSize.minTrackBreadth().isLength());
+ DCHECK(!autoTrackSize.minTrackBreadth().isFlex());
+ bool hasDefiniteMaxTrackSizingFunction = autoTrackSize.maxTrackBreadth().isLength() && !autoTrackSize.maxTrackBreadth().isContentSized();
+ auto trackLength = hasDefiniteMaxTrackSizingFunction ? autoTrackSize.maxTrackBreadth().length() : autoTrackSize.minTrackBreadth().length();
+ autoRepeatTracksSize += valueForLength(trackLength, availableSize);
+ }
// For the purpose of finding the number of auto-repeated tracks, the UA must floor the track size to a UA-specified
// value to avoid division by zero. It is suggested that this floor be 1px.
- LayoutUnit autoRepeatTrackSize = std::max<LayoutUnit>(LayoutUnit(1), valueForLength(trackLength, availableSize));
+ autoRepeatTracksSize = std::max<LayoutUnit>(LayoutUnit(1), autoRepeatTracksSize);
// There will be always at least 1 auto-repeat track, so take it already into account when computing the total track size.
- LayoutUnit tracksSize = autoRepeatTrackSize;
+ LayoutUnit tracksSize = autoRepeatTracksSize;
const Vector<GridTrackSize>& trackSizes = isRowAxis ? styleRef().gridTemplateColumns() : styleRef().gridTemplateRows();
for (const auto& track : trackSizes) {
@@ -1444,7 +1454,7 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi
if (freeSpace <= 0)
return 1;
- size_t repetitions = 1 + (freeSpace / (autoRepeatTrackSize + gapSize)).toInt();
+ size_t repetitions = 1 + (freeSpace / (autoRepeatTracksSize + gapSize)).toInt();
// Provided the grid container does not have a definite size or max-size in the relevant axis,
// if the min size is definite then the number of repetitions is the largest possible positive
@@ -1465,9 +1475,10 @@ std::unique_ptr<LayoutGrid::OrderedTrackIndexSet> LayoutGrid::computeEmptyTracks
std::unique_ptr<OrderedTrackIndexSet> emptyTrackIndexes;
size_t insertionPoint = isRowAxis ? styleRef().gridAutoRepeatColumnsInsertionPoint() : styleRef().gridAutoRepeatRowsInsertionPoint();
+ auto& autoRepeatTracks = isRowAxis ? styleRef().gridAutoRepeatColumns() : styleRef().gridAutoRepeatRows();
size_t repetitions = autoRepeatCountForDirection(direction);
size_t firstAutoRepeatTrack = insertionPoint + std::abs(isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
- size_t lastAutoRepeatTrack = firstAutoRepeatTrack + repetitions;
+ size_t lastAutoRepeatTrack = firstAutoRepeatTrack + repetitions * autoRepeatTracks.size();
if (m_gridItemArea.isEmpty()) {
emptyTrackIndexes = wrapUnique(new OrderedTrackIndexSet);
@@ -1531,8 +1542,8 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation)
insertItemIntoGrid(*child, area);
}
- DCHECK_GE(gridRowCount(), GridPositionsResolver::explicitGridRowCount(*style(), m_autoRepeatRows));
- DCHECK_GE(gridColumnCount(), GridPositionsResolver::explicitGridColumnCount(*style(), m_autoRepeatColumns));
+ DCHECK_GE(gridRowCount(), GridPositionsResolver::explicitGridRowCount(*style(), autoRepeatTracksCount(ForRows)));
jfernandez 2016/07/19 14:43:18 It seems that we are using the autoRepeatTracksCou
svillar 2016/07/20 07:22:30 I've been checking where we use m_autoRepeatColumn
+ DCHECK_GE(gridColumnCount(), GridPositionsResolver::explicitGridColumnCount(*style(), autoRepeatTracksCount(ForColumns)));
placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems);
placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
@@ -1560,8 +1571,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator()
m_smallestRowStart = m_smallestColumnStart = 0;
- size_t maximumRowIndex = GridPositionsResolver::explicitGridRowCount(*style(), m_autoRepeatRows);
- size_t maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(*style(), m_autoRepeatColumns);
+ size_t maximumRowIndex = GridPositionsResolver::explicitGridRowCount(*style(), autoRepeatTracksCount(ForRows));
+ size_t maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(*style(), autoRepeatTracksCount(ForColumns));
ASSERT(m_gridItemsIndexesMap.isEmpty());
size_t childIndex = 0;
@@ -1573,8 +1584,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator()
m_gridItemsIndexesMap.set(child, childIndex++);
// This function bypasses the cache (cachedGridArea()) as it is used to build it.
- GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromStyle(*style(), *child, ForRows, m_autoRepeatRows);
- GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFromStyle(*style(), *child, ForColumns, m_autoRepeatColumns);
+ GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromStyle(*style(), *child, ForRows, autoRepeatTracksCount(ForRows));
+ GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFromStyle(*style(), *child, ForColumns, autoRepeatTracksCount(ForColumns));
m_gridItemArea.set(child, GridArea(rowPositions, columnPositions));
// |positions| is 0 if we need to run the auto-placement algorithm.

Powered by Google App Engine
This is Rietveld 408576698