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

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

Issue 1584493002: Skip PaintPhaseDescendantOutlinesOnly if no descendent outlines in the layer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix multicol span issue Created 4 years, 11 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 3d88ac662d5321f3474c7c3bde5c182c35968670..da8a35d820792d74791eac15311111e869bc9b5b 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1231,8 +1231,6 @@ void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& pai
void LayoutObject::invalidateDisplayItemClient(const DisplayItemClient& displayItemClient) const
{
- // TODO(wangxianzhu): Ensure correct bounds for the client will be or has been passed to PaintController. crbug.com/547119.
- // Not using enclosingCompositedContainer() directly because this object may be in an orphaned subtree.
if (PaintLayer* enclosingLayer = this->enclosingLayer()) {
// This is valid because we want to invalidate the client in the display item list of the current backing.
DisableCompositingQueryAsserts disabler;
@@ -1242,19 +1240,38 @@ void LayoutObject::invalidateDisplayItemClient(const DisplayItemClient& displayI
}
}
+#if ENABLE(ASSERT)
+static void assertEnclosingSelfPaintingLayerHasSetNeedsRepaint(const LayoutObject& layoutObject)
+{
+ PaintLayer* enclosingSelfPaintingLayer = nullptr;
+ const LayoutObject* curr = &layoutObject;
+ while (curr) {
+ if (curr->hasLayer() && toLayoutBoxModelObject(curr)->hasSelfPaintingLayer()) {
+ enclosingSelfPaintingLayer = toLayoutBoxModelObject(curr)->layer();
+ break;
+ }
+ // If the object has spannerPlaceholder(), it is a multicol spanner which is painted by
+ // the layer of the placeholder instead of its own enclosing layer.
+ curr = curr->spannerPlaceholder() ? curr->spannerPlaceholder() : curr->parent();
+ }
+ ASSERT(!enclosingSelfPaintingLayer || enclosingSelfPaintingLayer->needsRepaint());
+}
+#endif
+
void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason) const
{
- // It's caller's responsibility to ensure enclosingLayer's needsRepaint is set.
- // Don't set the flag here because enclosingLayer() has cost and the caller can use
- // various ways (e.g. PaintInvalidatinState::enclosingLayer()) to reduce the cost.
- ASSERT(!enclosingLayer() || enclosingLayer()->needsRepaint());
+ // It's caller's responsibility to ensure enclosingSelfPaintingLayer's needsRepaint is set.
+ // Don't set the flag here because getting enclosingSelfPaintLayer has cost and the caller can use
+ // various ways (e.g. PaintInvalidatinState::enclosingSelfPaintingLayer()) to reduce the cost.
+#if ENABLE(ASSERT)
+ assertEnclosingSelfPaintingLayerHasSetNeedsRepaint(*this);
+#endif
paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this, invalidationReason);
}
void LayoutObject::invalidateDisplayItemClientsWithPaintInvalidationState(const LayoutBoxModelObject& paintInvalidationContainer, const PaintInvalidationState& paintInvalidationState, PaintInvalidationReason invalidationReason) const
{
- ASSERT(&paintInvalidationState.enclosingLayer(*this) == enclosingLayer());
- paintInvalidationState.enclosingLayer(*this).setNeedsRepaint();
+ paintInvalidationState.enclosingSelfPaintingLayer(*this).setNeedsRepaint();
invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason);
}
@@ -1389,6 +1406,12 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(PaintInvalidationState& paintInvalidationState, const LayoutBoxModelObject& paintInvalidationContainer)
{
+ if (styleRef().hasOutline()) {
+ PaintLayer& layer = paintInvalidationState.enclosingSelfPaintingLayer(*this);
+ if (layer.layoutObject() != this)
+ layer.setNeedsPaintPhaseDescendantOutlines();
+ }
+
LayoutView* v = view();
if (v->document().printing())
return PaintInvalidationNone; // Don't invalidate paints if we're printing.
@@ -3418,10 +3441,12 @@ void LayoutObject::invalidateDisplayItemClientsIncludingNonCompositingDescendant
void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason reason)
{
- // It's caller's responsibility to ensure enclosingLayer's needsRepaint is set.
- // Don't set the flag here because enclosingLayer() has cost and the caller can use
- // various ways (e.g. PaintInvalidatinState::enclosingLayer()) to reduce the cost.
- ASSERT(!enclosingLayer() || enclosingLayer()->needsRepaint());
+ // It's caller's responsibility to ensure enclosingSelfPaintingLayer's needsRepaint is set.
+ // Don't set the flag here because getting enclosingSelfPaintLayer has cost and the caller can use
+ // various ways (e.g. PaintInvalidatinState::enclosingSelfPaintingLayer()) to reduce the cost.
+#if ENABLE(ASSERT)
+ assertEnclosingSelfPaintingLayerHasSetNeedsRepaint(*this);
+#endif
// These disablers are valid because we want to use the current compositing/invalidation status.
DisablePaintInvalidationStateAsserts invalidationDisabler;

Powered by Google App Engine
This is Rietveld 408576698