| 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 33ebe5d70e5514d82cfa6dbdc943c3469146d4cd..dfd8b14c5d93be04c7742c69b63332d441a764c6 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
|
| @@ -1192,11 +1192,8 @@ static void invalidatePaintRectangleOnWindow(const LayoutBoxModelObject& paintIn
|
| window->invalidateRect(frameView->contentsToRootFrame(paintRect));
|
| }
|
|
|
| -void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& dirtyRect, PaintInvalidationReason invalidationReason) const
|
| +void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& dirtyRect, PaintInvalidationReason invalidationReason, Vector<LayoutRect>& paintInvalidationRects) const
|
| {
|
| - if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled())
|
| - return;
|
| -
|
| if (paintInvalidationContainer.frameView()->shouldThrottleRendering())
|
| return;
|
|
|
| @@ -1207,6 +1204,11 @@ void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& pai
|
|
|
| RELEASE_ASSERT(isRooted());
|
|
|
| + if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) {
|
| + paintInvalidationRects.append(dirtyRect);
|
| + return;
|
| + }
|
| +
|
| // FIXME: Unify "devtools.timeline.invalidationTracking" and "blink.invalidation". crbug.com/413527.
|
| TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking"),
|
| "PaintInvalidationTracking",
|
| @@ -1231,18 +1233,17 @@ void LayoutObject::invalidateDisplayItemClient(const DisplayItemClientWrapper& d
|
| 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;
|
| - // Only the object needs to be invalidated, so use an empty invalidation rect.
|
| - LayoutRect invalidationRect;
|
| + // Only the objects need to be invalidated, not any paint rectangles.
|
| if (const PaintLayer* paintInvalidationLayer = enclosingLayer->enclosingLayerForPaintInvalidationCrossingFrameBoundaries())
|
| - paintInvalidationLayer->layoutObject()->invalidateDisplayItemClientOnBacking(displayItemClient, PaintInvalidationFull, invalidationRect, invalidationRect);
|
| + paintInvalidationLayer->layoutObject()->invalidateDisplayItemClientOnBacking(displayItemClient, PaintInvalidationFull, Vector<LayoutRect>());
|
|
|
| enclosingLayer->setNeedsRepaint();
|
| }
|
| }
|
|
|
| -void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& previousPaintInvalidationRect, const LayoutRect& newPaintInvalidationRect) const
|
| +void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const Vector<LayoutRect>& paintInvalidationRects) const
|
| {
|
| - paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this, invalidationReason, previousPaintInvalidationRect, newPaintInvalidationRect);
|
| + paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this, invalidationReason, paintInvalidationRects);
|
|
|
| if (PaintLayer* enclosingLayer = this->enclosingLayer())
|
| enclosingLayer->setNeedsRepaint();
|
| @@ -1255,35 +1256,25 @@ LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObje
|
| return PaintLayer::computePaintInvalidationRect(this, paintInvalidationContainer->layer(), paintInvalidationState);
|
| }
|
|
|
| -const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(LayoutRect& dirtyRect) const
|
| +void LayoutObject::invalidatePaintRectangleForDisplayItemClient(const DisplayItemClientWrapper& displayItemClient, const LayoutRect& dirtyRect) const
|
| {
|
| RELEASE_ASSERT(isRooted());
|
|
|
| if (dirtyRect.isEmpty())
|
| - return nullptr;
|
| + return;
|
|
|
| if (view()->document().printing())
|
| - return nullptr; // Don't invalidate paints if we're printing.
|
| + return; // Don't invalidate paints if we're printing.
|
|
|
| const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintInvalidationOnRootedTree();
|
| - PaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalidationContainer, dirtyRect);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, dirtyRect, PaintInvalidationRectangle);
|
| - return &paintInvalidationContainer;
|
| -}
|
| -
|
| -void LayoutObject::invalidatePaintRectangle(const LayoutRect& rect) const
|
| -{
|
| - LayoutRect dirtyRect(rect);
|
| - const LayoutBoxModelObject* paintInvalidationContainer = invalidatePaintRectangleInternal(dirtyRect);
|
| - if (paintInvalidationContainer) {
|
| - invalidateDisplayItemClients(*paintInvalidationContainer, PaintInvalidationRectangle, dirtyRect, dirtyRect);
|
| - }
|
| -}
|
| + LayoutRect rect(dirtyRect);
|
| + PaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalidationContainer, rect);
|
| + Vector<LayoutRect> paintInvalidationRects;
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, rect, PaintInvalidationRectangle, paintInvalidationRects);
|
| + paintInvalidationContainer.invalidateDisplayItemClientOnBacking(displayItemClient, PaintInvalidationRectangle, paintInvalidationRects);
|
|
|
| -void LayoutObject::invalidatePaintRectangleNotInvalidatingDisplayItemClients(const LayoutRect& r) const
|
| -{
|
| - LayoutRect dirtyRect(r);
|
| - invalidatePaintRectangleInternal(dirtyRect);
|
| + if (PaintLayer* enclosingLayer = this->enclosingLayer())
|
| + enclosingLayer->setNeedsRepaint();
|
| }
|
|
|
| void LayoutObject::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidationState)
|
| @@ -1370,13 +1361,12 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
|
|
|
| setPreviousSelectionRectForPaintInvalidation(newSelectionRect);
|
|
|
| - if (shouldInvalidateSelection())
|
| - invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, newSelectionRect);
|
| -
|
| - if (fullInvalidation)
|
| - return;
|
| + Vector<LayoutRect> paintInvalidationRects;
|
| + if (!fullInvalidation)
|
| + fullyInvalidatePaint(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, newSelectionRect, paintInvalidationRects);
|
|
|
| - fullyInvalidatePaint(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, newSelectionRect);
|
| + if (shouldInvalidateSelection())
|
| + invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationSelection, paintInvalidationRects);
|
| }
|
|
|
| PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(PaintInvalidationState& paintInvalidationState, const LayoutBoxModelObject& paintInvalidationContainer)
|
| @@ -1429,19 +1419,18 @@ PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(PaintInvalidationS
|
| // invalidation is issued. See crbug.com/508383 and crbug.com/515977.
|
| // This is a workaround to force display items to update paint offset.
|
| if (!RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled() && paintInvalidationState.forcedSubtreeInvalidationWithinContainer())
|
| - invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, oldBounds, newBounds);
|
| + invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, Vector<LayoutRect>());
|
|
|
| return invalidationReason;
|
| }
|
|
|
| - invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, oldBounds, newBounds);
|
| -
|
| - if (invalidationReason == PaintInvalidationIncremental) {
|
| - incrementallyInvalidatePaint(paintInvalidationContainer, oldBounds, newBounds, newLocation);
|
| - return invalidationReason;
|
| - }
|
| + Vector<LayoutRect> paintInvalidationRects;
|
| + if (invalidationReason == PaintInvalidationIncremental)
|
| + incrementallyInvalidatePaint(paintInvalidationContainer, oldBounds, newBounds, newLocation, paintInvalidationRects);
|
| + else
|
| + fullyInvalidatePaint(paintInvalidationContainer, invalidationReason, oldBounds, newBounds, paintInvalidationRects);
|
|
|
| - fullyInvalidatePaint(paintInvalidationContainer, invalidationReason, oldBounds, newBounds);
|
| + invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, paintInvalidationRects);
|
|
|
| return invalidationReason;
|
| }
|
| @@ -1540,7 +1529,7 @@ void LayoutObject::adjustPreviousPaintInvalidationForScrollIfNeeded(const Double
|
| m_previousPaintInvalidationRect.move(LayoutSize(scrollDelta));
|
| }
|
|
|
| -void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds, const LayoutPoint& positionFromPaintInvalidationBacking)
|
| +void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds, const LayoutPoint& positionFromPaintInvalidationBacking, Vector<LayoutRect>& paintInvalidationRects)
|
| {
|
| ASSERT(oldBounds.location() == newBounds.location());
|
|
|
| @@ -1548,35 +1537,35 @@ void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& pain
|
| if (deltaRight > 0) {
|
| LayoutRect invalidationRect(oldBounds.maxX(), newBounds.y(), deltaRight, newBounds.height());
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
|
| } else if (deltaRight < 0) {
|
| LayoutRect invalidationRect(newBounds.maxX(), oldBounds.y(), -deltaRight, oldBounds.height());
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
|
| }
|
|
|
| LayoutUnit deltaBottom = newBounds.maxY() - oldBounds.maxY();
|
| if (deltaBottom > 0) {
|
| LayoutRect invalidationRect(newBounds.x(), oldBounds.maxY(), newBounds.width(), deltaBottom);
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
|
| } else if (deltaBottom < 0) {
|
| LayoutRect invalidationRect(oldBounds.x(), newBounds.maxY(), oldBounds.width(), -deltaBottom);
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
|
| }
|
| }
|
|
|
| -void LayoutObject::fullyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& oldBounds, const LayoutRect& newBounds)
|
| +void LayoutObject::fullyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& oldBounds, const LayoutRect& newBounds, Vector<LayoutRect>& paintInvalidationRects)
|
| {
|
| // Otherwise do full paint invalidation.
|
| LayoutRect invalidationRect = oldBounds;
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason);
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason, paintInvalidationRects);
|
| if (newBounds != oldBounds) {
|
| invalidationRect = newBounds;
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason);
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason, paintInvalidationRects);
|
| }
|
| }
|
|
|
| @@ -3380,8 +3369,7 @@ void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(con
|
| void operator()(LayoutObject& object) const override
|
| {
|
| // Only the objects need to be invalidated, not any paint rectangles.
|
| - LayoutRect invalidationRect;
|
| - object.invalidateDisplayItemClients(m_paintInvalidationContainer, PaintInvalidationFull, invalidationRect, invalidationRect);
|
| + object.invalidateDisplayItemClients(m_paintInvalidationContainer, PaintInvalidationFull, Vector<LayoutRect>());
|
| }
|
| private:
|
| const LayoutBoxModelObject& m_paintInvalidationContainer;
|
| @@ -3399,8 +3387,9 @@ void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBo
|
|
|
| LayoutRect invalidationRect = previousPaintInvalidationRect();
|
| adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
|
| - invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationLayer);
|
| - invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLayer, invalidationRect, invalidationRect);
|
| + Vector<LayoutRect> paintInvalidationRects;
|
| + invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationLayer, paintInvalidationRects);
|
| + invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLayer, paintInvalidationRects);
|
| }
|
|
|
| void LayoutObject::invalidatePaintIncludingNonCompositingDescendants()
|
|
|