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 2784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2795 | 2795 |
2796 active_tree_->SetCurrentlyScrollingNode(scrolling_node); | 2796 active_tree_->SetCurrentlyScrollingNode(scrolling_node); |
2797 // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation | 2797 // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation |
2798 // in input_handler_proxy instead. | 2798 // in input_handler_proxy instead. |
2799 wheel_scrolling_ = IsWheelBasedScroll(type); | 2799 wheel_scrolling_ = IsWheelBasedScroll(type); |
2800 scroll_state->set_is_direct_manipulation(!wheel_scrolling_); | 2800 scroll_state->set_is_direct_manipulation(!wheel_scrolling_); |
2801 // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure | 2801 // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure |
2802 // scroll customization callbacks are invoked. | 2802 // scroll customization callbacks are invoked. |
2803 DistributeScrollDelta(scroll_state); | 2803 DistributeScrollDelta(scroll_state); |
2804 | 2804 |
2805 // If the CurrentlyScrollingNode doesn't exist after distributing scroll | |
2806 // delta, no scroller can scroll in the given delta hint direction(s). | |
2807 if (!active_tree_->CurrentlyScrollingNode()) { | |
2808 scroll_status.thread = InputHandler::SCROLL_IGNORED; | |
2809 scroll_status.main_thread_scrolling_reasons = | |
2810 MainThreadScrollingReason::kNotScrollingOnMain; | |
2811 return scroll_status; | |
2812 } | |
2813 | |
2805 client_->RenewTreePriority(); | 2814 client_->RenewTreePriority(); |
2806 RecordCompositorSlowScrollMetric(type, CC_THREAD); | 2815 RecordCompositorSlowScrollMetric(type, CC_THREAD); |
2807 | 2816 |
2808 UpdateScrollSourceInfo(wheel_scrolling_); | 2817 UpdateScrollSourceInfo(wheel_scrolling_); |
2809 | 2818 |
2810 return scroll_status; | 2819 return scroll_status; |
2811 } | 2820 } |
2812 | 2821 |
2813 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( | 2822 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( |
2814 ScrollState* scroll_state, | 2823 ScrollState* scroll_state, |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2922 } | 2931 } |
2923 | 2932 |
2924 // If |first_scrolling_layer_or_drawn_scrollbar| is not scrollable, it must | 2933 // If |first_scrolling_layer_or_drawn_scrollbar| is not scrollable, it must |
2925 // be a drawn scrollbar. These hit tests require falling back to main-thread | 2934 // be a drawn scrollbar. These hit tests require falling back to main-thread |
2926 // scrolling. | 2935 // scrolling. |
2927 DCHECK(first_scrolling_layer_or_drawn_scrollbar->IsDrawnScrollbar()); | 2936 DCHECK(first_scrolling_layer_or_drawn_scrollbar->IsDrawnScrollbar()); |
2928 return false; | 2937 return false; |
2929 } | 2938 } |
2930 | 2939 |
2931 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin( | 2940 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin( |
2932 const gfx::Point& viewport_point) { | 2941 ScrollState* scroll_state) { |
2933 InputHandler::ScrollStatus scroll_status; | 2942 InputHandler::ScrollStatus scroll_status; |
2934 scroll_status.main_thread_scrolling_reasons = | 2943 scroll_status.main_thread_scrolling_reasons = |
2935 MainThreadScrollingReason::kNotScrollingOnMain; | 2944 MainThreadScrollingReason::kNotScrollingOnMain; |
2936 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 2945 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
2937 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 2946 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
2938 if (scroll_node) { | 2947 if (scroll_node) { |
2939 gfx::Vector2dF delta; | 2948 gfx::Vector2dF delta; |
2940 | 2949 |
2941 if (ScrollAnimationUpdateTarget(scroll_node, delta, base::TimeDelta())) { | 2950 if (ScrollAnimationUpdateTarget(scroll_node, delta, base::TimeDelta())) { |
2942 scroll_status.thread = SCROLL_ON_IMPL_THREAD; | 2951 scroll_status.thread = SCROLL_ON_IMPL_THREAD; |
2943 } else { | 2952 } else { |
2944 scroll_status.thread = SCROLL_IGNORED; | 2953 scroll_status.thread = SCROLL_IGNORED; |
2945 scroll_status.main_thread_scrolling_reasons = | 2954 scroll_status.main_thread_scrolling_reasons = |
2946 MainThreadScrollingReason::kNotScrollable; | 2955 MainThreadScrollingReason::kNotScrollable; |
2947 } | 2956 } |
2948 return scroll_status; | 2957 return scroll_status; |
2949 } | 2958 } |
2950 ScrollStateData scroll_state_data; | |
2951 scroll_state_data.position_x = viewport_point.x(); | |
2952 scroll_state_data.position_y = viewport_point.y(); | |
2953 ScrollState scroll_state(scroll_state_data); | |
2954 | 2959 |
2955 // ScrollAnimated is used for animated wheel scrolls. We find the first layer | 2960 // ScrollAnimated is used for animated wheel scrolls. We find the first layer |
2956 // that can scroll and set up an animation of its scroll offset. Note that | 2961 // that can scroll and set up an animation of its scroll offset. Note that |
2957 // this does not currently go through the scroll customization machinery | 2962 // this does not currently go through the scroll customization machinery |
2958 // that ScrollBy uses for non-animated wheel scrolls. | 2963 // that ScrollBy uses for non-animated wheel scrolls. |
2959 scroll_status = ScrollBegin(&scroll_state, WHEEL); | 2964 scroll_status = ScrollBegin(scroll_state, WHEEL); |
2960 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { | 2965 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { |
2961 scroll_animating_latched_node_id_ = ScrollTree::kInvalidNodeId; | 2966 scroll_animating_latched_node_id_ = ScrollTree::kInvalidNodeId; |
2962 ScrollStateData scroll_state_end_data; | 2967 ScrollStateData scroll_state_end_data; |
2963 scroll_state_end_data.is_ending = true; | 2968 scroll_state_end_data.is_ending = true; |
2964 ScrollState scroll_state_end(scroll_state_end_data); | 2969 ScrollState scroll_state_end(scroll_state_end_data); |
2965 ScrollEnd(&scroll_state_end); | 2970 ScrollEnd(&scroll_state_end); |
2966 } | 2971 } |
2967 return scroll_status; | 2972 return scroll_status; |
2968 } | 2973 } |
2969 | 2974 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3123 scroll_status.thread == SCROLL_ON_IMPL_THREAD) { | 3128 scroll_status.thread == SCROLL_ON_IMPL_THREAD) { |
3124 // If we get to here, we shouldn't return SCROLL_ON_IMPL_THREAD as otherwise | 3129 // If we get to here, we shouldn't return SCROLL_ON_IMPL_THREAD as otherwise |
3125 // we'll mark the scroll as handled and the scroll won't bubble. | 3130 // we'll mark the scroll as handled and the scroll won't bubble. |
3126 scroll_status.thread = SCROLL_IGNORED; | 3131 scroll_status.thread = SCROLL_IGNORED; |
3127 scroll_status.main_thread_scrolling_reasons = | 3132 scroll_status.main_thread_scrolling_reasons = |
3128 MainThreadScrollingReason::kNotScrollable; | 3133 MainThreadScrollingReason::kNotScrollable; |
3129 } | 3134 } |
3130 return scroll_status; | 3135 return scroll_status; |
3131 } | 3136 } |
3132 | 3137 |
3133 gfx::Vector2dF LayerTreeHostImpl::ScrollNodeWithViewportSpaceDelta( | 3138 bool LayerTreeHostImpl::CalculateLocalScrollDeltaAndStartPoint( |
3134 ScrollNode* scroll_node, | 3139 const ScrollNode& scroll_node, |
3135 const gfx::PointF& viewport_point, | 3140 const gfx::PointF& viewport_point, |
3136 const gfx::Vector2dF& viewport_delta, | 3141 const gfx::Vector2dF& viewport_delta, |
3137 ScrollTree* scroll_tree) { | 3142 const ScrollTree& scroll_tree, |
3143 gfx::Vector2dF* out_local_scroll_delta, | |
3144 gfx::PointF* out_local_start_point /*= nullptr*/) { | |
3138 // Layers with non-invertible screen space transforms should not have passed | 3145 // Layers with non-invertible screen space transforms should not have passed |
3139 // the scroll hit test in the first place. | 3146 // the scroll hit test in the first place. |
3140 const gfx::Transform screen_space_transform = | 3147 const gfx::Transform screen_space_transform = |
3141 scroll_tree->ScreenSpaceTransform(scroll_node->id); | 3148 scroll_tree.ScreenSpaceTransform(scroll_node.id); |
3142 DCHECK(screen_space_transform.IsInvertible()); | 3149 DCHECK(screen_space_transform.IsInvertible()); |
3143 gfx::Transform inverse_screen_space_transform( | 3150 gfx::Transform inverse_screen_space_transform( |
3144 gfx::Transform::kSkipInitialization); | 3151 gfx::Transform::kSkipInitialization); |
3145 bool did_invert = | 3152 bool did_invert = |
3146 screen_space_transform.GetInverse(&inverse_screen_space_transform); | 3153 screen_space_transform.GetInverse(&inverse_screen_space_transform); |
3147 // TODO(shawnsingh): With the advent of impl-side scrolling for non-root | 3154 // TODO(shawnsingh): With the advent of impl-side scrolling for non-root |
3148 // layers, we may need to explicitly handle uninvertible transforms here. | 3155 // layers, we may need to explicitly handle uninvertible transforms here. |
3149 DCHECK(did_invert); | 3156 DCHECK(did_invert); |
3150 | 3157 |
3151 float scale_from_viewport_to_screen_space = | 3158 float scale_from_viewport_to_screen_space = |
3152 active_tree_->device_scale_factor(); | 3159 active_tree_->device_scale_factor(); |
3153 gfx::PointF screen_space_point = | 3160 gfx::PointF screen_space_point = |
3154 gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space); | 3161 gfx::ScalePoint(viewport_point, scale_from_viewport_to_screen_space); |
3155 | 3162 |
3156 gfx::Vector2dF screen_space_delta = viewport_delta; | 3163 gfx::Vector2dF screen_space_delta = viewport_delta; |
3157 screen_space_delta.Scale(scale_from_viewport_to_screen_space); | 3164 screen_space_delta.Scale(scale_from_viewport_to_screen_space); |
3158 | 3165 |
3159 // First project the scroll start and end points to local layer space to find | 3166 // Project the scroll start and end points to local layer space to find the |
3160 // the scroll delta in layer coordinates. | 3167 // scroll delta in layer coordinates. |
3161 bool start_clipped, end_clipped; | 3168 bool start_clipped, end_clipped; |
3162 gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta; | 3169 gfx::PointF screen_space_end_point = screen_space_point + screen_space_delta; |
3163 gfx::PointF local_start_point = MathUtil::ProjectPoint( | 3170 gfx::PointF local_start_point = MathUtil::ProjectPoint( |
3164 inverse_screen_space_transform, screen_space_point, &start_clipped); | 3171 inverse_screen_space_transform, screen_space_point, &start_clipped); |
3165 gfx::PointF local_end_point = MathUtil::ProjectPoint( | 3172 gfx::PointF local_end_point = MathUtil::ProjectPoint( |
3166 inverse_screen_space_transform, screen_space_end_point, &end_clipped); | 3173 inverse_screen_space_transform, screen_space_end_point, &end_clipped); |
3174 DCHECK(out_local_scroll_delta); | |
3175 *out_local_scroll_delta = local_end_point - local_start_point; | |
3167 | 3176 |
3168 // In general scroll point coordinates should not get clipped. | 3177 if (out_local_start_point) |
3169 DCHECK(!start_clipped); | 3178 *out_local_start_point = local_start_point; |
3170 DCHECK(!end_clipped); | 3179 |
3171 if (start_clipped || end_clipped) | 3180 if (start_clipped || end_clipped) |
3181 return false; | |
3182 | |
3183 return true; | |
3184 } | |
3185 | |
3186 gfx::Vector2dF LayerTreeHostImpl::ScrollNodeWithViewportSpaceDelta( | |
3187 ScrollNode* scroll_node, | |
3188 const gfx::PointF& viewport_point, | |
3189 const gfx::Vector2dF& viewport_delta, | |
3190 ScrollTree* scroll_tree) { | |
3191 gfx::PointF local_start_point; | |
3192 gfx::Vector2dF local_scroll_delta; | |
3193 if (!CalculateLocalScrollDeltaAndStartPoint( | |
3194 *scroll_node, viewport_point, viewport_delta, *scroll_tree, | |
3195 &local_scroll_delta, &local_start_point)) { | |
3172 return gfx::Vector2dF(); | 3196 return gfx::Vector2dF(); |
3197 } | |
3173 | 3198 |
3174 // Apply the scroll delta. | 3199 // Apply the scroll delta. |
3175 gfx::ScrollOffset previous_offset = | 3200 gfx::ScrollOffset previous_offset = |
3176 scroll_tree->current_scroll_offset(scroll_node->element_id); | 3201 scroll_tree->current_scroll_offset(scroll_node->element_id); |
3177 scroll_tree->ScrollBy(scroll_node, local_end_point - local_start_point, | 3202 scroll_tree->ScrollBy(scroll_node, local_scroll_delta, active_tree()); |
3178 active_tree()); | |
3179 gfx::ScrollOffset scrolled = | 3203 gfx::ScrollOffset scrolled = |
3180 scroll_tree->current_scroll_offset(scroll_node->element_id) - | 3204 scroll_tree->current_scroll_offset(scroll_node->element_id) - |
3181 previous_offset; | 3205 previous_offset; |
3182 | 3206 |
3183 // Get the end point in the layer's content space so we can apply its | 3207 // Get the end point in the layer's content space so we can apply its |
3184 // ScreenSpaceTransform. | 3208 // ScreenSpaceTransform. |
3185 gfx::PointF actual_local_end_point = | 3209 gfx::PointF actual_local_end_point = |
3186 local_start_point + gfx::Vector2dF(scrolled.x(), scrolled.y()); | 3210 local_start_point + gfx::Vector2dF(scrolled.x(), scrolled.y()); |
3187 | 3211 |
3188 // Calculate the applied scroll delta in viewport space coordinates. | 3212 // Calculate the applied scroll delta in viewport space coordinates. |
3213 bool end_clipped; | |
3214 const gfx::Transform screen_space_transform = | |
3215 scroll_tree->ScreenSpaceTransform(scroll_node->id); | |
3189 gfx::PointF actual_screen_space_end_point = MathUtil::MapPoint( | 3216 gfx::PointF actual_screen_space_end_point = MathUtil::MapPoint( |
3190 screen_space_transform, actual_local_end_point, &end_clipped); | 3217 screen_space_transform, actual_local_end_point, &end_clipped); |
3191 DCHECK(!end_clipped); | 3218 DCHECK(!end_clipped); |
3192 if (end_clipped) | 3219 if (end_clipped) |
3193 return gfx::Vector2dF(); | 3220 return gfx::Vector2dF(); |
3221 | |
3222 float scale_from_viewport_to_screen_space = | |
3223 active_tree_->device_scale_factor(); | |
3194 gfx::PointF actual_viewport_end_point = gfx::ScalePoint( | 3224 gfx::PointF actual_viewport_end_point = gfx::ScalePoint( |
3195 actual_screen_space_end_point, 1.f / scale_from_viewport_to_screen_space); | 3225 actual_screen_space_end_point, 1.f / scale_from_viewport_to_screen_space); |
3196 return actual_viewport_end_point - viewport_point; | 3226 return actual_viewport_end_point - viewport_point; |
3197 } | 3227 } |
3198 | 3228 |
3199 static gfx::Vector2dF ScrollNodeWithLocalDelta( | 3229 static gfx::Vector2dF ScrollNodeWithLocalDelta( |
3200 ScrollNode* scroll_node, | 3230 ScrollNode* scroll_node, |
3201 const gfx::Vector2dF& local_delta, | 3231 const gfx::Vector2dF& local_delta, |
3202 float page_scale_factor, | 3232 float page_scale_factor, |
3203 LayerTreeImpl* layer_tree_impl) { | 3233 LayerTreeImpl* layer_tree_impl) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3314 } | 3344 } |
3315 | 3345 |
3316 void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) { | 3346 void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) { |
3317 // TODO(majidvp): in Blink we compute scroll chain only at scroll begin which | 3347 // TODO(majidvp): in Blink we compute scroll chain only at scroll begin which |
3318 // is not the case here. We eventually want to have the same behaviour on both | 3348 // is not the case here. We eventually want to have the same behaviour on both |
3319 // sides but it may become a non issue if we get rid of scroll chaining (see | 3349 // sides but it may become a non issue if we get rid of scroll chaining (see |
3320 // crbug.com/526462) | 3350 // crbug.com/526462) |
3321 std::list<ScrollNode*> current_scroll_chain; | 3351 std::list<ScrollNode*> current_scroll_chain; |
3322 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 3352 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
3323 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 3353 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
3324 ScrollNode* viewport_scroll_node = OuterViewportScrollNode(); | 3354 ScrollNode* viewport_scroll_node = |
3355 viewport()->MainScrollLayer() | |
3356 ? scroll_tree.Node(viewport()->MainScrollLayer()->scroll_tree_index()) | |
3357 : nullptr; | |
3325 if (scroll_node) { | 3358 if (scroll_node) { |
3326 // TODO(bokan): The loop checks for a null parent but don't we still want to | 3359 // TODO(bokan): The loop checks for a null parent but don't we still want to |
3327 // distribute to the root scroll node? | 3360 // distribute to the root scroll node? |
3328 for (; scroll_tree.parent(scroll_node); | 3361 for (; scroll_tree.parent(scroll_node); |
3329 scroll_node = scroll_tree.parent(scroll_node)) { | 3362 scroll_node = scroll_tree.parent(scroll_node)) { |
3330 if (scroll_node == viewport_scroll_node) { | 3363 if (scroll_node == viewport_scroll_node) { |
3331 // Don't chain scrolls past the outer viewport scroll layer. Once we | 3364 // Don't chain scrolls past the outer viewport scroll layer. Once we |
3332 // reach that, we should scroll the viewport which is represented by the | 3365 // reach that, we should scroll the viewport which is represented by the |
3333 // main viewport scroll layer. | 3366 // main viewport scroll layer. |
3334 DCHECK(viewport_scroll_node); | 3367 DCHECK(viewport_scroll_node); |
3335 current_scroll_chain.push_front(viewport_scroll_node); | 3368 current_scroll_chain.push_front(viewport_scroll_node); |
3336 break; | 3369 break; |
3337 } | 3370 } |
3338 | 3371 |
3339 if (!scroll_node->scrollable) | 3372 if (!scroll_node->scrollable) |
3340 continue; | 3373 continue; |
3341 | 3374 |
3342 current_scroll_chain.push_front(scroll_node); | 3375 if (CanConsumeDelta(scroll_node, *scroll_state)) |
3376 current_scroll_chain.push_front(scroll_node); | |
3343 } | 3377 } |
3344 } | 3378 } |
3379 active_tree_->SetCurrentlyScrollingNode( | |
3380 current_scroll_chain.empty() ? nullptr : current_scroll_chain.back()); | |
3345 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, | 3381 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, |
3346 active_tree()); | 3382 active_tree()); |
3347 scroll_state->DistributeToScrollChainDescendant(); | 3383 scroll_state->DistributeToScrollChainDescendant(); |
3348 } | 3384 } |
3349 | 3385 |
3386 bool LayerTreeHostImpl::CanConsumeDelta(ScrollNode* scroll_node, | |
3387 const ScrollState& scroll_state) { | |
3388 gfx::Vector2dF delta_to_scroll; | |
weiliangc
2017/06/26 18:55:09
nit: DCHECK scroll_node not nullptr.
sahel
2017/06/26 21:38:07
Done.
| |
3389 if (scroll_state.is_beginning()) { | |
3390 delta_to_scroll = gfx::Vector2dF(scroll_state.delta_x_hint(), | |
3391 scroll_state.delta_y_hint()); | |
3392 } else { | |
3393 delta_to_scroll = | |
3394 gfx::Vector2dF(scroll_state.delta_x(), scroll_state.delta_y()); | |
3395 } | |
3396 | |
3397 if (delta_to_scroll == gfx::Vector2dF()) | |
3398 return true; | |
3399 | |
3400 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | |
3401 if (scroll_state.is_direct_manipulation()) { | |
3402 gfx::Vector2dF local_scroll_delta; | |
3403 if (!CalculateLocalScrollDeltaAndStartPoint( | |
3404 *scroll_node, | |
3405 gfx::PointF(scroll_state.position_x(), scroll_state.position_y()), | |
3406 delta_to_scroll, scroll_tree, &local_scroll_delta)) { | |
3407 return false; | |
3408 } | |
3409 delta_to_scroll = local_scroll_delta; | |
3410 } | |
3411 | |
3412 if (ComputeScrollDelta(scroll_node, delta_to_scroll) != gfx::Vector2dF()) | |
3413 return true; | |
3414 | |
3415 return false; | |
3416 } | |
3417 | |
3350 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( | 3418 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( |
3351 ScrollState* scroll_state) { | 3419 ScrollState* scroll_state) { |
3352 DCHECK(scroll_state); | 3420 DCHECK(scroll_state); |
3353 | 3421 |
3354 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); | 3422 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); |
3355 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 3423 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
3356 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 3424 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
3357 | 3425 |
3358 if (!scroll_node) | 3426 if (!scroll_node) |
3359 return InputHandlerScrollResult(); | 3427 return InputHandlerScrollResult(); |
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4321 | 4389 |
4322 void LayerTreeHostImpl::ShowScrollbarsForImplScroll(ElementId element_id) { | 4390 void LayerTreeHostImpl::ShowScrollbarsForImplScroll(ElementId element_id) { |
4323 if (!element_id) | 4391 if (!element_id) |
4324 return; | 4392 return; |
4325 if (ScrollbarAnimationController* animation_controller = | 4393 if (ScrollbarAnimationController* animation_controller = |
4326 ScrollbarAnimationControllerForElementId(element_id)) | 4394 ScrollbarAnimationControllerForElementId(element_id)) |
4327 animation_controller->DidScrollUpdate(); | 4395 animation_controller->DidScrollUpdate(); |
4328 } | 4396 } |
4329 | 4397 |
4330 } // namespace cc | 4398 } // namespace cc |
OLD | NEW |