Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 2907053004: GSB uses delta_hints to calculate scrolling chain. (Closed)
Patch Set: Merged with master. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 2775 matching lines...) Expand 10 before | Expand all | Expand 10 after
2786 2786
2787 active_tree_->SetCurrentlyScrollingNode(scrolling_node); 2787 active_tree_->SetCurrentlyScrollingNode(scrolling_node);
2788 // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation 2788 // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation
2789 // in input_handler_proxy instead. 2789 // in input_handler_proxy instead.
2790 wheel_scrolling_ = IsWheelBasedScroll(type); 2790 wheel_scrolling_ = IsWheelBasedScroll(type);
2791 scroll_state->set_is_direct_manipulation(!wheel_scrolling_); 2791 scroll_state->set_is_direct_manipulation(!wheel_scrolling_);
2792 // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure 2792 // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure
2793 // scroll customization callbacks are invoked. 2793 // scroll customization callbacks are invoked.
2794 DistributeScrollDelta(scroll_state); 2794 DistributeScrollDelta(scroll_state);
2795 2795
2796 // If the CurrentlyScrollingNode doesn't exist after distributing scroll
2797 // delta, no scroller can scroll in the given delta hint direction(s).
2798 if (!active_tree_->CurrentlyScrollingNode()) {
2799 scroll_status.thread = InputHandler::SCROLL_IGNORED;
2800 scroll_status.main_thread_scrolling_reasons =
2801 MainThreadScrollingReason::kNotScrollingOnMain;
2802 return scroll_status;
2803 }
2804
2796 client_->RenewTreePriority(); 2805 client_->RenewTreePriority();
2797 RecordCompositorSlowScrollMetric(type, CC_THREAD); 2806 RecordCompositorSlowScrollMetric(type, CC_THREAD);
2798 2807
2799 UpdateScrollSourceInfo(wheel_scrolling_); 2808 UpdateScrollSourceInfo(wheel_scrolling_);
2800 2809
2801 return scroll_status; 2810 return scroll_status;
2802 } 2811 }
2803 2812
2804 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( 2813 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin(
2805 ScrollState* scroll_state, 2814 ScrollState* scroll_state,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2913 } 2922 }
2914 2923
2915 // If |first_scrolling_layer_or_drawn_scrollbar| is not scrollable, it must 2924 // If |first_scrolling_layer_or_drawn_scrollbar| is not scrollable, it must
2916 // be a drawn scrollbar. These hit tests require falling back to main-thread 2925 // be a drawn scrollbar. These hit tests require falling back to main-thread
2917 // scrolling. 2926 // scrolling.
2918 DCHECK(first_scrolling_layer_or_drawn_scrollbar->IsDrawnScrollbar()); 2927 DCHECK(first_scrolling_layer_or_drawn_scrollbar->IsDrawnScrollbar());
2919 return false; 2928 return false;
2920 } 2929 }
2921 2930
2922 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin( 2931 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin(
2923 const gfx::Point& viewport_point) { 2932 ScrollState* scroll_state) {
2924 InputHandler::ScrollStatus scroll_status; 2933 InputHandler::ScrollStatus scroll_status;
2925 scroll_status.main_thread_scrolling_reasons = 2934 scroll_status.main_thread_scrolling_reasons =
2926 MainThreadScrollingReason::kNotScrollingOnMain; 2935 MainThreadScrollingReason::kNotScrollingOnMain;
2927 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; 2936 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
2928 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); 2937 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
2929 if (scroll_node) { 2938 if (scroll_node) {
2930 gfx::Vector2dF delta; 2939 gfx::Vector2dF delta;
2931 2940
2932 if (ScrollAnimationUpdateTarget(scroll_node, delta, base::TimeDelta())) { 2941 if (ScrollAnimationUpdateTarget(scroll_node, delta, base::TimeDelta())) {
2933 scroll_status.thread = SCROLL_ON_IMPL_THREAD; 2942 scroll_status.thread = SCROLL_ON_IMPL_THREAD;
2934 } else { 2943 } else {
2935 scroll_status.thread = SCROLL_IGNORED; 2944 scroll_status.thread = SCROLL_IGNORED;
2936 scroll_status.main_thread_scrolling_reasons = 2945 scroll_status.main_thread_scrolling_reasons =
2937 MainThreadScrollingReason::kNotScrollable; 2946 MainThreadScrollingReason::kNotScrollable;
2938 } 2947 }
2939 return scroll_status; 2948 return scroll_status;
2940 } 2949 }
2941 ScrollStateData scroll_state_data;
2942 scroll_state_data.position_x = viewport_point.x();
2943 scroll_state_data.position_y = viewport_point.y();
2944 ScrollState scroll_state(scroll_state_data);
2945 2950
2946 // ScrollAnimated is used for animated wheel scrolls. We find the first layer 2951 // ScrollAnimated is used for animated wheel scrolls. We find the first layer
2947 // that can scroll and set up an animation of its scroll offset. Note that 2952 // that can scroll and set up an animation of its scroll offset. Note that
2948 // this does not currently go through the scroll customization machinery 2953 // this does not currently go through the scroll customization machinery
2949 // that ScrollBy uses for non-animated wheel scrolls. 2954 // that ScrollBy uses for non-animated wheel scrolls.
2950 scroll_status = ScrollBegin(&scroll_state, WHEEL); 2955 scroll_status = ScrollBegin(scroll_state, WHEEL);
2951 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { 2956 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) {
2952 scroll_animating_latched_node_id_ = ScrollTree::kInvalidNodeId; 2957 scroll_animating_latched_node_id_ = ScrollTree::kInvalidNodeId;
2953 ScrollStateData scroll_state_end_data; 2958 ScrollStateData scroll_state_end_data;
2954 scroll_state_end_data.is_ending = true; 2959 scroll_state_end_data.is_ending = true;
2955 ScrollState scroll_state_end(scroll_state_end_data); 2960 ScrollState scroll_state_end(scroll_state_end_data);
2956 ScrollEnd(&scroll_state_end); 2961 ScrollEnd(&scroll_state_end);
2957 } 2962 }
2958 return scroll_status; 2963 return scroll_status;
2959 } 2964 }
2960 2965
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
3305 } 3310 }
3306 3311
3307 void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) { 3312 void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) {
3308 // TODO(majidvp): in Blink we compute scroll chain only at scroll begin which 3313 // TODO(majidvp): in Blink we compute scroll chain only at scroll begin which
3309 // is not the case here. We eventually want to have the same behaviour on both 3314 // is not the case here. We eventually want to have the same behaviour on both
3310 // sides but it may become a non issue if we get rid of scroll chaining (see 3315 // sides but it may become a non issue if we get rid of scroll chaining (see
3311 // crbug.com/526462) 3316 // crbug.com/526462)
3312 std::list<ScrollNode*> current_scroll_chain; 3317 std::list<ScrollNode*> current_scroll_chain;
3313 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; 3318 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
3314 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); 3319 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
3315 ScrollNode* viewport_scroll_node = OuterViewportScrollNode(); 3320 ScrollNode* viewport_scroll_node =
3321 viewport()->MainScrollLayer()
3322 ? scroll_tree.Node(viewport()->MainScrollLayer()->scroll_tree_index())
3323 : nullptr;
3316 if (scroll_node) { 3324 if (scroll_node) {
3317 // TODO(bokan): The loop checks for a null parent but don't we still want to 3325 // TODO(bokan): The loop checks for a null parent but don't we still want to
3318 // distribute to the root scroll node? 3326 // distribute to the root scroll node?
3319 for (; scroll_tree.parent(scroll_node); 3327 for (; scroll_tree.parent(scroll_node);
3320 scroll_node = scroll_tree.parent(scroll_node)) { 3328 scroll_node = scroll_tree.parent(scroll_node)) {
3321 if (scroll_node == viewport_scroll_node) { 3329 if (scroll_node == viewport_scroll_node) {
3322 // Don't chain scrolls past the outer viewport scroll layer. Once we 3330 // Don't chain scrolls past the outer viewport scroll layer. Once we
3323 // reach that, we should scroll the viewport which is represented by the 3331 // reach that, we should scroll the viewport which is represented by the
3324 // main viewport scroll layer. 3332 // main viewport scroll layer.
3325 DCHECK(viewport_scroll_node); 3333 DCHECK(viewport_scroll_node);
3326 current_scroll_chain.push_front(viewport_scroll_node); 3334 current_scroll_chain.push_front(viewport_scroll_node);
3327 break; 3335 break;
3328 } 3336 }
3329 3337
3330 if (!scroll_node->scrollable) 3338 if (!scroll_node->scrollable)
3331 continue; 3339 continue;
3332 3340
3333 current_scroll_chain.push_front(scroll_node); 3341 if (CanConsumeDelta(scroll_node, *scroll_state))
3342 current_scroll_chain.push_front(scroll_node);
3334 } 3343 }
3335 } 3344 }
3345 active_tree_->SetCurrentlyScrollingNode(
3346 current_scroll_chain.empty() ? nullptr : current_scroll_chain.back());
3336 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, 3347 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain,
3337 active_tree()); 3348 active_tree());
3338 scroll_state->DistributeToScrollChainDescendant(); 3349 scroll_state->DistributeToScrollChainDescendant();
3339 } 3350 }
3340 3351
3352 bool LayerTreeHostImpl::CanConsumeDelta(ScrollNode* scroll_node,
3353 const ScrollState& scroll_state) {
3354 gfx::Vector2dF delta_to_scroll;
3355 if (scroll_state.is_beginning()) {
3356 if (scroll_state.ignore_delta_hints())
3357 return true;
3358
3359 delta_to_scroll = gfx::Vector2dF(scroll_state.delta_x_hint(),
3360 scroll_state.delta_y_hint());
3361 } else {
3362 delta_to_scroll =
3363 gfx::Vector2dF(scroll_state.delta_x(), scroll_state.delta_y());
3364 }
3365
3366 if (delta_to_scroll == gfx::Vector2dF())
3367 return true;
3368
3369 if (ComputeScrollDelta(scroll_node, delta_to_scroll) != gfx::Vector2dF())
3370 return true;
3371
3372 if (scroll_node->scrolls_inner_viewport) {
bokan 2017/06/19 21:43:17 I don't think you need this special case, at least
sahel 2017/06/22 16:34:17 I don't think ComputeScrollDelta checks for viewpo
bokan 2017/06/22 21:44:37 Sorry, I meant that we should add it to ComputeScr
sahel 2017/06/23 18:22:03 I deleted this special case, as we discussed alway
bokan 2017/06/23 18:56:44 Acknowledged.
3373 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
3374 ScrollNode* viewport_scroll_node =
3375 viewport()->MainScrollLayer()
3376 ? scroll_tree.Node(
3377 viewport()->MainScrollLayer()->scroll_tree_index())
3378 : nullptr;
3379 if (viewport_scroll_node)
3380 return ComputeScrollDelta(viewport_scroll_node, delta_to_scroll) !=
3381 gfx::Vector2dF();
3382 }
3383
3384 return false;
3385 }
3386
3341 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( 3387 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy(
3342 ScrollState* scroll_state) { 3388 ScrollState* scroll_state) {
3343 DCHECK(scroll_state); 3389 DCHECK(scroll_state);
3344 3390
3345 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); 3391 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy");
3346 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; 3392 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
3347 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); 3393 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
3348 3394
3349 if (!scroll_node) 3395 if (!scroll_node)
3350 return InputHandlerScrollResult(); 3396 return InputHandlerScrollResult();
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after
4312 4358
4313 void LayerTreeHostImpl::ShowScrollbarsForImplScroll(ElementId element_id) { 4359 void LayerTreeHostImpl::ShowScrollbarsForImplScroll(ElementId element_id) {
4314 if (!element_id) 4360 if (!element_id)
4315 return; 4361 return;
4316 if (ScrollbarAnimationController* animation_controller = 4362 if (ScrollbarAnimationController* animation_controller =
4317 ScrollbarAnimationControllerForElementId(element_id)) 4363 ScrollbarAnimationControllerForElementId(element_id))
4318 animation_controller->DidScrollUpdate(); 4364 animation_controller->DidScrollUpdate();
4319 } 4365 }
4320 4366
4321 } // namespace cc 4367 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698