Chromium Code Reviews| 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 f122464d2b1cb1e038e3cd68bd66596feaefbf86..1b548b8c4bf78a2167536801ab7c2325427869cf 100644 | 
| --- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp | 
| +++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp | 
| @@ -10,18 +10,27 @@ | 
| #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h" | 
| #include "core/layout/LayoutPart.h" | 
| #include "core/layout/LayoutView.h" | 
| +#include "core/paint/PaintLayer.h" | 
| namespace blink { | 
| struct PrePaintTreeWalkContext { | 
| - PrePaintTreeWalkContext() : paintInvalidatorContext(treeBuilderContext) {} | 
| + PrePaintTreeWalkContext() | 
| + : paintInvalidatorContext(treeBuilderContext), | 
| + ancestorOverflowPaintLayer(nullptr) {} | 
| PrePaintTreeWalkContext(const PrePaintTreeWalkContext& parentContext) | 
| : treeBuilderContext(parentContext.treeBuilderContext), | 
| paintInvalidatorContext(treeBuilderContext, | 
| - parentContext.paintInvalidatorContext) {} | 
| + parentContext.paintInvalidatorContext), | 
| + ancestorOverflowPaintLayer(parentContext.ancestorOverflowPaintLayer) {} | 
| PaintPropertyTreeBuilderContext treeBuilderContext; | 
| PaintInvalidatorContext paintInvalidatorContext; | 
| + | 
| + // The ancestor in the PaintLayer tree which has overflow clip, or | 
| 
 
pdr.
2016/12/09 00:04:10
The PrePaintTreeWalk is shared by paint invalidati
 
chrishtr
2016/12/09 01:22:54
Are you suggesting making an AuxiliaryObjectProper
 
 | 
| + // is the root layer. Note that it is tree ancestor, not containing | 
| + // block or stacking ancestor. | 
| + PaintLayer* ancestorOverflowPaintLayer; | 
| }; | 
| void PrePaintTreeWalk::walk(FrameView& rootFrame) { | 
| @@ -62,6 +71,36 @@ bool PrePaintTreeWalk::walk(FrameView& frameView, | 
| return descendantsFullyUpdated; | 
| } | 
| +static void updateAuxiliaryObjectProperties( | 
| + const LayoutObject& object, | 
| + PrePaintTreeWalkContext& localContext) { | 
| + PaintLayer* paintLayer = nullptr; | 
| + | 
| + if (object.isBoxModelObject() && object.hasLayer()) | 
| + paintLayer = object.enclosingLayer(); | 
| + | 
| + if (paintLayer) { | 
| + paintLayer->updateAncestorOverflowLayer( | 
| + localContext.ancestorOverflowPaintLayer); | 
| + } | 
| + | 
| + if (object.styleRef().position() == StickyPosition && paintLayer) { | 
| + paintLayer->layoutObject()->updateStickyPositionConstraints(); | 
| + | 
| + // Sticky position constraints and ancestor overflow scroller affect | 
| + // the sticky layer position, so we need to update it again here. | 
| + // TODO(flackr): This should be refactored in the future to be clearer | 
| + // (i.e. update layer position and ancestor inputs updates in the | 
| + // same walk) | 
| + paintLayer->updateLayerPosition(); | 
| + } | 
| + | 
| + if (object.hasOverflowClip() || (paintLayer && paintLayer->isRootLayer())) { | 
| + DCHECK(paintLayer); | 
| + localContext.ancestorOverflowPaintLayer = paintLayer; | 
| + } | 
| +} | 
| + | 
| bool PrePaintTreeWalk::walk(const LayoutObject& object, | 
| const PrePaintTreeWalkContext& context) { | 
| PrePaintTreeWalkContext localContext(context); | 
| @@ -118,6 +157,8 @@ bool PrePaintTreeWalk::walk(const LayoutObject& object, | 
| m_propertyTreeBuilder.updatePropertiesForChildren( | 
| object, localContext.treeBuilderContext); | 
| + updateAuxiliaryObjectProperties(object, localContext); | 
| + | 
| bool descendantsFullyUpdated = true; | 
| for (const LayoutObject* child = object.slowFirstChild(); child; | 
| child = child->nextSibling()) { |