| Index: third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| index a1625c3af3e9e00c5a9f149d6868482d0e95d497..64fee79dc7be81d06b44ab4616e5098999747cc2 100644
|
| --- a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
|
| @@ -32,13 +32,13 @@ void BoxPaintInvalidator::boxWillBeDestroyed(const LayoutBox& box)
|
| previousBoxSizesMap().remove(&box);
|
| }
|
|
|
| -// This is called when ObjectPaintInvalidator already did incremental invalidation,
|
| -// so this function just does what is additionally needed for the LayoutBox.
|
| -void BoxPaintInvalidator::incrementallyInvalidatePaint()
|
| +bool BoxPaintInvalidator::incrementallyInvalidatePaint()
|
| {
|
| + bool result = ObjectPaintInvalidator(m_box, m_context).incrementallyInvalidatePaint();
|
| +
|
| bool hasBoxDecorations = m_box.styleRef().hasBoxDecorations();
|
| if (!m_box.styleRef().hasBackground() && !hasBoxDecorations)
|
| - return;
|
| + return result;
|
|
|
| const LayoutRect& oldBounds = m_context.oldBounds;
|
| const LayoutRect& newBounds = m_context.newBounds;
|
| @@ -46,9 +46,9 @@ void BoxPaintInvalidator::incrementallyInvalidatePaint()
|
| LayoutSize oldBorderBoxSize = computePreviousBorderBoxSize(oldBounds.size());
|
| LayoutSize newBorderBoxSize = m_box.size();
|
|
|
| - // If border m_box size didn't change, LayoutObject's incrementallyInvalidatePaint() is good.
|
| + // If border m_box size didn't change, ObjectPaintInvalidator::incrementallyInvalidatePaint() is good.
|
| if (oldBorderBoxSize == newBorderBoxSize)
|
| - return;
|
| + return result;
|
|
|
| // If size of the paint invalidation rect equals to size of border box, ObjectPaintInvalidator::incrementallyInvalidatePaint()
|
| // is good for boxes having background without box decorations.
|
| @@ -57,7 +57,7 @@ void BoxPaintInvalidator::incrementallyInvalidatePaint()
|
| && m_context.newLocation == newBounds.location()
|
| && oldBorderBoxSize == oldBounds.size()
|
| && newBorderBoxSize == newBounds.size())
|
| - return;
|
| + return result;
|
|
|
| // Invalidate the right delta part and the right border of the old or new m_box which has smaller width.
|
| if (LayoutUnit deltaWidth = (oldBorderBoxSize.width() - newBorderBoxSize.width()).abs()) {
|
| @@ -80,6 +80,8 @@ void BoxPaintInvalidator::incrementallyInvalidatePaint()
|
| std::max(oldBorderBoxSize.width(), newBorderBoxSize.width()), deltaHeight + borderHeight);
|
| invalidatePaintRectClippedByOldAndNewBounds(bottomDeltaRect);
|
| }
|
| +
|
| + return true;
|
| }
|
|
|
| void BoxPaintInvalidator::invalidatePaintRectClippedByOldAndNewBounds(const LayoutRect& rect)
|
| @@ -105,7 +107,7 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason()
|
| {
|
| PaintInvalidationReason reason = ObjectPaintInvalidator(m_box, m_context).computePaintInvalidationReason();
|
|
|
| - if (reason != PaintInvalidationDelayedFull && isFullPaintInvalidationReason(reason))
|
| + if (isImmediateFullPaintInvalidationReason(reason) || reason == PaintInvalidationNone)
|
| return reason;
|
|
|
| if (m_box.mayNeedPaintInvalidationAnimatedBackgroundImage() && !m_box.backgroundIsKnownToBeObscured())
|
| @@ -134,6 +136,7 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason()
|
| // because the difference between oldBounds and newBounds doesn't cover all area needing invalidation.
|
| // FIXME: Should also consider ancestor transforms since paintInvalidationContainer. crbug.com/426111.
|
| if (reason == PaintInvalidationIncremental
|
| + && m_context.oldBounds != m_context.newBounds
|
| && m_context.paintInvalidationContainer != m_box
|
| && m_box.hasLayer() && m_box.layer()->transform()
|
| && !m_box.layer()->transform()->isIdentityOrTranslation())
|
| @@ -148,7 +151,7 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason()
|
| if (!style.hasBackground() && !style.hasBoxDecorations()) {
|
| // We could let incremental invalidation cover non-composited scrollbars, but just
|
| // do a full invalidation because incremental invalidation will go away with slimming paint.
|
| - if (reason == PaintInvalidationIncremental && m_box.hasNonCompositedScrollbars())
|
| + if (reason == PaintInvalidationIncremental && m_context.oldBounds != m_context.newBounds && m_box.hasNonCompositedScrollbars())
|
| return PaintInvalidationBorderBoxChange;
|
| return reason;
|
| }
|
| @@ -164,11 +167,6 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason()
|
| if (oldBorderBoxSize == newBorderBoxSize)
|
| return reason;
|
|
|
| - // LayoutBox::incrementallyInvalidatePaint() depends on positionFromPaintInvalidationBacking
|
| - // which is not available when slimmingPaintOffsetCachingEnabled.
|
| - if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() && (style.hasBoxDecorations() || style.hasBackground()))
|
| - return PaintInvalidationBorderBoxChange;
|
| -
|
| // See another hasNonCompositedScrollbars() callsite above.
|
| if (m_box.hasNonCompositedScrollbars())
|
| return PaintInvalidationBorderBoxChange;
|
| @@ -190,21 +188,25 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason()
|
| if (oldBorderBoxSize.height() != newBorderBoxSize.height() && m_box.mustInvalidateBackgroundOrBorderPaintOnHeightChange())
|
| return PaintInvalidationBorderBoxChange;
|
|
|
| - if (reason == PaintInvalidationNone && (style.hasBackground() || style.hasBoxDecorations()))
|
| - reason = PaintInvalidationIncremental;
|
| -
|
| return reason;
|
| }
|
|
|
| PaintInvalidationReason BoxPaintInvalidator::invalidatePaintIfNeeded()
|
| {
|
| - PaintInvalidationReason reason = ObjectPaintInvalidator(m_box, m_context).invalidatePaintIfNeededWithComputedReason(computePaintInvalidationReason());
|
| -
|
| - // For incremental invalidation, ObjectPaintInvalidator::incrementallyInvalidatePaint() is
|
| - // not enough for LayoutBox in some cases, e.g. having border, border-radius, etc.
|
| - // The following will do additional incremental invalidation for LayoutBox if needed.
|
| - if (reason == PaintInvalidationIncremental)
|
| - incrementallyInvalidatePaint();
|
| + PaintInvalidationReason reason = computePaintInvalidationReason();
|
| + if (reason == PaintInvalidationIncremental) {
|
| + if (incrementallyInvalidatePaint()) {
|
| + m_context.paintingLayer->setNeedsRepaint();
|
| + m_box.invalidateDisplayItemClients(reason);
|
| + } else {
|
| + reason = PaintInvalidationNone;
|
| + }
|
| + // Though we have done our own version of incremental invalidation, we still need to call
|
| + // ObjectPaintInvalidator with PaintInvalidationNone to do any other required operations.
|
| + reason = std::max(reason, ObjectPaintInvalidator(m_box, m_context).invalidatePaintIfNeededWithComputedReason(PaintInvalidationNone));
|
| + } else {
|
| + reason = ObjectPaintInvalidator(m_box, m_context).invalidatePaintIfNeededWithComputedReason(reason);
|
| + }
|
|
|
| if (PaintLayerScrollableArea* area = m_box.getScrollableArea())
|
| area->invalidatePaintOfScrollControlsIfNeeded(m_context);
|
|
|