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

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

Issue 2365793002: Fix scroll chaining for non-descendants of root scroller. (Closed)
Patch Set: Rebase and remove hack Created 4 years, 2 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 2203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2214 void LayerTreeHostImpl::SetLayerTreeMutator( 2214 void LayerTreeHostImpl::SetLayerTreeMutator(
2215 std::unique_ptr<LayerTreeMutator> mutator) { 2215 std::unique_ptr<LayerTreeMutator> mutator) {
2216 if (mutator == mutator_) 2216 if (mutator == mutator_)
2217 return; 2217 return;
2218 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), 2218 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"),
2219 "LayerTreeHostImpl::SetLayerTreeMutator"); 2219 "LayerTreeHostImpl::SetLayerTreeMutator");
2220 mutator_ = std::move(mutator); 2220 mutator_ = std::move(mutator);
2221 mutator_->SetClient(this); 2221 mutator_->SetClient(this);
2222 } 2222 }
2223 2223
2224 LayerImpl* LayerTreeHostImpl::ViewportMainScrollLayer() {
2225 return viewport()->MainScrollLayer();
2226 }
2227
2224 void LayerTreeHostImpl::CleanUpTileManagerAndUIResources() { 2228 void LayerTreeHostImpl::CleanUpTileManagerAndUIResources() {
2225 ClearUIResources(); 2229 ClearUIResources();
2226 tile_manager_.FinishTasksAndCleanUp(); 2230 tile_manager_.FinishTasksAndCleanUp();
2227 resource_pool_ = nullptr; 2231 resource_pool_ = nullptr;
2228 tile_task_manager_ = nullptr; 2232 tile_task_manager_ = nullptr;
2229 single_thread_synchronous_task_graph_runner_ = nullptr; 2233 single_thread_synchronous_task_graph_runner_ = nullptr;
2230 image_decode_controller_ = nullptr; 2234 image_decode_controller_ = nullptr;
2231 2235
2232 // We've potentially just freed a large number of resources on our various 2236 // We've potentially just freed a large number of resources on our various
2233 // contexts. Flushing now helps ensure these are cleaned up quickly 2237 // contexts. Flushing now helps ensure these are cleaned up quickly
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 // that can scroll and set up an animation of its scroll offset. Note that 2827 // that can scroll and set up an animation of its scroll offset. Note that
2824 // this does not currently go through the scroll customization machinery 2828 // this does not currently go through the scroll customization machinery
2825 // that ScrollBy uses for non-animated wheel scrolls. 2829 // that ScrollBy uses for non-animated wheel scrolls.
2826 scroll_status = ScrollBegin(&scroll_state, WHEEL); 2830 scroll_status = ScrollBegin(&scroll_state, WHEEL);
2827 scroll_node = scroll_tree.CurrentlyScrollingNode(); 2831 scroll_node = scroll_tree.CurrentlyScrollingNode();
2828 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { 2832 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) {
2829 gfx::Vector2dF pending_delta = scroll_delta; 2833 gfx::Vector2dF pending_delta = scroll_delta;
2830 if (scroll_node) { 2834 if (scroll_node) {
2831 for (; scroll_tree.parent(scroll_node); 2835 for (; scroll_tree.parent(scroll_node);
2832 scroll_node = scroll_tree.parent(scroll_node)) { 2836 scroll_node = scroll_tree.parent(scroll_node)) {
2833 if (!scroll_node->scrollable || 2837 if (!scroll_node->scrollable)
2834 scroll_node->is_outer_viewport_scroll_layer)
2835 continue; 2838 continue;
2836 2839
2837 if (scroll_node->is_inner_viewport_scroll_layer) { 2840 if (viewport()->MainScrollLayer() &&
2841 scroll_node->owner_id == viewport()->MainScrollLayer()->id()) {
2838 gfx::Vector2dF scrolled = 2842 gfx::Vector2dF scrolled =
2839 viewport()->ScrollAnimated(pending_delta, delayed_by); 2843 viewport()->ScrollAnimated(pending_delta, delayed_by);
2840 // Viewport::ScrollAnimated returns pending_delta as long as it 2844 // Viewport::ScrollAnimated returns pending_delta as long as it
2841 // starts an animation. 2845 // starts an animation.
2842 if (scrolled == pending_delta) 2846 if (scrolled == pending_delta)
2843 return scroll_status; 2847 return scroll_status;
2844 pending_delta -= scrolled; 2848 break;
2845 continue;
2846 } 2849 }
2847 2850
2848 gfx::Vector2dF scroll_delta = 2851 gfx::Vector2dF scroll_delta =
2849 ComputeScrollDelta(scroll_node, pending_delta); 2852 ComputeScrollDelta(scroll_node, pending_delta);
2850 if (ScrollAnimationCreate(scroll_node, scroll_delta, delayed_by)) 2853 if (ScrollAnimationCreate(scroll_node, scroll_delta, delayed_by))
2851 return scroll_status; 2854 return scroll_status;
2852 2855
2853 pending_delta -= scroll_delta; 2856 pending_delta -= scroll_delta;
2854 } 2857 }
2855 } 2858 }
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
3035 } 3038 }
3036 3039
3037 void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) { 3040 void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) {
3038 // TODO(majidvp): in Blink we compute scroll chain only at scroll begin which 3041 // TODO(majidvp): in Blink we compute scroll chain only at scroll begin which
3039 // is not the case here. We eventually want to have the same behaviour on both 3042 // is not the case here. We eventually want to have the same behaviour on both
3040 // sides but it may become a non issue if we get rid of scroll chaining (see 3043 // sides but it may become a non issue if we get rid of scroll chaining (see
3041 // crbug.com/526462) 3044 // crbug.com/526462)
3042 std::list<const ScrollNode*> current_scroll_chain; 3045 std::list<const ScrollNode*> current_scroll_chain;
3043 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; 3046 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
3044 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); 3047 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
3048 ScrollNode* viewport_scroll_node =
3049 viewport()->MainScrollLayer()
3050 ? scroll_tree.Node(viewport()->MainScrollLayer()->scroll_tree_index())
3051 : nullptr;
3045 if (scroll_node) { 3052 if (scroll_node) {
3053 // TODO(bokan): The loop checks for a null parent but don't we still want to
3054 // distribute to the root scroll node?
3046 for (; scroll_tree.parent(scroll_node); 3055 for (; scroll_tree.parent(scroll_node);
3047 scroll_node = scroll_tree.parent(scroll_node)) { 3056 scroll_node = scroll_tree.parent(scroll_node)) {
3048 if (scroll_node->is_outer_viewport_scroll_layer) { 3057 if (scroll_node == viewport_scroll_node) {
3049 // TODO(bokan): This should use Viewport::MainScrollLayer once that
3050 // returns the outer viewport scroll layer.
3051 // Don't chain scrolls past the outer viewport scroll layer. Once we 3058 // Don't chain scrolls past the outer viewport scroll layer. Once we
3052 // reach that, we should scroll the viewport which is represented by the 3059 // reach that, we should scroll the viewport which is represented by the
3053 // main viewport scroll layer. 3060 // main viewport scroll layer.
3054 DCHECK(viewport()->MainScrollLayer());
3055 ScrollNode* viewport_scroll_node = scroll_tree.Node(
3056 viewport()->MainScrollLayer()->scroll_tree_index());
3057 DCHECK(viewport_scroll_node); 3061 DCHECK(viewport_scroll_node);
3058 current_scroll_chain.push_front(viewport_scroll_node); 3062 current_scroll_chain.push_front(viewport_scroll_node);
3059 break; 3063 break;
3060 } 3064 }
3061 3065
3062 if (!scroll_node->scrollable) 3066 if (!scroll_node->scrollable)
3063 continue; 3067 continue;
3064 3068
3065 current_scroll_chain.push_front(scroll_node); 3069 current_scroll_chain.push_front(scroll_node);
3066 } 3070 }
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
3244 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); 3248 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point);
3245 HandleMouseOverScrollbar(layer_impl); 3249 HandleMouseOverScrollbar(layer_impl);
3246 if (scroll_layer_id_when_mouse_over_scrollbar_ != Layer::INVALID_ID) 3250 if (scroll_layer_id_when_mouse_over_scrollbar_ != Layer::INVALID_ID)
3247 return; 3251 return;
3248 3252
3249 bool scroll_on_main_thread = false; 3253 bool scroll_on_main_thread = false;
3250 uint32_t main_thread_scrolling_reasons; 3254 uint32_t main_thread_scrolling_reasons;
3251 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint( 3255 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint(
3252 device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl, 3256 device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl,
3253 &scroll_on_main_thread, &main_thread_scrolling_reasons); 3257 &scroll_on_main_thread, &main_thread_scrolling_reasons);
3258
3254 // Scrollbars for the viewport are registered with the outer viewport layer. 3259 // Scrollbars for the viewport are registered with the outer viewport layer.
3255 if (scroll_layer_impl == InnerViewportScrollLayer()) 3260 if (scroll_layer_impl == InnerViewportScrollLayer())
3256 scroll_layer_impl = OuterViewportScrollLayer(); 3261 scroll_layer_impl = OuterViewportScrollLayer();
3262
3257 if (scroll_on_main_thread || !scroll_layer_impl) 3263 if (scroll_on_main_thread || !scroll_layer_impl)
3258 return; 3264 return;
3259 3265
3260 ScrollbarAnimationController* animation_controller = 3266 ScrollbarAnimationController* animation_controller =
3261 ScrollbarAnimationControllerForId(scroll_layer_impl->id()); 3267 ScrollbarAnimationControllerForId(scroll_layer_impl->id());
3262 if (!animation_controller) 3268 if (!animation_controller)
3263 return; 3269 return;
3264 3270
3265 float distance_to_scrollbar = std::numeric_limits<float>::max(); 3271 float distance_to_scrollbar = std::numeric_limits<float>::max();
3266 for (ScrollbarLayerImplBase* scrollbar : 3272 for (ScrollbarLayerImplBase* scrollbar :
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
4089 if (is_visible) { 4095 if (is_visible) {
4090 worker_context_visibility_ = 4096 worker_context_visibility_ =
4091 worker_context->CacheController()->ClientBecameVisible(); 4097 worker_context->CacheController()->ClientBecameVisible();
4092 } else { 4098 } else {
4093 worker_context->CacheController()->ClientBecameNotVisible( 4099 worker_context->CacheController()->ClientBecameNotVisible(
4094 std::move(worker_context_visibility_)); 4100 std::move(worker_context_visibility_));
4095 } 4101 }
4096 } 4102 }
4097 4103
4098 } // namespace cc 4104 } // 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