OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 3039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3050 | 3050 |
3051 mutator_host_->ImplOnlyScrollAnimationCreate( | 3051 mutator_host_->ImplOnlyScrollAnimationCreate( |
3052 scroll_node->element_id, target_offset, current_offset, delayed_by, | 3052 scroll_node->element_id, target_offset, current_offset, delayed_by, |
3053 animation_start_offset); | 3053 animation_start_offset); |
3054 | 3054 |
3055 SetNeedsOneBeginImplFrame(); | 3055 SetNeedsOneBeginImplFrame(); |
3056 | 3056 |
3057 return true; | 3057 return true; |
3058 } | 3058 } |
3059 | 3059 |
| 3060 static bool CanPropagate(ScrollNode* scroll_node, float x, float y) { |
| 3061 // ScrollBoundaryBehavior may have different values on x-axis and y-axis. |
| 3062 // We need to find out the dominant axis of user's intended scroll to decide |
| 3063 // which node's ScrollBoundaryBehavior should be applied, i.e. which the |
| 3064 // scroll should be propagated from this node given its relevant* |
| 3065 // ScrollBoundaryBehavior value. * relevant here depends on the dominant |
| 3066 // axis of scroll gesture. |
| 3067 bool x_dominant = std::abs(x) > std::abs(y); |
| 3068 return (x_dominant && |
| 3069 scroll_node->scroll_boundary_behavior.x == |
| 3070 ScrollBoundaryBehavior::kScrollBoundaryBehaviorTypeAuto) || |
| 3071 (!x_dominant && |
| 3072 scroll_node->scroll_boundary_behavior.y == |
| 3073 ScrollBoundaryBehavior::kScrollBoundaryBehaviorTypeAuto); |
| 3074 } |
| 3075 |
3060 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( | 3076 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
3061 const gfx::Point& viewport_point, | 3077 const gfx::Point& viewport_point, |
3062 const gfx::Vector2dF& scroll_delta, | 3078 const gfx::Vector2dF& scroll_delta, |
3063 base::TimeDelta delayed_by) { | 3079 base::TimeDelta delayed_by) { |
3064 InputHandler::ScrollStatus scroll_status; | 3080 InputHandler::ScrollStatus scroll_status; |
3065 scroll_status.main_thread_scrolling_reasons = | 3081 scroll_status.main_thread_scrolling_reasons = |
3066 MainThreadScrollingReason::kNotScrollingOnMain; | 3082 MainThreadScrollingReason::kNotScrollingOnMain; |
3067 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 3083 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
3068 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 3084 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
3069 | 3085 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3138 } | 3154 } |
3139 | 3155 |
3140 gfx::Vector2dF scroll_delta = | 3156 gfx::Vector2dF scroll_delta = |
3141 ComputeScrollDelta(scroll_node, pending_delta); | 3157 ComputeScrollDelta(scroll_node, pending_delta); |
3142 if (ScrollAnimationCreate(scroll_node, scroll_delta, delayed_by)) { | 3158 if (ScrollAnimationCreate(scroll_node, scroll_delta, delayed_by)) { |
3143 scroll_animating_latched_node_id_ = scroll_node->id; | 3159 scroll_animating_latched_node_id_ = scroll_node->id; |
3144 return scroll_status; | 3160 return scroll_status; |
3145 } | 3161 } |
3146 | 3162 |
3147 pending_delta -= scroll_delta; | 3163 pending_delta -= scroll_delta; |
| 3164 |
| 3165 if (!CanPropagate(scroll_node, pending_delta.x(), pending_delta.y())) |
| 3166 break; |
3148 } | 3167 } |
3149 } | 3168 } |
3150 scroll_state.set_is_ending(true); | 3169 scroll_state.set_is_ending(true); |
3151 ScrollEnd(&scroll_state); | 3170 ScrollEnd(&scroll_state); |
3152 if (settings_.is_layer_tree_for_subframe && | 3171 if (settings_.is_layer_tree_for_subframe && |
3153 scroll_status.thread == SCROLL_ON_IMPL_THREAD) { | 3172 scroll_status.thread == SCROLL_ON_IMPL_THREAD) { |
3154 // If we get to here, we shouldn't return SCROLL_ON_IMPL_THREAD as otherwise | 3173 // If we get to here, we shouldn't return SCROLL_ON_IMPL_THREAD as otherwise |
3155 // we'll mark the scroll as handled and the scroll won't bubble. | 3174 // we'll mark the scroll as handled and the scroll won't bubble. |
3156 scroll_status.thread = SCROLL_IGNORED; | 3175 scroll_status.thread = SCROLL_IGNORED; |
3157 scroll_status.main_thread_scrolling_reasons = | 3176 scroll_status.main_thread_scrolling_reasons = |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3392 DCHECK(viewport_scroll_node); | 3411 DCHECK(viewport_scroll_node); |
3393 current_scroll_chain.push_front(viewport_scroll_node); | 3412 current_scroll_chain.push_front(viewport_scroll_node); |
3394 break; | 3413 break; |
3395 } | 3414 } |
3396 | 3415 |
3397 if (!scroll_node->scrollable) | 3416 if (!scroll_node->scrollable) |
3398 continue; | 3417 continue; |
3399 | 3418 |
3400 if (CanConsumeDelta(scroll_node, *scroll_state)) | 3419 if (CanConsumeDelta(scroll_node, *scroll_state)) |
3401 current_scroll_chain.push_front(scroll_node); | 3420 current_scroll_chain.push_front(scroll_node); |
| 3421 |
| 3422 float delta_x = scroll_state->is_beginning() |
| 3423 ? scroll_state->delta_x_hint() |
| 3424 : scroll_state->delta_x(); |
| 3425 float delta_y = scroll_state->is_beginning() |
| 3426 ? scroll_state->delta_y_hint() |
| 3427 : scroll_state->delta_y(); |
| 3428 |
| 3429 if (!CanPropagate(scroll_node, delta_x, delta_y)) |
| 3430 break; |
3402 } | 3431 } |
3403 } | 3432 } |
3404 active_tree_->SetCurrentlyScrollingNode( | 3433 active_tree_->SetCurrentlyScrollingNode( |
3405 current_scroll_chain.empty() ? nullptr : current_scroll_chain.back()); | 3434 current_scroll_chain.empty() ? nullptr : current_scroll_chain.back()); |
3406 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, | 3435 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, |
3407 active_tree()); | 3436 active_tree()); |
3408 scroll_state->DistributeToScrollChainDescendant(); | 3437 scroll_state->DistributeToScrollChainDescendant(); |
3409 } | 3438 } |
3410 | 3439 |
3411 bool LayerTreeHostImpl::CanConsumeDelta(ScrollNode* scroll_node, | 3440 bool LayerTreeHostImpl::CanConsumeDelta(ScrollNode* scroll_node, |
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4409 | 4438 |
4410 void LayerTreeHostImpl::ShowScrollbarsForImplScroll(ElementId element_id) { | 4439 void LayerTreeHostImpl::ShowScrollbarsForImplScroll(ElementId element_id) { |
4411 if (!element_id) | 4440 if (!element_id) |
4412 return; | 4441 return; |
4413 if (ScrollbarAnimationController* animation_controller = | 4442 if (ScrollbarAnimationController* animation_controller = |
4414 ScrollbarAnimationControllerForElementId(element_id)) | 4443 ScrollbarAnimationControllerForElementId(element_id)) |
4415 animation_controller->DidScrollUpdate(); | 4444 animation_controller->DidScrollUpdate(); |
4416 } | 4445 } |
4417 | 4446 |
4418 } // namespace cc | 4447 } // namespace cc |
OLD | NEW |