Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 00f5775224c5042aee1a74df22120a924f20bdef..3b1df259960c51148222fd24f532d74de36f09f2 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()); |
@@ -898,27 +898,48 @@ 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); |
+ bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
+ |
+ for (size_t i = 0; i < autoGridItems.size(); ++i) { |
+ placeAutoMajorAxisItemOnGrid(autoGridItems[i], autoPlacementCursor); |
+ |
+ // If grid-auto-flow is dense, reset auto-placement cursor. |
+ if (isGridAutoFlowDense) { |
+ 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) { |
@@ -932,6 +953,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) |
@@ -939,6 +963,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 |