Index: cc/trees/layer_tree_impl.cc |
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc |
index b5f8aed2307ba159c5c091f123706c768324942f..33b8fe494aa2235159a997411c9d4e7d4b0e9b68 100644 |
--- a/cc/trees/layer_tree_impl.cc |
+++ b/cc/trees/layer_tree_impl.cc |
@@ -64,7 +64,7 @@ class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { |
} |
void Update() const override { |
- layer_tree_impl_->UpdateScrollOffsetDelegate(); |
+ layer_tree_impl_->UpdateScrollOffsetDelegateIfNeeded(); |
} |
private: |
@@ -1070,25 +1070,30 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( |
outer_viewport_scroll_layer_->RefreshFromScrollDelegate(); |
if (inner_viewport_scroll_layer_) |
- UpdateScrollOffsetDelegate(); |
+ UpdateScrollOffsetDelegateIfNeeded(); |
} |
} |
void LayerTreeImpl::OnRootLayerDelegatedScrollOffsetChanged() { |
DCHECK(root_layer_scroll_offset_delegate_); |
- if (inner_viewport_scroll_layer_) { |
+ root_layer_scroll_offset_delegate_->SetBlockUpdates(true); |
+ if (inner_viewport_scroll_layer_) |
inner_viewport_scroll_layer_->RefreshFromScrollDelegate(); |
- } |
- if (outer_viewport_scroll_layer_) { |
+ |
+ if (outer_viewport_scroll_layer_) |
outer_viewport_scroll_layer_->RefreshFromScrollDelegate(); |
- } |
-} |
-void LayerTreeImpl::UpdateScrollOffsetDelegate() { |
- DCHECK(InnerViewportScrollLayer()); |
- DCHECK(!OuterViewportScrollLayer() || outer_viewport_scroll_delegate_proxy_); |
- DCHECK(root_layer_scroll_offset_delegate_); |
+ root_layer_scroll_offset_delegate_->SetBlockUpdates(false); |
+ UpdateScrollOffsetDelegateIfNeeded(); |
+} |
+void LayerTreeImpl::UpdateScrollOffsetDelegateIfNeeded() { |
+ if (!root_layer_scroll_offset_delegate_) |
+ return; |
+ if (!InnerViewportScrollLayer() || !inner_viewport_scroll_delegate_proxy_) |
+ return; |
+ if (OuterViewportScrollLayer() && !outer_viewport_scroll_delegate_proxy_) |
+ return; |
gfx::ScrollOffset offset = |
inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); |