Chromium Code Reviews| Index: Source/core/rendering/RenderObject.cpp |
| diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
| index 2772d053cb54e5454e14fc5d323de93a3ff39d7f..802f5b8ac6f043b7dbf2e1919dc07b022088903d 100644 |
| --- a/Source/core/rendering/RenderObject.cpp |
| +++ b/Source/core/rendering/RenderObject.cpp |
| @@ -1602,13 +1602,20 @@ const char* RenderObject::invalidationReasonToString(InvalidationReason reason) |
| void RenderObject::invalidateTreeIfNeeded(const PaintInvalidationState& paintInvalidationState) |
| { |
| + ASSERT(!needsLayout()); |
| + |
| // If we didn't need paint invalidation then our children don't need as well. |
| // Skip walking down the tree as everything should be fine below us. |
| if (!shouldCheckForPaintInvalidation(paintInvalidationState)) |
| return; |
| + invalidatePaintIfNeeded(paintInvalidationState, paintInvalidationState.paintInvalidationContainer()); |
| clearPaintInvalidationState(paintInvalidationState); |
| + invalidateSubtreesIfNeeded(paintInvalidationState); |
| +} |
| +void RenderObject::invalidateSubtreesIfNeeded(const PaintInvalidationState& paintInvalidationState) |
| +{ |
| for (RenderObject* child = slowFirstChild(); child; child = child->nextSibling()) { |
| if (!child->isOutOfFlowPositioned()) |
| child->invalidateTreeIfNeeded(paintInvalidationState); |
| @@ -1623,19 +1630,29 @@ static PassRefPtr<TraceEvent::ConvertableToTraceFormat> jsonObjectForOldAndNewRe |
| return value; |
| } |
| -InvalidationReason RenderObject::invalidatePaintIfNeeded(const RenderLayerModelObject& paintInvalidationContainer, const LayoutRect& oldBounds, const LayoutPoint& oldLocation, const PaintInvalidationState& paintInvalidationState) |
| +InvalidationReason RenderObject::invalidatePaintIfNeeded(const PaintInvalidationState& paintInvalidationState, const RenderLayerModelObject& paintInvalidationContainer) |
| { |
| RenderView* v = view(); |
| if (v->document().printing()) |
| return InvalidationNone; // Don't invalidate paints if we're printing. |
| - const LayoutRect& newBounds = previousPaintInvalidationRect(); |
| - const LayoutPoint& newLocation = previousPositionFromPaintInvalidationContainer(); |
| + const LayoutRect oldBounds = previousPaintInvalidationRect(); |
| + const LayoutPoint oldLocation = previousPositionFromPaintInvalidationContainer(); |
| + const LayoutRect newBounds = boundsRectForPaintInvalidation(&paintInvalidationContainer, &paintInvalidationState); |
| + const LayoutPoint newLocation = RenderLayer::positionFromPaintInvalidationContainer(this, &paintInvalidationContainer, &paintInvalidationState); |
| + setPreviousPaintInvalidationRect(newBounds); |
| + setPreviousPositionFromPaintInvalidationContainer(newLocation); |
| - // FIXME: PaintInvalidationState should not be required here, but the call to flipForWritingMode |
| - // in mapRectToPaintInvalidationBacking will give us the wrong results with it disabled. |
| + // FIXME: The call to flipForWritingMode in mapRectToPaintInvalidationBacking |
| + // will give us the wrong results without paintInvalidationState. |
| // crbug.com/393762 |
| - ASSERT(newBounds == boundsRectForPaintInvalidation(&paintInvalidationContainer, &paintInvalidationState)); |
| + // ASSERT(newBounds == boundsRectForPaintInvalidation(&newPaintInvalidationContainer, 0)); |
|
dsinclair
2014/09/03 14:14:47
Why did the ASSERT change? previously we passed th
Xianzhu
2014/09/03 17:11:15
Based on the FIXME, I think the original intent of
dsinclair
2014/09/03 17:44:29
Ah, yea, previously we weren't setting the bounds
|
| + |
| + // If we are set to do a full paint invalidation that means the RenderView will issue |
| + // paint invalidations. We can then skip issuing of paint invalidations for the child |
| + // renderers as they'll be covered by the RenderView. |
| + if (view()->doingFullPaintInvalidation()) |
| + return InvalidationNone; |
| TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "RenderObject::invalidatePaintIfNeeded()", |
| "object", this->debugName().ascii(), |