Index: Source/core/rendering/RenderObject.cpp |
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
index 08e7f98c7b92d03ddaedd99509ed728dd66377de..bd532dd490c95a707a2173a3ec4ff6846ec54483 100644 |
--- a/Source/core/rendering/RenderObject.cpp |
+++ b/Source/core/rendering/RenderObject.cpp |
@@ -101,13 +101,6 @@ namespace { |
static bool gModifyRenderTreeStructureAnyState = false; |
-typedef WillBeHeapHashSet<RawPtrWillBeWeakMember<const RenderObject> > RenderObjectWeakSet; |
-RenderObjectWeakSet& renderObjectNeverHadPaintInvalidationSet() |
-{ |
- DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<RenderObjectWeakSet>, set, (adoptPtrWillBeNoop(new RenderObjectWeakSet()))); |
- return *set; |
-} |
- |
} // namespace |
using namespace HTMLNames; |
@@ -242,9 +235,6 @@ RenderObject::RenderObject(Node* node) |
#endif |
, m_bitfields(node) |
{ |
- if (firstPaintInvalidationTrackingEnabled()) |
- renderObjectNeverHadPaintInvalidationSet().add(this); |
- |
#ifndef NDEBUG |
renderObjectCounter.increment(); |
#endif |
@@ -253,9 +243,6 @@ RenderObject::RenderObject(Node* node) |
RenderObject::~RenderObject() |
{ |
- if (firstPaintInvalidationTrackingEnabled()) |
- renderObjectNeverHadPaintInvalidationSet().remove(this); |
- |
ASSERT(!m_hasAXObject); |
#if ENABLE(OILPAN) |
ASSERT(m_didCallDestroy); |
@@ -1088,20 +1075,6 @@ void RenderObject::paint(PaintInfo&, const LayoutPoint&) |
{ |
} |
-void RenderObject::setHadPaintInvalidation() |
-{ |
- if (firstPaintInvalidationTrackingEnabled()) |
- renderObjectNeverHadPaintInvalidationSet().remove(this); |
-} |
- |
-bool RenderObject::hadPaintInvalidation() const |
-{ |
- if (!firstPaintInvalidationTrackingEnabled()) |
- return true; |
- |
- return !renderObjectNeverHadPaintInvalidationSet().contains(this); |
-} |
- |
const RenderLayerModelObject* RenderObject::containerForPaintInvalidation() const |
{ |
RELEASE_ASSERT(isRooted()); |
@@ -1199,13 +1172,13 @@ void RenderObject::invalidatePaintUsingContainer(const RenderLayerModelObject* p |
} |
if (paintInvalidationContainer->isRenderView()) { |
- toRenderView(paintInvalidationContainer)->invalidatePaintForRectangle(r); |
+ toRenderView(paintInvalidationContainer)->invalidatePaintForRectangle(r, invalidationReason); |
return; |
} |
if (paintInvalidationContainer->view()->usesCompositing()) { |
ASSERT(paintInvalidationContainer->isPaintInvalidationContainer()); |
- paintInvalidationContainer->setBackingNeedsPaintInvalidationInRect(r); |
+ paintInvalidationContainer->setBackingNeedsPaintInvalidationInRect(r, invalidationReason); |
} |
} |
@@ -1262,6 +1235,8 @@ const char* RenderObject::invalidationReasonToString(InvalidationReason reason) |
return "selection"; |
case InvalidationLayer: |
return "layer"; |
+ case InvalidationRendererInsertion: |
+ return "renderer insertion"; |
case InvalidationRendererRemoval: |
return "renderer removal"; |
case InvalidationPaintRectangle: |
@@ -1344,7 +1319,7 @@ InvalidationReason RenderObject::getPaintInvalidationReason(const RenderLayerMod |
const LayoutRect& oldBounds, const LayoutPoint& oldPositionFromPaintInvalidationBacking, const LayoutRect& newBounds, const LayoutPoint& newPositionFromPaintInvalidationBacking) |
{ |
if (shouldDoFullPaintInvalidation()) |
- return InvalidationFull; |
+ return m_bitfields.fullPaintInvalidationReason(); |
// Presumably a background or a border exists if border-fit:lines was specified. |
if (style()->borderFit() == BorderFitLines) |
@@ -3098,16 +3073,28 @@ bool RenderObject::isRelayoutBoundaryForInspector() const |
void RenderObject::setShouldDoFullPaintInvalidation(bool b, MarkingBehavior markBehavior) |
{ |
+ if (b) |
+ setShouldDoFullPaintInvalidationWithReason(InvalidationFull, markBehavior); |
+ else |
+ m_bitfields.setFullPaintInvalidationReason(InvalidationNone); |
+} |
+ |
+void RenderObject::setShouldDoFullPaintInvalidationWithReason(InvalidationReason reason, MarkingBehavior markBehavior) |
+{ |
+ // Only full invalidation reasons are allowed. |
+ ASSERT(reason != InvalidationNone && reason != InvalidationIncremental); |
+ |
// RenderText objects don't know how to invalidate paint for themselves, since they don't know how to compute their bounds. |
// Instead the parent fully invalidate when any text needs full paint invalidation. |
if (isText()) { |
- parent()->setShouldDoFullPaintInvalidation(b, markBehavior); |
+ parent()->setShouldDoFullPaintInvalidationWithReason(reason, markBehavior); |
return; |
} |
- m_bitfields.setShouldDoFullPaintInvalidation(b); |
+ if (m_bitfields.fullPaintInvalidationReason() == InvalidationNone) |
+ m_bitfields.setFullPaintInvalidationReason(reason); |
- if (markBehavior == MarkContainingBlockChain && b) { |
+ if (markBehavior == MarkContainingBlockChain) { |
ASSERT(document().lifecycle().state() != DocumentLifecycle::InPaintInvalidation); |
frame()->page()->animator().scheduleVisualUpdate(); // In case that this is called not during FrameView::updateLayoutAndStyleForPainting(). |
markContainingBlockChainForPaintInvalidation(); |