| 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);
|
|
|