Index: cc/trees/layer_tree_host.cc |
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc |
index e5f0271c93ff9a36096094b24781b2076bb6fbbc..0684a9c51ae441f1d4c560a8c9dd07ddc16bb780 100644 |
--- a/cc/trees/layer_tree_host.cc |
+++ b/cc/trees/layer_tree_host.cc |
@@ -338,7 +338,12 @@ |
sync_tree->set_background_color(background_color_); |
sync_tree->set_has_transparent_background(has_transparent_background_); |
- if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
+ sync_tree->FindRootScrollLayer(); |
+ |
+ // TODO(wjmaclean) For now, not all LTH clients will register viewports, so |
+ // only set them when available.. |
+ if (page_scale_layer_) { |
+ DCHECK(inner_viewport_scroll_layer_); |
sync_tree->SetViewportLayersFromIds( |
page_scale_layer_->id(), |
inner_viewport_scroll_layer_->id(), |
@@ -1040,8 +1045,8 @@ |
if (!root_layer_.get()) |
return; |
- gfx::Vector2d inner_viewport_scroll_delta; |
- gfx::Vector2d outer_viewport_scroll_delta; |
+ 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 = |
@@ -1049,87 +1054,29 @@ |
info.scrolls[i].layer_id); |
if (!layer) |
continue; |
- if (layer == outer_viewport_scroll_layer_.get()) { |
- outer_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
- } else if (layer == inner_viewport_scroll_layer_.get()) { |
- inner_viewport_scroll_delta += info.scrolls[i].scroll_delta; |
+ if (layer == root_scroll_layer) { |
+ root_scroll_delta += info.scrolls[i].scroll_delta; |
} else { |
layer->SetScrollOffsetFromImplSide(layer->scroll_offset() + |
info.scrolls[i].scroll_delta); |
} |
} |
- if (!inner_viewport_scroll_delta.IsZero() || |
- !outer_viewport_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. |
- DCHECK(inner_viewport_scroll_layer_); // We should always have this. |
- |
- inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
- inner_viewport_scroll_layer_->scroll_offset() + |
- inner_viewport_scroll_delta); |
- if (outer_viewport_scroll_layer_) { |
- outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
- outer_viewport_scroll_layer_->scroll_offset() + |
- outer_viewport_scroll_delta); |
+ if (root_scroll_layer) { |
+ root_scroll_layer->SetScrollOffsetFromImplSide( |
+ root_scroll_layer->scroll_offset() + root_scroll_delta); |
} |
ApplyPageScaleDeltaFromImplSide(info.page_scale_delta); |
- |
- client_->ApplyScrollAndScale( |
- inner_viewport_scroll_delta + outer_viewport_scroll_delta, |
- info.page_scale_delta); |
- } |
-} |
- |
-gfx::Vector2d LayerTreeHost::DistributeScrollOffsetToViewports( |
- const gfx::Vector2d offset, |
- Layer* layer) { |
- DCHECK(layer); |
- if (layer != outer_viewport_scroll_layer_.get()) |
- return offset; |
- |
- gfx::Vector2d inner_viewport_offset = |
- inner_viewport_scroll_layer_->scroll_offset(); |
- gfx::Vector2d outer_viewport_offset = |
- outer_viewport_scroll_layer_->scroll_offset(); |
- |
- if (offset == inner_viewport_offset + outer_viewport_offset) { |
- // In this case, nothing should change, so we just return to the outer |
- // viewport the offset is already has. |
- return outer_viewport_offset; |
- } |
- |
- // In the spirit of document-scrolls-first, we always want any change to |
- // go to the outer viewport first. |
- gfx::Vector2d max_outer_viewport_scroll_offset = |
- outer_viewport_scroll_layer_->MaxScrollOffset(); |
-#if ENABLE_DCHECK |
-// TODO(wjmaclean) The DCHECK below is triggering during zoom-out. |
-// crbug.com/336574 |
-/* |
- gfx::Vector2d maxInnerViewportScrollOffset = |
- inner_viewport_scroll_layer_->MaxScrollOffset(); |
- |
- gfx::Vector2d totalMaxScrollOffset = |
- max_outer_viewport_scroll_offset + maxInnerViewportScrollOffset; |
- DCHECK(totalMaxScrollOffset.x() >= offset.x() && |
- totalMaxScrollOffset.y() >= offset.y()); |
-*/ |
-#endif |
- |
- outer_viewport_offset = offset - inner_viewport_offset; |
- outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); |
- outer_viewport_offset.SetToMax(gfx::Vector2d()); |
- |
- inner_viewport_offset = offset - outer_viewport_offset; |
- inner_viewport_scroll_layer_->SetScrollOffset(inner_viewport_offset); |
- |
- return outer_viewport_offset; |
+ client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
+ } |
} |
void LayerTreeHost::StartRateLimiter() { |