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 0e5870618251927ea94cc1d9fcd72106309c8b48..b903dbe5ca502038f08d48e03dd118bf05bb148d 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
@@ -23,7 +23,6 @@ namespace blink { |
PaintPropertyTreeBuilderContext |
PaintPropertyTreeBuilder::setupInitialContext() { |
PaintPropertyTreeBuilderContext context; |
- |
context.current.clip = context.absolutePosition.clip = |
context.fixedPosition.clip = ClipPaintPropertyNode::root(); |
context.currentEffect = EffectPaintPropertyNode::root(); |
@@ -31,11 +30,6 @@ PaintPropertyTreeBuilder::setupInitialContext() { |
context.fixedPosition.transform = TransformPaintPropertyNode::root(); |
context.current.scroll = context.absolutePosition.scroll = |
context.fixedPosition.scroll = ScrollPaintPropertyNode::root(); |
- |
- // Ensure scroll tree properties are reset. They will be rebuilt during the |
- // tree walk. |
- ScrollPaintPropertyNode::root()->clearMainThreadScrollingReasons(); |
- |
return context; |
} |
@@ -84,21 +78,23 @@ void updateFrameViewScrollTranslation( |
void updateFrameViewScroll( |
FrameView& frameView, |
- PassRefPtr<ScrollPaintPropertyNode> parent, |
+ PassRefPtr<const ScrollPaintPropertyNode> parent, |
PassRefPtr<const TransformPaintPropertyNode> scrollOffset, |
const IntSize& clip, |
const IntSize& bounds, |
bool userScrollableHorizontal, |
- bool userScrollableVertical) { |
+ bool userScrollableVertical, |
+ MainThreadScrollingReasons mainThreadScrollingReasons) { |
DCHECK(!RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
if (auto* existingScroll = frameView.scroll()) { |
existingScroll->update(std::move(parent), std::move(scrollOffset), clip, |
bounds, userScrollableHorizontal, |
- userScrollableVertical); |
+ userScrollableVertical, mainThreadScrollingReasons); |
} else { |
frameView.setScroll(ScrollPaintPropertyNode::create( |
std::move(parent), std::move(scrollOffset), clip, bounds, |
- userScrollableHorizontal, userScrollableVertical)); |
+ userScrollableHorizontal, userScrollableVertical, |
+ mainThreadScrollingReasons)); |
} |
} |
@@ -148,10 +144,18 @@ void PaintPropertyTreeBuilder::updateProperties( |
frameView.userInputScrollable(HorizontalScrollbar); |
bool userScrollableVertical = |
frameView.userInputScrollable(VerticalScrollbar); |
+ |
+ MainThreadScrollingReasons reasons = 0; |
+ if (!frameView.frame().settings()->threadedScrollingEnabled()) |
+ reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled; |
+ if (frameView.hasBackgroundAttachmentFixedObjects()) { |
+ reasons |= |
+ MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects; |
+ } |
updateFrameViewScroll(frameView, context.current.scroll, |
frameView.scrollTranslation(), scrollClip, |
scrollBounds, userScrollableHorizontal, |
- userScrollableVertical); |
+ userScrollableVertical, reasons); |
} else { |
// Ensure pre-existing properties are cleared when there is no scrolling. |
frameView.setScrollTranslation(nullptr); |
@@ -172,7 +176,7 @@ void PaintPropertyTreeBuilder::updateProperties( |
context.current.clip = frameView.contentClip(); |
if (const auto* scrollTranslation = frameView.scrollTranslation()) |
context.current.transform = scrollTranslation; |
- if (auto* scroll = frameView.scroll()) |
+ if (const auto* scroll = frameView.scroll()) |
context.current.scroll = scroll; |
context.current.paintOffset = LayoutPoint(); |
context.current.renderingContextID = 0; |
@@ -497,32 +501,6 @@ void PaintPropertyTreeBuilder::updateScrollbarPaintOffset( |
properties->clearScrollbarPaintOffset(); |
} |
-void PaintPropertyTreeBuilder::updateMainThreadScrollingReasons( |
- const LayoutObject& object, |
- PaintPropertyTreeBuilderContext& context) { |
- // TODO(pdr): Mark properties as needing an update for main thread scroll |
- // reasons and ensure reason changes are propagated to ancestors to account |
- // for the parent walk below. https://crbug.com/664672. |
- |
- if (context.current.scroll && |
- !object.document().settings()->threadedScrollingEnabled()) { |
- context.current.scroll->addMainThreadScrollingReasons( |
- MainThreadScrollingReason::kThreadedScrollingDisabled); |
- } |
- |
- 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) { |
@@ -670,10 +648,25 @@ void PaintPropertyTreeBuilder::updateScrollAndScrollTranslation( |
scrollableArea->userInputScrollable(HorizontalScrollbar); |
bool userScrollableVertical = |
scrollableArea->userInputScrollable(VerticalScrollbar); |
+ MainThreadScrollingReasons reasons = 0; |
+ if (!object.document().settings()->threadedScrollingEnabled()) |
+ reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled; |
+ // Checking for descendants in the layout tree has two downsides: |
+ // 1) There can be more descendants in layout order than in paint |
+ // order (e.g., fixed position objects). |
+ // 2) Iterating overall all background attachment fixed objects for |
+ // every scroll node can be slow, though there will be no objects |
+ // in the common case. |
+ const FrameView& frameView = *object.frameView(); |
+ if (frameView.hasBackgroundAttachmentFixedDescendants(object)) { |
+ reasons |= |
+ MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects; |
+ } |
object.getMutableForPainting().ensurePaintProperties().updateScroll( |
context.current.scroll, |
object.paintProperties()->scrollTranslation(), scrollClip, |
- scrollBounds, userScrollableHorizontal, userScrollableVertical); |
+ scrollBounds, userScrollableHorizontal, userScrollableVertical, |
+ reasons); |
} else { |
// Ensure pre-existing properties are cleared when there is no |
// scrolling. |
@@ -688,9 +681,7 @@ void PaintPropertyTreeBuilder::updateScrollAndScrollTranslation( |
if (object.paintProperties() && object.paintProperties()->scroll()) { |
context.current.transform = object.paintProperties()->scrollTranslation(); |
- const auto* scroll = object.paintProperties()->scroll(); |
- // TODO(pdr): Remove this const cast. |
- context.current.scroll = const_cast<ScrollPaintPropertyNode*>(scroll); |
+ context.current.scroll = object.paintProperties()->scroll(); |
context.current.shouldFlattenInheritedTransform = false; |
} |
} |
@@ -706,7 +697,7 @@ void PaintPropertyTreeBuilder::updateOutOfFlowContext( |
if (object.isLayoutView()) { |
if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
const auto* initialFixedTransform = context.fixedPosition.transform; |
- auto* initialFixedScroll = context.fixedPosition.scroll; |
+ const auto* initialFixedScroll = context.fixedPosition.scroll; |
context.fixedPosition = context.current; |
@@ -782,8 +773,7 @@ static void overrideContaineringBlockContextFromRealContainingBlock( |
context.renderingContextID = |
context.transform ? context.transform->renderingContextID() : 0; |
context.clip = properties->propertyTreeState.clip(); |
- context.scroll = const_cast<ScrollPaintPropertyNode*>( |
- properties->propertyTreeState.scroll()); |
+ context.scroll = properties->propertyTreeState.scroll(); |
} |
static void deriveBorderBoxFromContainerContext( |
@@ -888,7 +878,6 @@ void PaintPropertyTreeBuilder::updatePropertiesForSelf( |
updateCssClip(object, context); |
updateLocalBorderBoxContext(object, context); |
updateScrollbarPaintOffset(object, context); |
- updateMainThreadScrollingReasons(object, context); |
} |
void PaintPropertyTreeBuilder::updatePropertiesForChildren( |