Index: Source/core/rendering/RenderObject.cpp |
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
index 7fe52ad6553079b126b51b7bbf886f22080b3fc0..dd9ce9d256ee91bc859c4f8ac5217a7c55b76329 100644 |
--- a/Source/core/rendering/RenderObject.cpp |
+++ b/Source/core/rendering/RenderObject.cpp |
@@ -1596,18 +1596,25 @@ void RenderObject::setPseudoStyle(PassRefPtr<RenderStyle> pseudoStyle) |
setStyle(pseudoStyle); |
} |
-void RenderObject::markContainingBlocksForOverflowRecalc() |
+// FIXME: This will be markContainingBoxesForOverflowRecalc() when we make RenderBoxes recomputeOverflow-capable. crbug.com/437012. |
+void RenderObject::markAncestorsForOverflowRecalcIfNeeded() |
{ |
- for (RenderBlock* container = containingBlock(); container && !container->childNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock()) |
- container->setChildNeedsOverflowRecalcAfterStyleChange(true); |
+ RenderObject* object = this; |
+ do { |
+ // Cell and row need to propagate the flag to their containing section and row as their containing block is the table wrapper. |
+ // This enables us to only recompute overflow the modified sections / rows. |
+ object = object->isTableCell() || object->isTableRow() ? object->parent() : object->containingBlock(); |
+ if (object) |
+ object->setChildNeedsOverflowRecalcAfterStyleChange(); |
+ } while (object); |
} |
void RenderObject::setNeedsOverflowRecalcAfterStyleChange() |
{ |
bool neededRecalc = needsOverflowRecalcAfterStyleChange(); |
- setSelfNeedsOverflowRecalcAfterStyleChange(true); |
+ setSelfNeedsOverflowRecalcAfterStyleChange(); |
if (!neededRecalc) |
- markContainingBlocksForOverflowRecalc(); |
+ markAncestorsForOverflowRecalcIfNeeded(); |
} |
void RenderObject::setStyle(PassRefPtr<RenderStyle> style) |
@@ -1809,7 +1816,7 @@ void RenderObject::styleDidChange(StyleDifference diff, const RenderStyle* oldSt |
// Ditto. |
if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_style->position()) |
- markContainingBlocksForOverflowRecalc(); |
+ markAncestorsForOverflowRecalcIfNeeded(); |
if (diff.needsFullLayout()) |
setNeedsLayoutAndPrefWidthsRecalc(); |