Index: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
index 051eac477996558eea600be5ff4714efb73cbe8d..845feea8a627810653cb95f2e49a9ce2f57007a0 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
@@ -33,6 +33,9 @@ void PaintPropertyTreeBuilder::buildTreeRootNodes(FrameView& rootFrame, PaintPro |
} else { |
DCHECK(rootFrame.rootClip() && !rootFrame.rootClip()->parent()); |
DCHECK(rootFrame.rootEffect() && !rootFrame.rootEffect()->parent()); |
+ DCHECK(rootFrame.rootScroll() && !rootFrame.rootScroll()->parent()); |
+ // Ensure main thread scroll reasons are reset. |
+ rootFrame.rootScroll()->update(nullptr, rootFrame.rootTransform(), IntSize(), IntSize(), false, false); |
} |
context.current.transform = context.absolutePosition.transform = context.fixedPosition.transform = rootFrame.rootTransform(); |
@@ -78,7 +81,7 @@ void createOrUpdateFrameViewScrollTranslation(FrameView& frameView, |
} |
void createOrUpdateFrameViewScroll(FrameView& frameView, |
- PassRefPtr<const ScrollPaintPropertyNode> parent, |
+ PassRefPtr<ScrollPaintPropertyNode> parent, |
PassRefPtr<const TransformPaintPropertyNode> scrollOffset, |
const IntSize& clip, const IntSize& bounds, |
bool userScrollableHorizontal, |
@@ -141,7 +144,7 @@ void PaintPropertyTreeBuilder::buildTreeNodes(FrameView& frameView, PaintPropert |
// Initialize the context for current, absolute and fixed position cases. |
// They are the same, except that scroll translation does not apply to |
// fixed position descendants. |
- const ScrollPaintPropertyNode* initialScroll = context.current.scroll; |
+ ScrollPaintPropertyNode* initialScroll = context.current.scroll; |
context.current.transform = frameView.scrollTranslation(); |
context.current.paintOffset = LayoutPoint(); |
context.current.clip = frameView.contentClip(); |
@@ -330,6 +333,17 @@ void PaintPropertyTreeBuilder::updateScrollbarPaintOffset(const LayoutObject& ob |
properties->clearScrollbarPaintOffset(); |
} |
+void PaintPropertyTreeBuilder::updateMainThreadScrollingReasons(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
+{ |
+ if (object.isBackgroundAttachmentFixedObject()) { |
+ auto* scrollNode = context.current.scroll; |
+ while (scrollNode && !scrollNode->hasMainThreadScrollingReasons(MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects)) { |
+ scrollNode->addMainThreadScrollingReasons(MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); |
+ scrollNode = scrollNode->parent(); |
+ } |
+ } |
+} |
+ |
void PaintPropertyTreeBuilder::updateOverflowClip(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |
{ |
if (!object.isBox()) |
@@ -431,7 +445,7 @@ void PaintPropertyTreeBuilder::updateScrollAndScrollTranslation(const LayoutObje |
IntSize scrollBounds = layer->getScrollableArea()->contentsSize(); |
bool userScrollableHorizontal = layer->getScrollableArea()->userInputScrollable(HorizontalScrollbar); |
bool userScrollableVertical = layer->getScrollableArea()->userInputScrollable(VerticalScrollbar); |
- const ScrollPaintPropertyNode* parentScrollNode = forceScrollingForLayoutView ? nullptr : context.current.scroll; |
+ ScrollPaintPropertyNode* parentScrollNode = forceScrollingForLayoutView ? nullptr : context.current.scroll; |
context.current.scroll = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateScroll( |
parentScrollNode, context.current.transform, scrollClip, scrollBounds, userScrollableHorizontal, userScrollableVertical); |
@@ -547,6 +561,7 @@ void PaintPropertyTreeBuilder::buildTreeNodesForSelf(const LayoutObject& object, |
updateCssClip(object, context); |
updateLocalBorderBoxContext(object, context); |
updateScrollbarPaintOffset(object, context); |
+ updateMainThreadScrollingReasons(object, context); |
} |
void PaintPropertyTreeBuilder::buildTreeNodesForChildren(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) |