Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(520)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutObject.cpp

Issue 1809643008: Adding or changing any of box-shadow, outline, or border-image-outset does not need a layout.. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutObject.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index 051799571158e80164251832a3a2a3e5358c8d66..5b140a579dc9fd3338295218f7d4a30f0c64667e 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1923,10 +1923,16 @@ void LayoutObject::firstLineStyleDidChange(const ComputedStyle& oldStyle, const
setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange);
}
-void LayoutObject::markContainingBlocksForOverflowRecalc()
+void LayoutObject::markAncestorsForOverflowRecalcIfNeeded()
{
- for (LayoutBlock* container = containingBlock(); container && !container->childNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock())
- container->setChildNeedsOverflowRecalcAfterStyleChange();
+ LayoutObject* 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 LayoutObject::setNeedsOverflowRecalcAfterStyleChange()
@@ -1934,7 +1940,7 @@ void LayoutObject::setNeedsOverflowRecalcAfterStyleChange()
bool neededRecalc = needsOverflowRecalcAfterStyleChange();
setSelfNeedsOverflowRecalcAfterStyleChange();
if (!neededRecalc)
- markContainingBlocksForOverflowRecalc();
+ markAncestorsForOverflowRecalcIfNeeded();
}
void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style)
@@ -2004,6 +2010,13 @@ void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style)
container->setNeedsOverflowRecalcAfterStyleChange();
}
+ if (diff.visualOverflowChanged() && !needsLayout()) {
+ if (isLayoutBlock())
+ setNeedsOverflowRecalcAfterStyleChange();
+ else
+ setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange);
Xianzhu 2016/03/22 17:02:05 Nit: please add a TODO here and reference bug 4370
+ }
+
if (diff.needsPaintInvalidationLayer() || updatedDiff.needsPaintInvalidationLayer())
setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants();
else if (diff.needsPaintInvalidationObject() || updatedDiff.needsPaintInvalidationObject())
@@ -2104,7 +2117,7 @@ void LayoutObject::styleDidChange(StyleDifference diff, const ComputedStyle* old
// Ditto.
if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_style->position())
- markContainingBlocksForOverflowRecalc();
+ markAncestorsForOverflowRecalcIfNeeded();
setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange);
} else if (diff.needsPositionedMovementLayout()) {

Powered by Google App Engine
This is Rietveld 408576698