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 948e0979690fbfb46c15e127e52b07b46b72190d..0c828295ce6f779adbd9459d48ae0bde99e48239 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
@@ -1140,17 +1140,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())); |
@@ -1179,25 +1183,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); |
@@ -1224,14 +1229,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) |
@@ -1257,27 +1264,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)); |
@@ -1468,45 +1477,47 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
{ |
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
- OwnPtr<GridSpan> positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction); |
- if (!positions) { |
+ auto unresolvedPositions = GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), child, direction); |
+ if (unresolvedPositions.requiresAutoPlacement()) { |
offset = LayoutUnit(); |
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); |
finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition); |
- LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toInt()]; |
- LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : logicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition.next().toInt()] : m_rowPositions[finalPosition.next().toInt()]; |
+ LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toInt()]; |
+ LayoutUnit end = endIsAuto ? (isForColumns ? logicalWidth() : logicalHeight()) : isForColumns ? m_columnPositions[finalPosition.next().toInt()] : m_rowPositions[finalPosition.next().toInt()]; |
breadth = end - start; |
if (startIsAuto) |
- breadth -= (direction == ForColumns) ? borderStart() : borderBefore(); |
+ breadth -= isForColumns ? borderStart() : borderBefore(); |
else |
- start -= ((direction == ForColumns) ? borderStart() : borderBefore()); |
+ start -= isForColumns ? borderStart() : borderBefore(); |
if (endIsAuto) { |
- breadth -= (direction == ForColumns) ? borderEnd() : borderAfter(); |
+ breadth -= isForColumns ? borderEnd() : borderAfter(); |
breadth -= scrollbarLogicalWidth(); |
} |
@@ -1515,7 +1526,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
if (child.parent() == this && !startIsAuto) { |
// If column/row start is "auto" the static position has been already set in prepareChildForPositionedLayout(). |
PaintLayer* childLayer = child.layer(); |
- if (direction == ForColumns) |
+ if (isForColumns) |
childLayer->setStaticInlinePosition(borderStart() + offset); |
else |
childLayer->setStaticBlockPosition(borderBefore() + offset); |