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 dd976b77bff4aa2411b104588939d6ac91b35734..a64be041d6dba1cd0c8b6d66435760978b5e1021 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
@@ -3391,6 +3391,18 @@ void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(con |
traverseNonCompositingDescendants(const_cast<LayoutObject&>(object), Functor(paintInvalidationContainer)); |
} |
+void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason reason) const |
+{ |
+ // These disablers are valid because we want to use the current compositing/invalidation status. |
+ DisablePaintInvalidationStateAsserts invalidationDisabler; |
+ DisableCompositingQueryAsserts compositingDisabler; |
+ |
+ LayoutRect invalidationRect = previousPaintInvalidationRect(); |
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer); |
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationLayer); |
+ invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLayer, invalidationRect, invalidationRect); |
+} |
+ |
void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() |
{ |
class Functor : public LayoutObjectTraversalFunctor { |
@@ -3398,10 +3410,8 @@ void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() |
explicit Functor(const LayoutBoxModelObject& paintInvalidationContainer) : m_paintInvalidationContainer(paintInvalidationContainer) { } |
void operator()(LayoutObject& object) const override |
{ |
- LayoutRect invalidationRect = object.previousPaintInvalidationRect(); |
- object.adjustInvalidationRectForCompositedScrolling(invalidationRect, m_paintInvalidationContainer); |
- object.invalidatePaintUsingContainer(m_paintInvalidationContainer, invalidationRect, PaintInvalidationLayer); |
- object.invalidateDisplayItemClients(m_paintInvalidationContainer, PaintInvalidationLayer, invalidationRect, invalidationRect); |
+ object.invalidatePaintOfPreviousPaintInvalidationRect(m_paintInvalidationContainer, PaintInvalidationLayer); |
+ object.setPreviousPaintInvalidationRect(LayoutRect()); |
} |
private: |
const LayoutBoxModelObject& m_paintInvalidationContainer; |
@@ -3428,6 +3438,16 @@ void LayoutObject::setShouldDoFullPaintInvalidationIncludingNonCompositingDescen |
traverseNonCompositingDescendants(*this, Functor()); |
} |
+void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendants(const LayoutBoxModelObject& paintInvalidationContainer) |
+{ |
+ invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationContainer, PaintInvalidationLayer); |
+ setPreviousPaintInvalidationRect(LayoutRect()); |
+ for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibling()) { |
+ if (!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSelfPaintingLayer()) |
+ child->invalidatePaintIncludingNonSelfPaintingLayerDescendants(paintInvalidationContainer); |
+ } |
+} |
+ |
void LayoutObject::setIsSlowRepaintObject(bool isSlowRepaintObject) |
{ |
ASSERT(frameView()); |