Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 351881084b582f24de06651ade28f7fd5595239d..49e580f2ef176da6cfc6120408e80496ad21aa2d 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -122,16 +122,36 @@ public: |
return 0; |
} |
- PassOwnPtr<GridCoordinate> nextEmptyGridArea() |
+ bool areCellsEmptyUntil(size_t finalTrackIndex) |
+ { |
+ if (m_direction == ForColumns) { |
+ for (size_t i = m_columnIndex; i <= finalTrackIndex; ++i) { |
+ const GridCell& children = m_grid[m_rowIndex][i]; |
+ if (!children.isEmpty()) |
+ return false; |
+ } |
+ } else { |
+ for (size_t i = m_rowIndex; i <= finalTrackIndex; ++i) { |
+ const GridCell& children = m_grid[i][m_columnIndex]; |
+ if (!children.isEmpty()) |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+ } |
+ |
+ PassOwnPtr<GridCoordinate> nextEmptyGridArea(size_t finalTrackIndex = 0) |
Julien - ping for review
2014/03/20 18:33:14
Not a huge fan of:
a) the implicit parameter as no
|
{ |
ASSERT(!m_grid.isEmpty()); |
size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m_columnIndex; |
const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_grid.size() : m_grid[0].size(); |
+ if (!finalTrackIndex) |
+ finalTrackIndex = (m_direction == ForColumns) ? m_columnIndex : m_rowIndex; |
for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) { |
- const GridCell& children = m_grid[m_rowIndex][m_columnIndex]; |
- if (children.isEmpty()) { |
- OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan(m_rowIndex, m_rowIndex), GridSpan(m_columnIndex, m_columnIndex))); |
+ if (areCellsEmptyUntil(finalTrackIndex)) { |
+ OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan(m_rowIndex, (m_direction == ForColumns) ? m_rowIndex : finalTrackIndex), GridSpan(m_columnIndex, (m_direction == ForColumns) ? finalTrackIndex : m_columnIndex))); |
// Advance the iterator to avoid an infinite loop where we would return the same grid area over and over. |
++varyingTrackIndex; |
return result.release(); |
@@ -819,15 +839,15 @@ void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<RenderBox*>& au |
for (size_t i = 0; i < autoGridItems.size(); ++i) { |
OwnPtr<GridSpan> majorAxisPositions = resolveGridPositionsFromStyle(autoGridItems[i], autoPlacementMajorAxisDirection()); |
GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions->initialPositionIndex); |
- if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) { |
- insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
+ if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions->finalPositionIndex)) { |
+ insertItemIntoGrid(autoGridItems[i], *emptyGridArea); |
continue; |
} |
growGrid(autoPlacementMinorAxisDirection()); |
- OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(); |
+ OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions->finalPositionIndex); |
ASSERT(emptyGridArea); |
- insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
+ insertItemIntoGrid(autoGridItems[i], *emptyGridArea); |
} |
} |
@@ -841,12 +861,11 @@ void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem) |
{ |
OwnPtr<GridSpan> minorAxisPositions = resolveGridPositionsFromStyle(gridItem, autoPlacementMinorAxisDirection()); |
ASSERT(!resolveGridPositionsFromStyle(gridItem, autoPlacementMajorAxisDirection())); |
- size_t minorAxisIndex = 0; |
if (minorAxisPositions) { |
- minorAxisIndex = minorAxisPositions->initialPositionIndex; |
+ size_t minorAxisIndex = minorAxisPositions->initialPositionIndex; |
GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisIndex); |
- if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) { |
- insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
+ if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->finalPositionIndex)) { |
+ insertItemIntoGrid(gridItem, *emptyGridArea); |
return; |
} |
} else { |
@@ -861,10 +880,11 @@ void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem) |
} |
// We didn't find an empty grid area so we need to create an extra major axis line and insert our gridItem in it. |
- const size_t columnIndex = (autoPlacementMajorAxisDirection() == ForColumns) ? m_grid[0].size() : minorAxisIndex; |
- const size_t rowIndex = (autoPlacementMajorAxisDirection() == ForColumns) ? minorAxisIndex : m_grid.size(); |
+ GridSpan minorAxisSpan = minorAxisPositions ? *minorAxisPositions : GridSpan(0, 0); |
+ GridSpan columnSpan = (autoPlacementMajorAxisDirection() == ForColumns) ? GridSpan(m_grid[0].size(), m_grid[0].size()) : minorAxisSpan; |
+ GridSpan rowSpan = (autoPlacementMajorAxisDirection() == ForColumns) ? minorAxisSpan : GridSpan(m_grid.size(), m_grid.size()); |
growGrid(autoPlacementMajorAxisDirection()); |
- insertItemIntoGrid(gridItem, rowIndex, columnIndex); |
+ insertItemIntoGrid(gridItem, GridCoordinate(rowSpan, columnSpan)); |
} |
GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const |