Index: cc/trees/layer_tree_host.cc |
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc |
index ff4d0079fe3983e8096afe381a0cafaa7035ad7f..ae517edfc1233b7fb22c0d8ba1d6ba8f3aa6410e 100644 |
--- a/cc/trees/layer_tree_host.cc |
+++ b/cc/trees/layer_tree_host.cc |
@@ -465,6 +465,10 @@ void LayerTreeHost::SetNeedsAnimate() { |
proxy_->SetNeedsAnimate(); |
} |
+void LayerTreeHost::SetNeedsUpdateLayers() { |
+ proxy_->SetNeedsUpdateLayers(); |
+} |
+ |
void LayerTreeHost::SetNeedsCommit() { |
if (!prepaint_callback_.IsCancelled()) { |
TRACE_EVENT_INSTANT0("cc", |
@@ -577,6 +581,11 @@ void LayerTreeHost::SetOverdrawBottomHeight(float overdraw_bottom_height) { |
SetNeedsCommit(); |
} |
+void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(float page_scale_delta) { |
+ DCHECK(CommitRequested()); |
+ page_scale_factor_ *= page_scale_delta; |
+} |
+ |
void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, |
float min_page_scale_factor, |
float max_page_scale_factor) { |
@@ -948,8 +957,8 @@ void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
if (!root_layer_.get()) |
return; |
- Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
gfx::Vector2d root_scroll_delta; |
+ Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
for (size_t i = 0; i < info.scrolls.size(); ++i) { |
Layer* layer = |
@@ -964,8 +973,22 @@ void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
info.scrolls[i].scroll_delta); |
} |
} |
- if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) |
+ |
+ if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
+ // SetScrollOffsetFromImplSide above could have destroyed the tree, |
+ // so re-get this layer before doing anything to it. |
+ root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
+ |
+ // Preemptively apply the scroll offset and scale delta here before sending |
+ // it to the client. If the client comes back and sets it to the same |
+ // value, then the layer can early out without needing a full commit. |
+ if (root_scroll_layer) { |
+ root_scroll_layer->SetScrollOffsetFromImplSide( |
+ root_scroll_layer->scroll_offset() + root_scroll_delta); |
+ } |
+ ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
+ } |
} |
void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { |