| Index: third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
|
| index c335cd72ef242b9a16bcfed5d9b76916b1deb389..f22a67dd97d09685eaa3d0784d23b8d0a5c239b5 100644
|
| --- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
|
| @@ -45,29 +45,28 @@ void PrePaintTreeWalk::walk(FrameView& rootFrame) {
|
| }
|
|
|
| bool PrePaintTreeWalk::walk(FrameView& frameView,
|
| - const PrePaintTreeWalkContext& context) {
|
| + const PrePaintTreeWalkContext& parentContext) {
|
| if (frameView.shouldThrottleRendering()) {
|
| // The walk was interrupted by throttled rendering so this subtree was not
|
| // fully updated.
|
| return false;
|
| }
|
|
|
| - PrePaintTreeWalkContext localContext(context);
|
| + PrePaintTreeWalkContext context(parentContext);
|
|
|
| if (frameView.shouldInvalidateAllPaintAndPaintProperties()) {
|
| - localContext.treeBuilderContext.forceSubtreeUpdate = true;
|
| - localContext.paintInvalidatorContext.forcedSubtreeInvalidationFlags |=
|
| + context.treeBuilderContext.forceSubtreeUpdate = true;
|
| + context.paintInvalidatorContext.forcedSubtreeInvalidationFlags |=
|
| PaintInvalidatorContext::ForcedWholeTreeFullInvalidation;
|
| frameView.clearShouldInvalidateAllPaintAndPaintProperties();
|
| }
|
|
|
| - m_propertyTreeBuilder.updateProperties(frameView,
|
| - localContext.treeBuilderContext);
|
| - m_paintInvalidator.invalidatePaintIfNeeded(
|
| - frameView, localContext.paintInvalidatorContext);
|
| + m_propertyTreeBuilder.updateProperties(frameView, context.treeBuilderContext);
|
| + m_paintInvalidator.invalidatePaintIfNeeded(frameView,
|
| + context.paintInvalidatorContext);
|
|
|
| LayoutView* view = frameView.layoutView();
|
| - bool descendantsFullyUpdated = view ? walk(*view, localContext) : true;
|
| + bool descendantsFullyUpdated = view ? walk(*view, context) : true;
|
| if (descendantsFullyUpdated) {
|
| #if DCHECK_IS_ON()
|
| frameView.layoutView()->assertSubtreeClearedPaintInvalidationFlags();
|
| @@ -79,17 +78,15 @@ bool PrePaintTreeWalk::walk(FrameView& frameView,
|
| return descendantsFullyUpdated;
|
| }
|
|
|
| -static void updateAuxiliaryObjectProperties(
|
| - const LayoutObject& object,
|
| - PrePaintTreeWalkContext& localContext) {
|
| +static void updateAuxiliaryObjectProperties(const LayoutObject& object,
|
| + PrePaintTreeWalkContext& context) {
|
| PaintLayer* paintLayer = nullptr;
|
|
|
| if (object.isBoxModelObject() && object.hasLayer())
|
| paintLayer = object.enclosingLayer();
|
|
|
| if (paintLayer) {
|
| - paintLayer->updateAncestorOverflowLayer(
|
| - localContext.ancestorOverflowPaintLayer);
|
| + paintLayer->updateAncestorOverflowLayer(context.ancestorOverflowPaintLayer);
|
| }
|
|
|
| if (object.styleRef().position() == StickyPosition && paintLayer) {
|
| @@ -105,13 +102,13 @@ static void updateAuxiliaryObjectProperties(
|
|
|
| if (object.hasOverflowClip() || (paintLayer && paintLayer->isRootLayer())) {
|
| DCHECK(paintLayer);
|
| - localContext.ancestorOverflowPaintLayer = paintLayer;
|
| + context.ancestorOverflowPaintLayer = paintLayer;
|
| }
|
| }
|
|
|
| bool PrePaintTreeWalk::walk(const LayoutObject& object,
|
| - const PrePaintTreeWalkContext& context) {
|
| - PrePaintTreeWalkContext localContext(context);
|
| + const PrePaintTreeWalkContext& parentContext) {
|
| + PrePaintTreeWalkContext context(parentContext);
|
|
|
| // TODO(pdr): Ensure multi column works with incremental property tree
|
| // construction.
|
| @@ -120,10 +117,10 @@ bool PrePaintTreeWalk::walk(const LayoutObject& object,
|
| // Set the flag so that the tree builder can specially handle out-of-flow
|
| // positioned descendants if their containers are between the multi-column
|
| // container and the spanner. See PaintPropertyTreeBuilder for details.
|
| - localContext.treeBuilderContext.isUnderMultiColumnSpanner = true;
|
| + context.treeBuilderContext.isUnderMultiColumnSpanner = true;
|
| const auto& placeholder = toLayoutMultiColumnSpannerPlaceholder(object);
|
| bool descendantsFullyUpdated =
|
| - walk(*placeholder.layoutObjectInFlowThread(), localContext);
|
| + walk(*placeholder.layoutObjectInFlowThread(), context);
|
| if (descendantsFullyUpdated) {
|
| // If descendants were not fully updated, do not clear flags. During the
|
| // next PrePaintTreeWalk, these flags will be used again.
|
| @@ -134,25 +131,19 @@ bool PrePaintTreeWalk::walk(const LayoutObject& object,
|
|
|
| // This must happen before updateContextForBoxPosition, because the
|
| // latter reads some of the state computed uere.
|
| - updateAuxiliaryObjectProperties(object, localContext);
|
| -
|
| - // Ensure the current context takes into account the box position. This can
|
| - // change the current context's paint offset so it must precede the paint
|
| - // offset property update check.
|
| - m_propertyTreeBuilder.updateContextForBoxPosition(
|
| - object, localContext.treeBuilderContext);
|
| - // Many paint properties depend on paint offset so we force an update of
|
| - // properties if the paint offset changes.
|
| - if (object.previousPaintOffset() !=
|
| - localContext.treeBuilderContext.current.paintOffset) {
|
| - object.getMutableForPainting().setNeedsPaintPropertyUpdate();
|
| - }
|
| + updateAuxiliaryObjectProperties(object, context);
|
| +
|
| + // Ensure the current context takes into account the box's position. This can
|
| + // force a subtree update due to paint offset changes and must precede any
|
| + // early out from the treewalk.
|
| + m_propertyTreeBuilder.updateContextForBoxPosition(object,
|
| + context.treeBuilderContext);
|
|
|
| // Early out from the treewalk if possible.
|
| if (!object.needsPaintPropertyUpdate() &&
|
| !object.descendantNeedsPaintPropertyUpdate() &&
|
| - !localContext.treeBuilderContext.forceSubtreeUpdate &&
|
| - !localContext.paintInvalidatorContext.forcedSubtreeInvalidationFlags &&
|
| + !context.treeBuilderContext.forceSubtreeUpdate &&
|
| + !context.paintInvalidatorContext.forcedSubtreeInvalidationFlags &&
|
| !object
|
| .shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState()) {
|
| // Even though the subtree was not walked, we know that a walk will not
|
| @@ -160,12 +151,12 @@ bool PrePaintTreeWalk::walk(const LayoutObject& object,
|
| return true;
|
| }
|
|
|
| - m_propertyTreeBuilder.updatePropertiesForSelf(
|
| - object, localContext.treeBuilderContext);
|
| - m_paintInvalidator.invalidatePaintIfNeeded(
|
| - object, localContext.paintInvalidatorContext);
|
| - m_propertyTreeBuilder.updatePropertiesForChildren(
|
| - object, localContext.treeBuilderContext);
|
| + m_propertyTreeBuilder.updatePropertiesForSelf(object,
|
| + context.treeBuilderContext);
|
| + m_paintInvalidator.invalidatePaintIfNeeded(object,
|
| + context.paintInvalidatorContext);
|
| + m_propertyTreeBuilder.updatePropertiesForChildren(object,
|
| + context.treeBuilderContext);
|
|
|
| bool descendantsFullyUpdated = true;
|
| for (const LayoutObject* child = object.slowFirstChild(); child;
|
| @@ -173,7 +164,7 @@ bool PrePaintTreeWalk::walk(const LayoutObject& object,
|
| // Column spanners are walked through their placeholders. See above.
|
| if (child->isColumnSpanAll())
|
| continue;
|
| - bool childFullyUpdated = walk(*child, localContext);
|
| + bool childFullyUpdated = walk(*child, context);
|
| if (!childFullyUpdated)
|
| descendantsFullyUpdated = false;
|
| }
|
| @@ -182,12 +173,12 @@ bool PrePaintTreeWalk::walk(const LayoutObject& object,
|
| const LayoutPart& layoutPart = toLayoutPart(object);
|
| Widget* widget = layoutPart.widget();
|
| if (widget && widget->isFrameView()) {
|
| - localContext.treeBuilderContext.current.paintOffset +=
|
| + context.treeBuilderContext.current.paintOffset +=
|
| layoutPart.replacedContentRect().location() -
|
| widget->frameRect().location();
|
| - localContext.treeBuilderContext.current.paintOffset =
|
| - roundedIntPoint(localContext.treeBuilderContext.current.paintOffset);
|
| - bool frameFullyUpdated = walk(*toFrameView(widget), localContext);
|
| + context.treeBuilderContext.current.paintOffset =
|
| + roundedIntPoint(context.treeBuilderContext.current.paintOffset);
|
| + bool frameFullyUpdated = walk(*toFrameView(widget), context);
|
| if (!frameFullyUpdated)
|
| descendantsFullyUpdated = false;
|
| }
|
|
|