| Index: Source/core/rendering/RenderGrid.cpp
|
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
|
| index 37bcc5c1398eb9605615c54aadced968b121100e..1eeda8f44d2a36a147204fc613cadb0abe2a1508 100644
|
| --- a/Source/core/rendering/RenderGrid.cpp
|
| +++ b/Source/core/rendering/RenderGrid.cpp
|
| @@ -94,11 +94,11 @@ class RenderGrid::GridIterator {
|
| public:
|
| // |direction| is the direction that is fixed to |fixedTrackIndex| so e.g
|
| // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd column.
|
| - GridIterator(const GridRepresentation& grid, GridTrackSizingDirection direction, size_t fixedTrackIndex)
|
| + GridIterator(const GridRepresentation& grid, GridTrackSizingDirection direction, size_t fixedTrackIndex, size_t varyingTrackIndex = 0)
|
| : m_grid(grid)
|
| , m_direction(direction)
|
| - , m_rowIndex((direction == ForColumns) ? 0 : fixedTrackIndex)
|
| - , m_columnIndex((direction == ForColumns) ? fixedTrackIndex : 0)
|
| + , m_rowIndex((direction == ForColumns) ? varyingTrackIndex : fixedTrackIndex)
|
| + , m_columnIndex((direction == ForColumns) ? fixedTrackIndex : varyingTrackIndex)
|
| , m_childIndex(0)
|
| {
|
| ASSERT(m_rowIndex < m_grid.size());
|
| @@ -889,27 +889,47 @@ void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<RenderBox*>& au
|
|
|
| void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGridItems)
|
| {
|
| - for (size_t i = 0; i < autoGridItems.size(); ++i)
|
| - placeAutoMajorAxisItemOnGrid(autoGridItems[i]);
|
| + std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0);
|
| +
|
| + for (size_t i = 0; i < autoGridItems.size(); ++i) {
|
| + placeAutoMajorAxisItemOnGrid(autoGridItems[i], autoPlacementCursor);
|
| +
|
| + // If grid-auto-flow is dense, reset auto-placement cursor.
|
| + if (style()->isGridAutoFlowAlgorithmDense()) {
|
| + autoPlacementCursor.first = 0;
|
| + autoPlacementCursor.second = 0;
|
| + }
|
| + }
|
| }
|
|
|
| -void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem)
|
| +void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* 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));
|
| +
|
| + 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) {
|
| - GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions->resolvedInitialPosition.toInt());
|
| - emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integerSpan(), majorAxisPositions.integerSpan());
|
| + // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor.
|
| + 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());
|
| + }
|
| +
|
| if (!emptyGridArea)
|
| emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions);
|
| } else {
|
| GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));
|
|
|
| - const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount();
|
| - for (size_t majorAxisIndex = 0; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) {
|
| - GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex);
|
| + for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) {
|
| + GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex, minorAxisAutoPlacementCursor);
|
| emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisPositions.integerSpan());
|
|
|
| if (emptyGridArea) {
|
| @@ -923,6 +943,9 @@ void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem)
|
| // We don't need to create a new empty grid area yet as we might find a valid one in the next iteration.
|
| emptyGridArea = nullptr;
|
| }
|
| +
|
| + // As we're moving to the next track in the major axis we should reset the auto-placement cursor in the minor axis.
|
| + minorAxisAutoPlacementCursor = 0;
|
| }
|
|
|
| if (!emptyGridArea)
|
| @@ -930,6 +953,9 @@ void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem)
|
| }
|
|
|
| insertItemIntoGrid(gridItem, *emptyGridArea);
|
| + // Move auto-placement cursor to the new position.
|
| + autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition.toInt();
|
| + autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition.toInt();
|
| }
|
|
|
| GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const
|
|
|