Chromium Code Reviews| 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 cd185fa100cb204a89b18a6a8b3235a52af9c9ca..3fc05c913fb8219adc2627a9001c2c52f5aadf81 100644 |
| --- a/cc/trees/layer_tree_host_impl.cc |
| +++ b/cc/trees/layer_tree_host_impl.cc |
| @@ -3145,6 +3145,9 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
| } |
| pending_delta -= scroll_delta; |
| + |
| + if (!CanPropagate(scroll_node, pending_delta.x(), pending_delta.y())) |
| + break; |
| } |
| } |
| scroll_state.set_is_ending(true); |
| @@ -3380,6 +3383,7 @@ void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) { |
| viewport()->MainScrollLayer() |
| ? scroll_tree.Node(viewport()->MainScrollLayer()->scroll_tree_index()) |
| : nullptr; |
| + |
|
majidvp
2017/07/14 14:29:43
nit: remove the unnecessary blank line.
sunyunjia
2017/07/14 22:07:23
Done.
|
| if (scroll_node) { |
| // TODO(bokan): The loop checks for a null parent but don't we still want to |
| // distribute to the root scroll node? |
| @@ -3399,6 +3403,16 @@ void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) { |
| if (CanConsumeDelta(scroll_node, *scroll_state)) |
| current_scroll_chain.push_front(scroll_node); |
| + |
| + float delta_x = scroll_state->is_beginning() |
| + ? scroll_state->delta_x_hint() |
| + : scroll_state->delta_x(); |
| + float delta_y = scroll_state->is_beginning() |
| + ? scroll_state->delta_y_hint() |
| + : scroll_state->delta_y(); |
| + |
| + if (!CanPropagate(scroll_node, delta_x, delta_y)) |
| + break; |
| } |
| } |
| active_tree_->SetCurrentlyScrollingNode( |
| @@ -3441,6 +3455,22 @@ bool LayerTreeHostImpl::CanConsumeDelta(ScrollNode* scroll_node, |
| return false; |
| } |
| +bool LayerTreeHostImpl::CanPropagate(ScrollNode* scroll_node, |
|
majidvp
2017/07/14 14:29:43
This function is not using any state in LayerTreeH
sunyunjia
2017/07/14 22:07:24
Done.
|
| + float x, |
| + float y) { |
| + // ScrollBoundaryBehavior may have different values on x-axis and y-axis. |
| + // We need to find out the dominant axis of user's intended scroll to decide |
| + // which node's ScrollBoundaryBehavior should be applied, i.e. which node |
| + // should be scrolled. |
|
majidvp
2017/07/14 14:29:43
The last sentence is not accurate. We don't decide
sunyunjia
2017/07/14 22:07:23
Done.
|
| + bool x_dominant = std::abs(x) > std::abs(y); |
| + return (x_dominant && |
| + scroll_node->scroll_boundary_behavior.x == |
| + ScrollBoundaryBehavior::kScrollBoundaryBehaviorTypeAuto) || |
| + (!x_dominant && |
| + scroll_node->scroll_boundary_behavior.y == |
| + ScrollBoundaryBehavior::kScrollBoundaryBehaviorTypeAuto); |
| +} |
| + |
| InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( |
| ScrollState* scroll_state) { |
| DCHECK(scroll_state); |