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