| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index 1b1d8e16815dfe6ba4f5d3adccb580087298dee9..ab28b3454c5a1a1f5c7e6f45047e61167d1ade96 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -2567,14 +2567,15 @@
|
| }
|
| }
|
|
|
| - // The outer viewport layer represents the viewport.
|
| - if (potentially_scrolling_layer_impl == InnerViewportScrollLayer())
|
| - potentially_scrolling_layer_impl = OuterViewportScrollLayer();
|
| -
|
| // Falling back to the root scroll layer ensures generation of root overscroll
|
| - // notifications.
|
| + // notifications. The inner viewport layer represents the viewport during
|
| + // scrolling.
|
| if (!potentially_scrolling_layer_impl)
|
| - potentially_scrolling_layer_impl = OuterViewportScrollLayer();
|
| + potentially_scrolling_layer_impl = InnerViewportScrollLayer();
|
| +
|
| + // The inner viewport layer represents the viewport.
|
| + if (potentially_scrolling_layer_impl == OuterViewportScrollLayer())
|
| + potentially_scrolling_layer_impl = InnerViewportScrollLayer();
|
|
|
| if (potentially_scrolling_layer_impl) {
|
| // Ensure that final layer scrolls on impl thread (crbug.com/625100)
|
| @@ -2847,18 +2848,19 @@
|
| if (scroll_node) {
|
| for (; scroll_tree.parent(scroll_node);
|
| scroll_node = scroll_tree.parent(scroll_node)) {
|
| - if (!scroll_node->scrollable)
|
| + if (!scroll_node->scrollable ||
|
| + scroll_node->is_outer_viewport_scroll_layer)
|
| continue;
|
|
|
| - if (scroll_node->is_outer_viewport_scroll_layer ||
|
| - scroll_node->is_inner_viewport_scroll_layer) {
|
| + if (scroll_node->is_inner_viewport_scroll_layer) {
|
| gfx::Vector2dF scrolled =
|
| viewport()->ScrollAnimated(pending_delta, delayed_by);
|
| // Viewport::ScrollAnimated returns pending_delta as long as it
|
| // starts an animation.
|
| if (scrolled == pending_delta)
|
| return scroll_status;
|
| - break;
|
| + pending_delta -= scrolled;
|
| + continue;
|
| }
|
|
|
| gfx::Vector2dF scroll_delta =
|
| @@ -3001,7 +3003,7 @@
|
| // details.
|
| const float kEpsilon = 0.1f;
|
|
|
| - if (scroll_node->is_outer_viewport_scroll_layer) {
|
| + if (scroll_node->is_inner_viewport_scroll_layer) {
|
| bool affect_top_controls = !wheel_scrolling_;
|
| Viewport::ScrollResult result = viewport()->ScrollBy(
|
| delta, viewport_point, scroll_state->is_direct_manipulation(),
|
| @@ -3022,7 +3024,7 @@
|
| bool scrolled = std::abs(applied_delta.x()) > kEpsilon;
|
| scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon;
|
|
|
| - if (scrolled && !scroll_node->is_outer_viewport_scroll_layer) {
|
| + if (scrolled && !scroll_node->is_inner_viewport_scroll_layer) {
|
| // If the applied delta is within 45 degrees of the input
|
| // delta, bail out to make it easier to scroll just one layer
|
| // in one direction without affecting any of its parents.
|
| @@ -3059,9 +3061,11 @@
|
| scroll_node = scroll_tree.parent(scroll_node)) {
|
| if (scroll_node->is_outer_viewport_scroll_layer) {
|
| // Don't chain scrolls past the outer viewport scroll layer. Once we
|
| - // reach that, we're viewport scrolling which is special and handled by
|
| - // cc's Viewport class.
|
| - current_scroll_chain.push_front(scroll_node);
|
| + // reach that, we should scroll the viewport, which is represented by
|
| + // the inner viewport scroll layer.
|
| + ScrollNode* inner_viewport_scroll_node =
|
| + scroll_tree.Node(InnerViewportScrollLayer()->scroll_tree_index());
|
| + current_scroll_chain.push_front(inner_viewport_scroll_node);
|
| break;
|
| }
|
|
|
| @@ -3235,6 +3239,8 @@
|
| LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint(
|
| device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl,
|
| &scroll_on_main_thread, &main_thread_scrolling_reasons);
|
| + if (scroll_layer_impl == InnerViewportScrollLayer())
|
| + scroll_layer_impl = OuterViewportScrollLayer();
|
| if (scroll_on_main_thread || !scroll_layer_impl)
|
| return;
|
|
|
| @@ -3282,7 +3288,7 @@
|
| client_->RenewTreePriority();
|
| pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer();
|
| active_tree_->SetCurrentlyScrollingLayer(
|
| - active_tree_->OuterViewportScrollLayer());
|
| + active_tree_->InnerViewportScrollLayer());
|
| top_controls_manager_->PinchBegin();
|
| }
|
|
|
|
|