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

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

Issue 2907053004: GSB uses delta_hints to calculate scrolling chain. (Closed)
Patch Set: ignore_delta_hints_ deleted. Created 3 years, 5 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2784 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698