Chromium Code Reviews| Index: Source/core/rendering/RenderObject.cpp |
| diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
| index d28180312373d34ffbdc76048d1316c00e21348b..483f9db7ceadb5bed6715b15e7d64b491c8d6bb4 100644 |
| --- a/Source/core/rendering/RenderObject.cpp |
| +++ b/Source/core/rendering/RenderObject.cpp |
| @@ -130,6 +130,7 @@ struct SameSizeAsRenderObject { |
| unsigned m_bitfields; |
| unsigned m_bitfields2; |
| LayoutRect rect; // Stores the previous paint invalidation rect. |
| + LayoutRect rect2; // Stores the previous selection paint invalidation rect. |
|
dsinclair
2014/10/31 14:03:15
Would something like the following be better?
Lay
|
| LayoutPoint position; // Stores the previous position from the paint invalidation container. |
| }; |
| @@ -1246,11 +1247,16 @@ void RenderObject::invalidateSelectionIfNeeded(const RenderLayerModelObject& pai |
| if (!shouldInvalidateSelection()) |
| return; |
| - LayoutRect selection = selectionRectForPaintInvalidation(&paintInvalidationContainer); |
| - // FIXME: groupedMapping() leaks the squashing abstraction. See RenderBlockSelectionInfo for more details. |
| + LayoutRect oldSelectionRect = m_previousSelectionRectForPaintInvalidation; |
| + m_previousSelectionRectForPaintInvalidation = selectionRectForPaintInvalidation(&paintInvalidationContainer); |
| + // FIXME: groupedMapping() leaks the squashing abstraction. |
| if (paintInvalidationContainer.layer()->groupedMapping()) |
| - RenderLayer::mapRectToPaintBackingCoordinates(&paintInvalidationContainer, selection); |
| - invalidatePaintUsingContainer(&paintInvalidationContainer, selection, PaintInvalidationSelection); |
| + RenderLayer::mapRectToPaintBackingCoordinates(&paintInvalidationContainer, m_previousSelectionRectForPaintInvalidation); |
| + |
| + if (view()->doingFullPaintInvalidation()) |
| + return; |
| + |
| + fullyInvalidatePaint(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, m_previousSelectionRectForPaintInvalidation); |
| } |
| PaintInvalidationReason RenderObject::invalidatePaintIfNeeded(const PaintInvalidationState& paintInvalidationState, const RenderLayerModelObject& paintInvalidationContainer) |
| @@ -1266,6 +1272,10 @@ PaintInvalidationReason RenderObject::invalidatePaintIfNeeded(const PaintInvalid |
| setPreviousPaintInvalidationRect(newBounds); |
| setPreviousPositionFromPaintInvalidationBacking(newLocation); |
| + // We need to invalidate the selection before checking for whether we are doing a full invalidation. |
| + // This is because we need to update the old rect regardless. |
| + invalidateSelectionIfNeeded(paintInvalidationContainer); |
|
dsinclair
2014/10/31 14:03:16
We need to update the rect regardless, but we don'
Julien - ping for review
2014/10/31 22:31:03
It was easy to do, added it.
|
| + |
| PaintInvalidationReason invalidationReason = paintInvalidationReason(paintInvalidationContainer, oldBounds, oldLocation, newBounds, newLocation); |
| // If we are set to do a full paint invalidation that means the RenderView will issue |
| @@ -1278,8 +1288,6 @@ PaintInvalidationReason RenderObject::invalidatePaintIfNeeded(const PaintInvalid |
| "object", this->debugName().ascii(), |
| "info", jsonObjectForOldAndNewRects(oldBounds, oldLocation, newBounds, newLocation)); |
| - invalidateSelectionIfNeeded(paintInvalidationContainer); |
| - |
| if (invalidationReason == PaintInvalidationNone) |
| return invalidationReason; |