Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 837e189c51a5550da3f8eae5af4e09a4b2f776da..70913b9ac54d70e4c06eafc477380235f050e1d4 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -160,6 +160,69 @@ RenderGrid::~RenderGrid() |
{ |
} |
+void RenderGrid::addChild(RenderObject* newChild, RenderObject* beforeChild) |
+{ |
+ RenderBlock::addChild(newChild, beforeChild); |
+ |
+ if (gridIsDirty() || !newChild->isBox()) |
ojan
2013/07/30 23:18:57
Don't we force the children to be boxes? Can the s
Julien - ping for review
2013/07/30 23:57:42
Good catch, it seems to be the case.
|
+ return; |
+ |
+ RenderBox* newChildBox = toRenderBox(newChild); |
+ OwnPtr<GridSpan> rowPositions = resolveGridPositionsFromStyle(newChildBox, ForRows); |
+ OwnPtr<GridSpan> columnPositions = resolveGridPositionsFromStyle(newChildBox, ForColumns); |
+ if (!rowPositions || !columnPositions) { |
+ // The new child requires the auto-placement algorithm to run so we need to recompute the grid fully. |
+ dirtyGrid(); |
+ } else { |
+ if (gridRowCount() <= rowPositions->finalPositionIndex || gridColumnCount() <= columnPositions->finalPositionIndex) { |
+ // FIXME: We could just insert the new child provided we had a primitive to arbitrarily grow the grid. |
+ dirtyGrid(); |
+ } else { |
+ insertItemIntoGrid(newChildBox, GridCoordinate(*rowPositions, *columnPositions)); |
+ } |
+ } |
+} |
+ |
+void RenderGrid::removeChild(RenderObject* child) |
+{ |
+ RenderBlock::removeChild(child); |
+ |
+ if (gridIsDirty() || !child->isBox()) |
ojan
2013/07/30 23:18:57
Ditto.
|
+ return; |
+ |
+ // FIXME: We could avoid dirtying the grid in some cases (e.g. if it's an explicitly positioned element). |
+ dirtyGrid(); |
+} |
+ |
+void RenderGrid::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) |
+{ |
+ RenderBlock::styleDidChange(diff, oldStyle); |
+ if (!oldStyle) |
+ return; |
+ |
+ // FIXME: The following checks could be narrowed down if we kept track of which type of grid items we have: |
+ // - explicit grid size changes impact negative explicitely positioned and auto-placed grid items. |
+ // - named grid lines only impact grid items with named grid lines. |
+ // - auto-flow changes only impacts auto-placed children. |
+ |
+ if (explicitGridDidResize(oldStyle) |
+ || namedGridLinesDefinitionDidChange(oldStyle) |
+ || oldStyle->gridAutoFlow() != style()->gridAutoFlow()) |
+ dirtyGrid(); |
+} |
+ |
+bool RenderGrid::explicitGridDidResize(const RenderStyle* oldStyle) const |
+{ |
+ return oldStyle->gridDefinitionColumns().size() != style()->gridDefinitionColumns().size() |
+ || oldStyle->gridDefinitionRows().size() != style()->gridDefinitionRows().size(); |
+} |
+ |
+bool RenderGrid::namedGridLinesDefinitionDidChange(const RenderStyle* oldStyle) const |
+{ |
+ return oldStyle->namedGridRowLines() != style()->namedGridRowLines() |
+ || oldStyle->namedGridColumnLines() != style()->namedGridColumnLines(); |
+} |
+ |
void RenderGrid::layoutBlock(bool relayoutChildren, LayoutUnit) |
{ |
ASSERT(needsLayout()); |
@@ -229,8 +292,6 @@ void RenderGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo |
// FIXME: This should add in the scrollbarWidth (e.g. see RenderFlexibleBox). |
} |
- |
- const_cast<RenderGrid*>(this)->clearGrid(); |
} |
void RenderGrid::computePreferredLogicalWidths() |
@@ -621,7 +682,9 @@ void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t co |
void RenderGrid::placeItemsOnGrid() |
{ |
- ASSERT(!gridWasPopulated()); |
+ if (!gridIsDirty()) |
+ return; |
+ |
ASSERT(m_gridItemCoordinate.isEmpty()); |
populateExplicitGridAndOrderIterator(); |
@@ -753,8 +816,10 @@ RenderGrid::TrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() c |
return (flow == AutoFlowColumn) ? ForRows : ForColumns; |
} |
-void RenderGrid::clearGrid() |
+void RenderGrid::dirtyGrid() |
{ |
+ // An empty grid is a dirty grid as we always one item (so that gridColumnCount() can return an answer) but we |
+ // could hold onto the memory to avoid massive free / malloc cycles if we stored the information differently. |
ojan
2013/07/30 23:18:57
A simple way to do this would be to resize(0) here
Julien - ping for review
2013/07/30 23:57:42
Yup, I didn't want to piggyback on this change - e
ojan
2013/07/31 00:13:18
Normally I'm violently against premature optimizat
|
m_grid.clear(); |
m_gridItemCoordinate.clear(); |
} |
@@ -811,7 +876,6 @@ void RenderGrid::layoutGridItems() |
// FIXME: We should handle min / max logical height. |
setLogicalHeight(logicalHeight() + borderAndPaddingLogicalHeight()); |
- clearGrid(); |
} |
GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox* gridItem) const |