Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 8dda784767969d0cb39c7a2208b537a678182900..9afe7c53ff61b92bba446be4b90092b7d4a687f2 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -978,15 +978,27 @@ PassOwnPtr<GridCoordinate> RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOu |
void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGridItems) |
{ |
+ bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
+ bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
+ |
+ // Mapping between the major axis tracks (rows or columns) and the last auto-placed item's position inserted on |
+ // that track. This is needed to implement "sparse" packing for items locked to a given track. |
+ // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
+ HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> minorAxisCursors; |
+ |
for (const auto& autoGridItem : autoGridItems) { |
OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); |
GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); |
+ unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialPosition.toInt(); |
- GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), 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()); |
if (!emptyGridArea) |
emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); |
insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
+ |
+ if (!isGridAutoFlowDense) |
+ minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedInitialPosition.toInt()); |
} |
} |