Chromium Code Reviews| 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); |