| Index: Source/core/rendering/RenderGrid.cpp
|
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
|
| index cfbd888e7c2e97fff4cd56da3716ebb54c8e3216..e9f550f9f0c0283619e5b9e4a8084f7e741d07cc 100644
|
| --- a/Source/core/rendering/RenderGrid.cpp
|
| +++ b/Source/core/rendering/RenderGrid.cpp
|
| @@ -150,6 +150,7 @@ private:
|
|
|
| RenderGrid::RenderGrid(Element* element)
|
| : RenderBlock(element)
|
| + , m_orderIterator(this)
|
| {
|
| // All of our children must be block level.
|
| setChildrenInline(false);
|
| @@ -444,25 +445,6 @@ size_t RenderGrid::explicitGridSizeForSide(GridPositionSide side) const
|
| return (side == ColumnStartSide || side == ColumnEndSide) ? explicitGridColumnCount() : explicitGridRowCount();
|
| }
|
|
|
| -size_t RenderGrid::maximumIndexInDirection(TrackSizingDirection direction) const
|
| -{
|
| - size_t maximumIndex = std::max<size_t>(1, (direction == ForColumns) ? explicitGridColumnCount() : explicitGridRowCount());
|
| -
|
| - for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
|
| - // This function bypasses the cache (cachedGridCoordinate()) as it is used to build it.
|
| - OwnPtr<GridSpan> positions = resolveGridPositionsFromStyle(child, direction);
|
| -
|
| - // |positions| is NULL if we need to run the auto-placement algorithm. Our estimation ignores
|
| - // this case as the auto-placement algorithm will grow the grid as needed.
|
| - if (!positions)
|
| - continue;
|
| -
|
| - maximumIndex = std::max(maximumIndex, positions->finalPositionIndex + 1);
|
| - }
|
| -
|
| - return maximumIndex;
|
| -}
|
| -
|
| LayoutUnit RenderGrid::logicalContentHeightForChild(RenderBox* child, Vector<GridTrack>& columnTracks)
|
| {
|
| // FIXME: We shouldn't force a layout every time this function is called but
|
| @@ -643,15 +625,12 @@ void RenderGrid::placeItemsOnGrid()
|
| ASSERT(!gridWasPopulated());
|
| ASSERT(m_gridItemCoordinate.isEmpty());
|
|
|
| - m_grid.grow(maximumIndexInDirection(ForRows));
|
| - size_t maximumColumnIndex = maximumIndexInDirection(ForColumns);
|
| - for (size_t i = 0; i < m_grid.size(); ++i)
|
| - m_grid[i].grow(maximumColumnIndex);
|
| + populateExplicitGridAndOrderIterator();
|
|
|
| Vector<RenderBox*> autoMajorAxisAutoGridItems;
|
| Vector<RenderBox*> specifiedMajorAxisAutoGridItems;
|
| GridAutoFlow autoFlow = style()->gridAutoFlow();
|
| - for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
|
| + for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
|
| // FIXME: We never re-resolve positions if the grid is grown during auto-placement which may lead auto / <integer>
|
| // positions to not match the author's intent. The specification is unclear on what should be done in this case.
|
| OwnPtr<GridSpan> rowPositions = resolveGridPositionsFromStyle(child, ForRows);
|
| @@ -681,6 +660,49 @@ void RenderGrid::placeItemsOnGrid()
|
| placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
|
| }
|
|
|
| +void RenderGrid::populateExplicitGridAndOrderIterator()
|
| +{
|
| + // FIXME: We should find a way to share OrderIterator's Vector's
|
| + // initialization code with RenderFlexibleBox.
|
| + Vector<int> orderValues;
|
| + bool anyChildHasDefaultOrderValue = false;
|
| +
|
| + size_t maximumRowIndex = std::max<size_t>(1, explicitGridRowCount());
|
| + size_t maximumColumnIndex = std::max<size_t>(1, explicitGridColumnCount());
|
| +
|
| + for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
|
| + // Avoid growing the vector for the common-case default value of 0.
|
| + if (int order = child->style()->order())
|
| + orderValues.append(child->style()->order());
|
| + else
|
| + anyChildHasDefaultOrderValue = true;
|
| +
|
| + // This function bypasses the cache (cachedGridCoordinate()) as it is used to build it.
|
| + OwnPtr<GridSpan> rowPositions = resolveGridPositionsFromStyle(child, ForRows);
|
| + OwnPtr<GridSpan> columnPositions = resolveGridPositionsFromStyle(child, ForColumns);
|
| +
|
| + // |positions| is 0 if we need to run the auto-placement algorithm. Our estimation ignores
|
| + // this case as the auto-placement algorithm will grow the grid as needed.
|
| + if (rowPositions)
|
| + maximumRowIndex = std::max(maximumRowIndex, rowPositions->finalPositionIndex + 1);
|
| + if (columnPositions)
|
| + maximumColumnIndex = std::max(maximumColumnIndex, columnPositions->finalPositionIndex + 1);
|
| + }
|
| +
|
| + m_grid.grow(maximumRowIndex);
|
| + for (size_t i = 0; i < m_grid.size(); ++i)
|
| + m_grid[i].grow(maximumColumnIndex);
|
| +
|
| + if (anyChildHasDefaultOrderValue) {
|
| + // Avoid growing the vector to the default capacity of 16 if we're only going to put one item in it.
|
| + if (orderValues.isEmpty())
|
| + orderValues.reserveInitialCapacity(1);
|
| + orderValues.append(0);
|
| + }
|
| +
|
| + m_orderIterator.setOrderValues(orderValues);
|
| +}
|
| +
|
| void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(Vector<RenderBox*> autoGridItems)
|
| {
|
| for (size_t i = 0; i < autoGridItems.size(); ++i) {
|
| @@ -973,6 +995,12 @@ LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const Vector<
|
| return offset;
|
| }
|
|
|
| +void RenderGrid::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
|
| +{
|
| + for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next())
|
| + paintChild(child, paintInfo, paintOffset);
|
| +}
|
| +
|
| const char* RenderGrid::renderName() const
|
| {
|
| if (isFloating())
|
|
|