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

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

Issue 2525363002: [css-grid] Move more LayoutGrid attributes to Grid class (Closed)
Patch Set: Patch for landing Created 4 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 | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 d210ac81ce679c04faa54e1fb8bffeef8f3723af..4bc93265cd2583de385943ee66bec7154d0453ed 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -42,17 +42,23 @@ static const int infinity = -1;
class GridItemWithSpan;
+size_t LayoutGrid::Grid::numTracks(GridTrackSizingDirection direction) const {
+ if (direction == ForRows)
+ return m_grid.size();
+ return m_grid.size() ? m_grid[0].size() : 0;
+}
+
void LayoutGrid::Grid::ensureGridSize(size_t maximumRowSize,
size_t maximumColumnSize) {
- const size_t oldRowSize = numRows();
+ const size_t oldRowSize = numTracks(ForRows);
if (maximumRowSize > oldRowSize) {
m_grid.grow(maximumRowSize);
- for (size_t row = oldRowSize; row < numRows(); ++row)
- m_grid[row].grow(numColumns());
+ for (size_t row = oldRowSize; row < numTracks(ForRows); ++row)
+ m_grid[row].grow(numTracks(ForColumns));
}
- if (maximumColumnSize > numColumns()) {
- for (size_t row = 0; row < numRows(); ++row)
+ if (maximumColumnSize > numTracks(ForColumns)) {
+ for (size_t row = 0; row < numTracks(ForRows); ++row)
m_grid[row].grow(maximumColumnSize);
}
}
@@ -108,6 +114,54 @@ bool LayoutGrid::Grid::hasAnyGridItemPaintOrder() const {
}
#endif
+void LayoutGrid::Grid::setAutoRepeatTracks(size_t autoRepeatRows,
+ size_t autoRepeatColumns) {
+ m_autoRepeatRows = autoRepeatRows;
+ m_autoRepeatColumns = autoRepeatColumns;
+}
+
+size_t LayoutGrid::Grid::autoRepeatTracks(
+ GridTrackSizingDirection direction) const {
+ return direction == ForRows ? m_autoRepeatRows : m_autoRepeatColumns;
+}
+
+void LayoutGrid::Grid::setAutoRepeatEmptyColumns(
+ std::unique_ptr<OrderedTrackIndexSet> autoRepeatEmptyColumns) {
+ m_autoRepeatEmptyColumns = std::move(autoRepeatEmptyColumns);
+}
+
+void LayoutGrid::Grid::setAutoRepeatEmptyRows(
+ std::unique_ptr<OrderedTrackIndexSet> autoRepeatEmptyRows) {
+ m_autoRepeatEmptyRows = std::move(autoRepeatEmptyRows);
+}
+
+bool LayoutGrid::Grid::hasAutoRepeatEmptyTracks(
+ GridTrackSizingDirection direction) const {
+ return direction == ForColumns ? !!m_autoRepeatEmptyColumns
+ : !!m_autoRepeatEmptyRows;
+}
+
+bool LayoutGrid::Grid::isEmptyAutoRepeatTrack(
+ GridTrackSizingDirection direction,
+ size_t line) const {
+ DCHECK(hasAutoRepeatEmptyTracks(direction));
+ return autoRepeatEmptyTracks(direction)->contains(line);
+}
+
+LayoutGrid::OrderedTrackIndexSet* LayoutGrid::Grid::autoRepeatEmptyTracks(
+ GridTrackSizingDirection direction) const {
+ DCHECK(hasAutoRepeatEmptyTracks(direction));
+ return direction == ForColumns ? m_autoRepeatEmptyColumns.get()
+ : m_autoRepeatEmptyRows.get();
+}
+
+GridSpan LayoutGrid::Grid::gridItemSpan(
+ const LayoutBox& gridItem,
+ GridTrackSizingDirection direction) const {
+ GridArea area = gridItemArea(gridItem);
+ return direction == ForColumns ? area.columns : area.rows;
+}
+
void LayoutGrid::Grid::clear() {
m_grid.resize(0);
m_gridItemArea.clear();
@@ -115,6 +169,10 @@ void LayoutGrid::Grid::clear() {
m_hasAnyOrthogonalChildren = false;
m_smallestRowStart = 0;
m_smallestColumnStart = 0;
+ m_autoRepeatColumns = 0;
+ m_autoRepeatRows = 0;
+ m_autoRepeatEmptyColumns = nullptr;
+ m_autoRepeatEmptyRows = nullptr;
}
class GridTrack {
@@ -403,7 +461,7 @@ struct GridItemsSpanGroupRange {
};
LayoutGrid::LayoutGrid(Element* element)
- : LayoutBlock(element), m_gridIsDirty(true), m_orderIterator(this) {
+ : LayoutBlock(element), m_grid(this), m_gridIsDirty(true) {
ASSERT(!childrenInline());
}
@@ -473,16 +531,6 @@ bool LayoutGrid::namedGridLinesDefinitionDidChange(
oldStyle.namedGridColumnLines() != styleRef().namedGridColumnLines();
}
-size_t LayoutGrid::gridColumnCount() const {
- DCHECK(!m_gridIsDirty);
- return m_grid.numColumns();
-}
-
-size_t LayoutGrid::gridRowCount() const {
- DCHECK(!m_gridIsDirty);
- return m_grid.numRows();
-}
-
LayoutUnit LayoutGrid::computeTrackBasedLogicalHeight(
const GridSizingData& sizingData) const {
LayoutUnit logicalHeight;
@@ -503,10 +551,8 @@ void LayoutGrid::computeTrackSizesForDefiniteSize(
DCHECK(sizingData.isValidTransition(direction));
sizingData.setAvailableSpace(availableSpace);
sizingData.freeSpace(direction) =
- availableSpace -
- guttersSize(direction, 0,
- direction == ForRows ? gridRowCount() : gridColumnCount(),
- sizingData.sizingOperation);
+ availableSpace - guttersSize(direction, 0, m_grid.numTracks(direction),
+ sizingData.sizingOperation);
sizingData.sizingOperation = TrackSizing;
LayoutUnit baseSizes, growthLimits;
@@ -580,8 +626,9 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
// TODO(svillar): we won't need to do this once the intrinsic width
// computation is isolated from the LayoutGrid object state (it should not
// touch any attribute) (see crbug.com/627812)
- if (m_autoRepeatColumns &&
- m_autoRepeatColumns !=
+ size_t autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns);
+ if (autoRepeatColumns &&
+ autoRepeatColumns !=
computeAutoRepeatTracksCount(ForColumns, TrackSizing))
dirtyGrid();
placeItemsOnGrid(TrackSizing);
@@ -655,19 +702,6 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
clearNeedsLayout();
}
-bool LayoutGrid::hasAutoRepeatEmptyTracks(
- GridTrackSizingDirection direction) const {
- return direction == ForColumns ? !!m_autoRepeatEmptyColumns
- : !!m_autoRepeatEmptyRows;
-}
-
-bool LayoutGrid::isEmptyAutoRepeatTrack(GridTrackSizingDirection direction,
- size_t line) const {
- DCHECK(hasAutoRepeatEmptyTracks(direction));
- return direction == ForColumns ? m_autoRepeatEmptyColumns->contains(line)
- : m_autoRepeatEmptyRows->contains(line);
-}
-
LayoutUnit LayoutGrid::gridGapForDirection(
GridTrackSizingDirection direction,
SizingOperation sizingOperation) const {
@@ -691,11 +725,10 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
if (span <= 1)
return LayoutUnit();
- bool isRowAxis = direction == ForColumns;
LayoutUnit gap = gridGapForDirection(direction, sizingOperation);
// Fast path, no collapsing tracks.
- if (!hasAutoRepeatEmptyTracks(direction))
+ if (!m_grid.hasAutoRepeatEmptyTracks(direction))
return gap * (span - 1);
// If there are collapsing tracks we need to be sure that gutters are properly
@@ -708,12 +741,12 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
size_t endLine = startLine + span;
for (size_t line = startLine; line < endLine - 1; ++line) {
- if (!isEmptyAutoRepeatTrack(direction, line))
+ if (!m_grid.isEmptyAutoRepeatTrack(direction, line))
gapAccumulator += gap;
}
// The above loop adds one extra gap for trailing collapsed tracks.
- if (gapAccumulator && isEmptyAutoRepeatTrack(direction, endLine - 1)) {
+ if (gapAccumulator && m_grid.isEmptyAutoRepeatTrack(direction, endLine - 1)) {
DCHECK_GE(gapAccumulator, gap);
gapAccumulator -= gap;
}
@@ -721,10 +754,9 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
// If the startLine is the start line of a collapsed track we need to go
// backwards till we reach a non collapsed track. If we find a non collapsed
// track we need to add that gap.
- if (startLine && isEmptyAutoRepeatTrack(direction, startLine)) {
+ if (startLine && m_grid.isEmptyAutoRepeatTrack(direction, startLine)) {
size_t nonEmptyTracksBeforeStartLine = startLine;
- auto begin = isRowAxis ? m_autoRepeatEmptyColumns->begin()
- : m_autoRepeatEmptyRows->begin();
+ auto begin = m_grid.autoRepeatEmptyTracks(direction)->begin();
for (auto it = begin; *it != startLine; ++it) {
DCHECK(nonEmptyTracksBeforeStartLine);
--nonEmptyTracksBeforeStartLine;
@@ -736,14 +768,11 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
// If the endLine is the end line of a collapsed track we need to go forward
// till we reach a non collapsed track. If we find a non collapsed track we
// need to add that gap.
- if (isEmptyAutoRepeatTrack(direction, endLine - 1)) {
- size_t nonEmptyTracksAfterEndLine =
- (isRowAxis ? gridColumnCount() : gridRowCount()) - endLine;
- auto currentEmptyTrack = isRowAxis
- ? m_autoRepeatEmptyColumns->find(endLine - 1)
- : m_autoRepeatEmptyRows->find(endLine - 1);
- auto endEmptyTrack = isRowAxis ? m_autoRepeatEmptyColumns->end()
- : m_autoRepeatEmptyRows->end();
+ if (m_grid.isEmptyAutoRepeatTrack(direction, endLine - 1)) {
+ size_t nonEmptyTracksAfterEndLine = m_grid.numTracks(direction) - endLine;
+ auto currentEmptyTrack =
+ m_grid.autoRepeatEmptyTracks(direction)->find(endLine - 1);
+ auto endEmptyTrack = m_grid.autoRepeatEmptyTracks(direction)->end();
// HashSet iterators do not implement operator- so we have to manually
// iterate to know the number of remaining empty tracks.
for (auto it = ++currentEmptyTrack; it != endEmptyTrack; ++it) {
@@ -931,7 +960,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(
for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) {
GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]);
while (LayoutBox* gridItem = iterator.nextGridItem()) {
- const GridSpan span = cachedGridSpan(*gridItem, direction);
+ const GridSpan& span = m_grid.gridItemSpan(*gridItem, direction);
// Do not include already processed items.
if (i > 0 && span.startLine() <= flexibleSizedTracksIndex[i - 1])
@@ -972,9 +1001,9 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(
bool checkMaxSize = maxSize != -1 && rowsSize > maxSize;
if (checkMinSize || checkMaxSize) {
LayoutUnit freeSpace = checkMaxSize ? maxSize : LayoutUnit(-1);
- freeSpace =
- std::max(freeSpace, minSize) -
- guttersSize(ForRows, 0, gridRowCount(), sizingData.sizingOperation);
+ freeSpace = std::max(freeSpace, minSize) -
+ guttersSize(ForRows, 0, m_grid.numTracks(ForRows),
+ sizingData.sizingOperation);
flexFraction = findFlexFactorUnitSize(
tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()),
@@ -1209,8 +1238,8 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction,
size_t translatedIndex,
SizingOperation sizingOperation) const {
// Collapse empty auto repeat tracks if auto-fit.
- if (hasAutoRepeatEmptyTracks(direction) &&
- isEmptyAutoRepeatTrack(direction, translatedIndex))
+ if (m_grid.hasAutoRepeatEmptyTracks(direction) &&
+ m_grid.isEmptyAutoRepeatTrack(direction, translatedIndex))
return {Length(Fixed), LengthTrackSizing};
const GridTrackSize& trackSize = rawGridTrackSize(direction, translatedIndex);
@@ -1461,7 +1490,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(
: sizingData.rowTracks[trackIndex];
while (LayoutBox* gridItem = iterator.nextGridItem()) {
if (itemsSet.add(gridItem).isNewEntry) {
- const GridSpan& span = cachedGridSpan(*gridItem, direction);
+ const GridSpan& span = m_grid.gridItemSpan(*gridItem, direction);
if (span.integerSpan() == 1) {
resolveContentBasedTrackSizingFunctionsForNonSpanningItems(
direction, span, *gridItem, track, sizingData);
@@ -2016,13 +2045,16 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
DCHECK(!m_grid.hasInFlowGridItems());
+ size_t autoRepeatColumns;
+ size_t autoRepeatRows =
+ computeAutoRepeatTracksCount(ForRows, sizingOperation);
if (sizingOperation == IntrinsicSizeComputation) {
- m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().size();
+ autoRepeatColumns = styleRef().gridAutoRepeatColumns().size();
} else {
- m_autoRepeatColumns =
+ autoRepeatColumns =
computeAutoRepeatTracksCount(ForColumns, sizingOperation);
}
- m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation);
+ m_grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns);
populateExplicitGridAndOrderIterator();
@@ -2036,8 +2068,8 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
#endif
DCHECK(!m_grid.hasAnyOrthogonalChildren());
size_t childIndex = 0;
- for (LayoutBox* child = m_orderIterator.first(); child;
- child = m_orderIterator.next()) {
+ for (LayoutBox* child = m_grid.orderIterator().first(); child;
+ child = m_grid.orderIterator().next()) {
if (child->isOutOfFlowPositioned())
continue;
@@ -2065,10 +2097,12 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
#if ENABLE(ASSERT)
if (m_grid.hasInFlowGridItems()) {
- DCHECK_GE(gridRowCount(), GridPositionsResolver::explicitGridRowCount(
- *style(), m_autoRepeatRows));
- DCHECK_GE(gridColumnCount(), GridPositionsResolver::explicitGridColumnCount(
- *style(), m_autoRepeatColumns));
+ DCHECK_GE(m_grid.numTracks(ForRows),
+ GridPositionsResolver::explicitGridRowCount(
+ *style(), m_grid.autoRepeatTracks(ForRows)));
+ DCHECK_GE(m_grid.numTracks(ForColumns),
+ GridPositionsResolver::explicitGridColumnCount(
+ *style(), m_grid.autoRepeatTracks(ForColumns)));
}
#endif
@@ -2078,12 +2112,12 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
m_grid.shrinkToFit();
// Compute collapsable tracks for auto-fit.
- m_autoRepeatEmptyColumns = computeEmptyTracksForAutoRepeat(ForColumns);
- m_autoRepeatEmptyRows = computeEmptyTracksForAutoRepeat(ForRows);
+ m_grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(ForColumns));
+ m_grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(ForRows));
#if ENABLE(ASSERT)
- for (LayoutBox* child = m_orderIterator.first(); child;
- child = m_orderIterator.next()) {
+ for (LayoutBox* child = m_grid.orderIterator().first(); child;
+ child = m_grid.orderIterator().next()) {
if (child->isOutOfFlowPositioned())
continue;
@@ -2095,14 +2129,16 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) {
}
void LayoutGrid::populateExplicitGridAndOrderIterator() {
- OrderIteratorPopulator populator(m_orderIterator);
+ OrderIteratorPopulator populator(m_grid.orderIterator());
int smallestRowStart = 0;
int smallestColumnStart = 0;
+ size_t autoRepeatRows = m_grid.autoRepeatTracks(ForRows);
+ size_t autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns);
size_t maximumRowIndex =
- GridPositionsResolver::explicitGridRowCount(*style(), m_autoRepeatRows);
+ GridPositionsResolver::explicitGridRowCount(*style(), autoRepeatRows);
size_t maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(
- *style(), m_autoRepeatColumns);
+ *style(), autoRepeatColumns);
for (LayoutBox* child = firstInFlowChildBox(); child;
child = child->nextInFlowSiblingBox()) {
@@ -2112,10 +2148,10 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
// build it.
GridSpan rowPositions =
GridPositionsResolver::resolveGridPositionsFromStyle(
- *style(), *child, ForRows, m_autoRepeatRows);
+ *style(), *child, ForRows, autoRepeatRows);
GridSpan columnPositions =
GridPositionsResolver::resolveGridPositionsFromStyle(
- *style(), *child, ForColumns, m_autoRepeatColumns);
+ *style(), *child, ForColumns, autoRepeatColumns);
m_grid.setGridItemArea(*child, GridArea(rowPositions, columnPositions));
// |positions| is 0 if we need to run the auto-placement algorithm.
@@ -2158,8 +2194,7 @@ LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(
const GridSpan& specifiedPositions) const {
GridTrackSizingDirection crossDirection =
specifiedDirection == ForColumns ? ForRows : ForColumns;
- const size_t endOfCrossDirection =
- crossDirection == ForColumns ? gridColumnCount() : gridRowCount();
+ const size_t endOfCrossDirection = m_grid.numTracks(crossDirection);
size_t crossDirectionSpanSize =
GridPositionsResolver::spanSizeForAutoPlacedItem(*style(), gridItem,
crossDirection);
@@ -2187,10 +2222,11 @@ void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(
for (const auto& autoGridItem : autoGridItems) {
GridSpan majorAxisPositions =
- cachedGridSpan(*autoGridItem, autoPlacementMajorAxisDirection());
+ m_grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection());
ASSERT(majorAxisPositions.isTranslatedDefinite());
- ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
- .isTranslatedDefinite());
+ DCHECK(
+ !m_grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection())
+ .isTranslatedDefinite());
size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), *autoGridItem, autoPlacementMinorAxisDirection());
unsigned majorAxisInitialPosition = majorAxisPositions.startLine();
@@ -2236,15 +2272,14 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(
LayoutBox& gridItem,
std::pair<size_t, size_t>& autoPlacementCursor) {
GridSpan minorAxisPositions =
- cachedGridSpan(gridItem, autoPlacementMinorAxisDirection());
- ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection())
+ m_grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection());
+ DCHECK(!m_grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection())
.isTranslatedDefinite());
size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection());
const size_t endOfMajorAxis =
- (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount()
- : gridRowCount();
+ m_grid.numTracks(autoPlacementMajorAxisDirection());
size_t majorAxisAutoPlacementCursor =
autoPlacementMajorAxisDirection() == ForColumns
? autoPlacementCursor.second
@@ -2292,8 +2327,7 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(
? emptyGridArea->columns.endLine()
: emptyGridArea->rows.endLine();
const size_t endOfMinorAxis =
- autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount()
- : gridRowCount();
+ m_grid.numTracks(autoPlacementMinorAxisDirection());
if (minorAxisFinalPositionIndex <= endOfMinorAxis)
break;
@@ -2334,11 +2368,7 @@ void LayoutGrid::dirtyGrid() {
m_grid.clear();
m_gridItemsOverflowingGridArea.resize(0);
- m_autoRepeatColumns = 0;
- m_autoRepeatRows = 0;
m_gridIsDirty = true;
- m_autoRepeatEmptyColumns = nullptr;
- m_autoRepeatEmptyRows = nullptr;
}
Vector<LayoutUnit> LayoutGrid::trackSizesForComputedStyle(
@@ -2353,7 +2383,7 @@ Vector<LayoutUnit> LayoutGrid::trackSizesForComputedStyle(
if (numPositions < 2)
return tracks;
- bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction);
+ bool hasCollapsedTracks = m_grid.hasAutoRepeatEmptyTracks(direction);
LayoutUnit gap = !hasCollapsedTracks
? gridGapForDirection(direction, TrackSizing)
: LayoutUnit();
@@ -2365,19 +2395,19 @@ Vector<LayoutUnit> LayoutGrid::trackSizesForComputedStyle(
if (!hasCollapsedTracks)
return tracks;
- size_t remainingEmptyTracks = isRowAxis ? m_autoRepeatEmptyColumns->size()
- : m_autoRepeatEmptyRows->size();
+ size_t remainingEmptyTracks = m_grid.autoRepeatEmptyTracks(direction)->size();
size_t lastLine = tracks.size();
gap = gridGapForDirection(direction, TrackSizing);
for (size_t i = 1; i < lastLine; ++i) {
- if (isEmptyAutoRepeatTrack(direction, i - 1)) {
+ if (m_grid.isEmptyAutoRepeatTrack(direction, i - 1)) {
--remainingEmptyTracks;
} else {
// Remove the gap between consecutive non empty tracks. Remove it also
// just once for an arbitrary number of empty tracks between two non empty
// ones.
bool allRemainingTracksAreEmpty = remainingEmptyTracks == (lastLine - i);
- if (!allRemainingTracksAreEmpty || !isEmptyAutoRepeatTrack(direction, i))
+ if (!allRemainingTracksAreEmpty ||
+ !m_grid.isEmptyAutoRepeatTrack(direction, i))
tracks[i - 1] -= gap;
}
}
@@ -2654,17 +2684,11 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(
}
}
-GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem,
- GridTrackSizingDirection direction) const {
- GridArea area = m_grid.gridItemArea(gridItem);
- return direction == ForColumns ? area.columns : area.rows;
-}
-
LayoutUnit LayoutGrid::assumedRowsSizeForOrthogonalChild(
const LayoutBox& child,
SizingOperation sizingOperation) const {
DCHECK(isOrthogonalChild(child));
- const GridSpan& span = cachedGridSpan(child, ForRows);
+ const GridSpan& span = m_grid.gridItemSpan(child, ForRows);
LayoutUnit gridAreaSize;
bool gridAreaIsIndefinite = false;
LayoutUnit containingBlockAvailableSize =
@@ -2702,7 +2726,7 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(
const Vector<GridTrack>& tracks =
direction == ForColumns ? sizingData.columnTracks : sizingData.rowTracks;
- const GridSpan& span = cachedGridSpan(child, direction);
+ const GridSpan& span = m_grid.gridItemSpan(child, direction);
LayoutUnit gridAreaBreadth;
for (const auto& trackPosition : span)
gridAreaBreadth += tracks[trackPosition].baseSize();
@@ -2724,7 +2748,7 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(
const Vector<GridTrack>& tracks = (direction == ForColumns)
? sizingData.columnTracks
: sizingData.rowTracks;
- const GridSpan& span = cachedGridSpan(child, direction);
+ const GridSpan& span = m_grid.gridItemSpan(child, direction);
const Vector<LayoutUnit>& linePositions =
(direction == ForColumns) ? m_columnPositions : m_rowPositions;
LayoutUnit initialTrackPosition = linePositions[span.startLine()];
@@ -2764,7 +2788,7 @@ void LayoutGrid::populateGridPositionsForDirection(
// If we have collapsed tracks we just ignore gaps here and add them later
// as we might not compute the gap between two consecutive tracks without
// examining the surrounding ones.
- bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction);
+ bool hasCollapsedTracks = m_grid.hasAutoRepeatEmptyTracks(direction);
LayoutUnit gap =
!hasCollapsedTracks
? gridGapForDirection(direction, sizingData.sizingOperation)
@@ -2781,11 +2805,11 @@ void LayoutGrid::populateGridPositionsForDirection(
// they become 0.
if (hasCollapsedTracks) {
gap = gridGapForDirection(direction, sizingData.sizingOperation);
- size_t remainingEmptyTracks = isRowAxis ? m_autoRepeatEmptyColumns->size()
- : m_autoRepeatEmptyRows->size();
+ size_t remainingEmptyTracks =
+ m_grid.autoRepeatEmptyTracks(direction)->size();
LayoutUnit gapAccumulator;
for (size_t i = 1; i < lastLine; ++i) {
- if (isEmptyAutoRepeatTrack(direction, i - 1)) {
+ if (m_grid.isEmptyAutoRepeatTrack(direction, i - 1)) {
--remainingEmptyTracks;
} else {
// Add gap between consecutive non empty tracks. Add it also just once
@@ -2793,7 +2817,7 @@ void LayoutGrid::populateGridPositionsForDirection(
bool allRemainingTracksAreEmpty =
remainingEmptyTracks == (lastLine - i);
if (!allRemainingTracksAreEmpty ||
- !isEmptyAutoRepeatTrack(direction, i))
+ !m_grid.isEmptyAutoRepeatTrack(direction, i))
gapAccumulator += gap;
}
positions[i] += gapAccumulator;
@@ -3043,8 +3067,8 @@ int LayoutGrid::firstLineBoxBaseline() const {
const LayoutBox* firstChild = nullptr;
bool isBaselineAligned = false;
// Finding the first grid item in grid order.
- for (size_t column = 0; !isBaselineAligned && column < m_grid.numColumns();
- column++) {
+ for (size_t column = 0;
+ !isBaselineAligned && column < m_grid.numTracks(ForColumns); column++) {
for (size_t index = 0; index < m_grid.cell(0, column).size(); index++) {
const LayoutBox* child = m_grid.cell(0, column)[index];
DCHECK(!child->isOutOfFlowPositioned());
@@ -3262,7 +3286,7 @@ GridAxisPosition LayoutGrid::rowAxisPositionForChild(
LayoutUnit LayoutGrid::columnAxisOffsetForChild(
const LayoutBox& child,
GridSizingData& sizingData) const {
- const GridSpan& rowsSpan = cachedGridSpan(child, ForRows);
+ const GridSpan& rowsSpan = m_grid.gridItemSpan(child, ForRows);
size_t childStartLine = rowsSpan.startLine();
LayoutUnit startOfRow = m_rowPositions[childStartLine];
LayoutUnit startPosition = startOfRow + marginBeforeForChild(child);
@@ -3305,7 +3329,7 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(
LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child,
GridSizingData& sizingData) const {
- const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns);
+ const GridSpan& columnsSpan = m_grid.gridItemSpan(child, ForColumns);
size_t childStartLine = columnsSpan.startLine();
LayoutUnit startOfColumn = m_columnPositions[childStartLine];
LayoutUnit startPosition = startOfColumn + marginStartForChild(child);
@@ -3539,11 +3563,12 @@ size_t LayoutGrid::numTracks(GridTrackSizingDirection direction) const {
// rows implies that there are no "normal" children (out-of-flow children are
// not stored in m_grid).
if (direction == ForRows)
- return m_grid.numRows();
+ return m_grid.numTracks(ForRows);
- return m_grid.numRows() ? m_grid.numColumns()
- : GridPositionsResolver::explicitGridColumnCount(
- styleRef(), m_autoRepeatColumns);
+ return m_grid.numTracks(ForRows)
+ ? m_grid.numTracks(ForColumns)
+ : GridPositionsResolver::explicitGridColumnCount(
+ styleRef(), m_grid.autoRepeatTracks(ForColumns));
}
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698