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

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

Issue 1424913009: [css-grid] Simplify the interface of GridResolvedPosition (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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: 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 bd5b96d4193f6ac6ae180422949f5be4e4a1a39c..06cffa9972f6acc61bad61187ddbe3a625f024bf 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -1078,17 +1078,21 @@ void LayoutGrid::placeItemsOnGrid()
if (child->isOutOfFlowPositioned())
continue;
- OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForRows);
- OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForColumns);
- if (!rowPositions || !columnPositions) {
- GridSpan* majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? columnPositions.get() : rowPositions.get();
- if (!majorAxisPositions)
+ auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), *child, ForRows);
+ auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), *child, ForColumns);
+
+ if (unresolvedRowPositions.requiresAutoPlacement() || unresolvedColumnPositions.requiresAutoPlacement()) {
+ bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns;
+ if ((majorAxisDirectionIsForColumns && unresolvedColumnPositions.requiresAutoPlacement())
+ || (!majorAxisDirectionIsForColumns && unresolvedRowPositions.requiresAutoPlacement()))
autoMajorAxisAutoGridItems.append(child);
else
specifiedMajorAxisAutoGridItems.append(child);
continue;
}
- insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPositions));
+ GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedRowPositions, styleRef());
+ GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedColumnPositions, styleRef());
+ insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions));
}
ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()));
@@ -1117,25 +1121,26 @@ void LayoutGrid::populateExplicitGridAndOrderIterator()
m_gridItemsIndexesMap.set(child, childIndex++);
// This function bypasses the cache (cachedGridCoordinate()) as it is used to build it.
- OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForRows);
- OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForColumns);
-
- // |positions| is 0 if we need to run the auto-placement algorithm.
- if (rowPositions) {
- maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions->resolvedFinalPosition.next().toInt());
+ auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), *child, ForRows);
+ if (!unresolvedRowPositions.requiresAutoPlacement()) {
+ GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedRowPositions, styleRef());
+ maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition.next().toInt());
} else {
// Grow the grid for items with a definite row span, getting the largest such span.
- GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *child, ForRows, GridResolvedPosition(0));
- maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolvedFinalPosition.next().toInt());
+ GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(styleRef(), *child, ForRows, GridResolvedPosition(0));
+ maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalPosition.next().toInt());
}
- if (columnPositions) {
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPositions->resolvedFinalPosition.next().toInt());
+ auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), *child, ForColumns);
+ if (!unresolvedColumnPositions.requiresAutoPlacement()) {
+ GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedColumnPositions, styleRef());
+ maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition.next().toInt());
} else {
// Grow the grid for items with a definite column span, getting the largest such span.
- GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *child, ForColumns, GridResolvedPosition(0));
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions.resolvedFinalPosition.next().toInt());
+ GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(styleRef(), *child, ForColumns, GridResolvedPosition(0));
+ maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition.next().toInt());
}
+
}
m_grid.grow(maximumRowIndex);
@@ -1162,14 +1167,16 @@ void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> minorAxisCursors;
for (const auto& autoGridItem : autoGridItems) {
- OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection());
+ auto unresolvedMajorAxisPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), *autoGridItem, autoPlacementMajorAxisDirection());
+ ASSERT(!unresolvedMajorAxisPositions.requiresAutoPlacement());
+ GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedMajorAxisPositions, styleRef());
GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));
- unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialPosition.toInt();
+ unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition.toInt();
- GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions->resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));
- OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions->integerSpan(), minorAxisPositions.integerSpan());
+ GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));
+ OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisPositions.integerSpan());
if (!emptyGridArea)
- emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions);
+ emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
insertItemIntoGrid(*autoGridItem, *emptyGridArea);
if (!isGridAutoFlowDense)
@@ -1195,27 +1202,29 @@ void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri
void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<size_t, size_t>& autoPlacementCursor)
{
- OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridItem, autoPlacementMinorAxisDirection());
- ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridItem, autoPlacementMajorAxisDirection()));
- GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0));
+ ASSERT(GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), gridItem, autoPlacementMajorAxisDirection()).requiresAutoPlacement());
+ GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(styleRef(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0));
const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount();
size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.second : autoPlacementCursor.first;
size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
OwnPtr<GridCoordinate> emptyGridArea;
- if (minorAxisPositions) {
+ auto unresolvedMinorAxisPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), gridItem, autoPlacementMinorAxisDirection());
+ if (!unresolvedMinorAxisPositions.requiresAutoPlacement()) {
+ GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedMinorAxisPositions, styleRef());
+
// Move to the next track in major axis if initial position in minor axis is before auto-placement cursor.
- if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoPlacementCursor)
+ if (minorAxisPositions.resolvedInitialPosition.toInt() < minorAxisAutoPlacementCursor)
majorAxisAutoPlacementCursor++;
if (majorAxisAutoPlacementCursor < endOfMajorAxis) {
- GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor);
- emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integerSpan(), majorAxisPositions.integerSpan());
+ GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor);
+ emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.integerSpan(), majorAxisPositions.integerSpan());
}
if (!emptyGridArea)
- emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions);
+ emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
} else {
GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));
@@ -1436,28 +1445,30 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
{
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode());
- OwnPtr<GridSpan> positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction);
- if (!positions) {
- offset = LayoutUnit();
+ auto unresolvedPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), child, direction);
+ if (unresolvedPositions.requiresAutoPlacement()) {
+ offset = LayoutUnit(0);
Manuel Rego 2015/11/10 09:08:03 Why LayoutUnit(0)? We're using LayoutUnit() all ov
svillar 2015/11/10 10:56:37 Yeah LayoutUnit() is more efficient, I thought it
breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight();
return;
}
- GridPosition startPosition = (direction == ForColumns) ? child.style()->gridColumnStart() : child.style()->gridRowStart();
- GridPosition endPosition = (direction == ForColumns) ? child.style()->gridColumnEnd() : child.style()->gridRowEnd();
- size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridRowCount()) - 1;
+ bool isForColumns = direction == ForColumns;
+ GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart();
+ GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : child.style()->gridRowEnd();
+ size_t lastTrackIndex = (isForColumns ? gridColumnCount() : gridRowCount()) - 1;
+ GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(unresolvedPositions, styleRef());
bool startIsAuto = startPosition.isAuto()
- || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::initialPositionSide(direction)))
- || (positions->resolvedInitialPosition.toInt() > lastTrackIndex);
+ || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(startPosition.namedGridLine(), styleRef(), isForColumns ? ColumnStartSide : RowStartSide))
+ || (positions.resolvedInitialPosition.toInt() > lastTrackIndex);
bool endIsAuto = endPosition.isAuto()
- || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalPositionSide(direction)))
- || (positions->resolvedFinalPosition.toInt() > lastTrackIndex);
+ || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(endPosition.namedGridLine(), styleRef(), isForColumns ? ColumnEndSide : RowEndSide))
+ || (positions.resolvedFinalPosition.toInt() > lastTrackIndex);
GridResolvedPosition firstPosition = GridResolvedPosition(0);
- GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions->resolvedInitialPosition;
+ GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition;
GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex);
- GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions->resolvedFinalPosition;
+ GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition;
// Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it.
initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPosition);

Powered by Google App Engine
This is Rietveld 408576698