Chromium Code Reviews| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 proxy_(proxy), | 173 proxy_(proxy), |
| 174 current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), | 174 current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
| 175 content_is_suitable_for_gpu_rasterization_(true), | 175 content_is_suitable_for_gpu_rasterization_(true), |
| 176 has_gpu_rasterization_trigger_(false), | 176 has_gpu_rasterization_trigger_(false), |
| 177 use_gpu_rasterization_(false), | 177 use_gpu_rasterization_(false), |
| 178 use_msaa_(false), | 178 use_msaa_(false), |
| 179 gpu_rasterization_status_(GpuRasterizationStatus::OFF_DEVICE), | 179 gpu_rasterization_status_(GpuRasterizationStatus::OFF_DEVICE), |
| 180 tree_resources_for_gpu_rasterization_dirty_(false), | 180 tree_resources_for_gpu_rasterization_dirty_(false), |
| 181 input_handler_client_(NULL), | 181 input_handler_client_(NULL), |
| 182 did_lock_scrolling_layer_(false), | 182 did_lock_scrolling_layer_(false), |
| 183 should_bubble_scrolls_(false), | |
| 184 wheel_scrolling_(false), | 183 wheel_scrolling_(false), |
| 185 scroll_affects_scroll_handler_(false), | 184 scroll_affects_scroll_handler_(false), |
| 186 scroll_layer_id_when_mouse_over_scrollbar_(0), | 185 scroll_layer_id_when_mouse_over_scrollbar_(0), |
| 187 tile_priorities_dirty_(false), | 186 tile_priorities_dirty_(false), |
| 188 root_layer_scroll_offset_delegate_(NULL), | 187 root_layer_scroll_offset_delegate_(NULL), |
| 189 settings_(settings), | 188 settings_(settings), |
| 190 visible_(true), | 189 visible_(true), |
| 191 cached_managed_memory_policy_( | 190 cached_managed_memory_policy_( |
| 192 GetDefaultMemoryAllocationLimit(), | 191 GetDefaultMemoryAllocationLimit(), |
| 193 gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING, | 192 gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING, |
| (...skipping 2195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2389 | 2388 |
| 2390 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl( | 2389 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl( |
| 2391 LayerImpl* scrolling_layer_impl, | 2390 LayerImpl* scrolling_layer_impl, |
| 2392 InputHandler::ScrollInputType type) { | 2391 InputHandler::ScrollInputType type) { |
| 2393 if (!scrolling_layer_impl) | 2392 if (!scrolling_layer_impl) |
| 2394 return SCROLL_IGNORED; | 2393 return SCROLL_IGNORED; |
| 2395 | 2394 |
| 2396 top_controls_manager_->ScrollBegin(); | 2395 top_controls_manager_->ScrollBegin(); |
| 2397 | 2396 |
| 2398 active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl); | 2397 active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl); |
| 2399 should_bubble_scrolls_ = (type != NON_BUBBLING_GESTURE); | |
| 2400 wheel_scrolling_ = (type == WHEEL); | 2398 wheel_scrolling_ = (type == WHEEL); |
| 2401 client_->RenewTreePriority(); | 2399 client_->RenewTreePriority(); |
| 2402 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); | 2400 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); |
| 2403 return SCROLL_STARTED; | 2401 return SCROLL_STARTED; |
| 2404 } | 2402 } |
| 2405 | 2403 |
| 2406 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( | 2404 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( |
| 2407 InputHandler::ScrollInputType type) { | 2405 InputHandler::ScrollInputType type) { |
| 2408 TRACE_EVENT0("cc", "LayerTreeHostImpl::RootScrollBegin"); | 2406 TRACE_EVENT0("cc", "LayerTreeHostImpl::RootScrollBegin"); |
| 2409 | 2407 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 2432 device_viewport_point); | 2430 device_viewport_point); |
| 2433 if (scroll_layer_impl && !HasScrollAncestor(layer_impl, scroll_layer_impl)) | 2431 if (scroll_layer_impl && !HasScrollAncestor(layer_impl, scroll_layer_impl)) |
| 2434 return SCROLL_UNKNOWN; | 2432 return SCROLL_UNKNOWN; |
| 2435 } | 2433 } |
| 2436 | 2434 |
| 2437 bool scroll_on_main_thread = false; | 2435 bool scroll_on_main_thread = false; |
| 2438 LayerImpl* scrolling_layer_impl = FindScrollLayerForDeviceViewportPoint( | 2436 LayerImpl* scrolling_layer_impl = FindScrollLayerForDeviceViewportPoint( |
| 2439 device_viewport_point, type, layer_impl, &scroll_on_main_thread, | 2437 device_viewport_point, type, layer_impl, &scroll_on_main_thread, |
| 2440 &scroll_affects_scroll_handler_); | 2438 &scroll_affects_scroll_handler_); |
| 2441 | 2439 |
| 2440 // The inner viewport layer represents the viewport during scrolling. | |
|
jdduke (slow)
2015/09/09 14:41:10
Should we instead move this adjustment into FindSc
tdresser
2015/09/10 13:56:51
Absolutely, thanks.
Done.
| |
| 2441 if (scrolling_layer_impl == OuterViewportScrollLayer()) | |
| 2442 scrolling_layer_impl = InnerViewportScrollLayer(); | |
| 2443 | |
| 2442 if (scroll_on_main_thread) { | 2444 if (scroll_on_main_thread) { |
| 2443 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); | 2445 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); |
| 2444 return SCROLL_ON_MAIN_THREAD; | 2446 return SCROLL_ON_MAIN_THREAD; |
| 2445 } | 2447 } |
| 2446 | 2448 |
| 2447 return ScrollBeginImpl(scrolling_layer_impl, type); | 2449 return ScrollBeginImpl(scrolling_layer_impl, type); |
| 2448 } | 2450 } |
| 2449 | 2451 |
| 2450 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( | 2452 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
| 2451 const gfx::Point& viewport_point, | 2453 const gfx::Point& viewport_point, |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2636 // in which the layer moved. | 2638 // in which the layer moved. |
| 2637 applied_delta = MathUtil::ProjectVector(delta, applied_delta); | 2639 applied_delta = MathUtil::ProjectVector(delta, applied_delta); |
| 2638 } | 2640 } |
| 2639 scroll_state->set_caused_scroll(std::abs(applied_delta.x()) > kEpsilon, | 2641 scroll_state->set_caused_scroll(std::abs(applied_delta.x()) > kEpsilon, |
| 2640 std::abs(applied_delta.y()) > kEpsilon); | 2642 std::abs(applied_delta.y()) > kEpsilon); |
| 2641 scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y()); | 2643 scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y()); |
| 2642 } | 2644 } |
| 2643 | 2645 |
| 2644 if (!scrolled) | 2646 if (!scrolled) |
| 2645 return; | 2647 return; |
| 2646 // When scrolls are allowed to bubble, it's important that the original | 2648 |
| 2647 // scrolling layer be preserved. This ensures that, after a scroll | 2649 scroll_state->set_current_native_scrolling_layer(layer); |
| 2648 // bubbles, the user can reverse scroll directions and immediately resume | |
| 2649 // scrolling the original layer that scrolled. | |
| 2650 if (!scroll_state->should_propagate()) | |
| 2651 scroll_state->set_current_native_scrolling_layer(layer); | |
| 2652 } | 2650 } |
| 2653 | 2651 |
| 2654 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( | 2652 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( |
| 2655 const gfx::Point& viewport_point, | 2653 const gfx::Point& viewport_point, |
| 2656 const gfx::Vector2dF& scroll_delta) { | 2654 const gfx::Vector2dF& scroll_delta) { |
| 2657 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); | 2655 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); |
| 2658 if (!CurrentlyScrollingLayer()) | 2656 if (!CurrentlyScrollingLayer()) |
| 2659 return InputHandlerScrollResult(); | 2657 return InputHandlerScrollResult(); |
| 2660 | 2658 |
| 2661 float initial_top_controls_offset = | 2659 float initial_top_controls_offset = |
| 2662 top_controls_manager_->ControlsTopOffset(); | 2660 top_controls_manager_->ControlsTopOffset(); |
| 2663 ScrollState scroll_state( | 2661 ScrollState scroll_state( |
| 2664 scroll_delta.x(), scroll_delta.y(), viewport_point.x(), | 2662 scroll_delta.x(), scroll_delta.y(), viewport_point.x(), |
| 2665 viewport_point.y(), should_bubble_scrolls_ /* should_propagate */, | 2663 viewport_point.y(), false /* should_propagate */, |
| 2666 did_lock_scrolling_layer_ /* delta_consumed_for_scroll_sequence */, | 2664 did_lock_scrolling_layer_ /* delta_consumed_for_scroll_sequence */, |
| 2667 !wheel_scrolling_ /* is_direct_manipulation */); | 2665 !wheel_scrolling_ /* is_direct_manipulation */); |
| 2668 scroll_state.set_current_native_scrolling_layer(CurrentlyScrollingLayer()); | 2666 scroll_state.set_current_native_scrolling_layer(CurrentlyScrollingLayer()); |
| 2669 | 2667 |
| 2670 std::list<LayerImpl*> current_scroll_chain; | 2668 std::list<LayerImpl*> current_scroll_chain; |
| 2671 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl; | 2669 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl; |
| 2672 layer_impl = nextLayerInScrollOrder(layer_impl)) { | 2670 layer_impl = nextLayerInScrollOrder(layer_impl)) { |
| 2673 // Skip the outer viewport scroll layer so that we try to scroll the | 2671 // Skip the outer viewport scroll layer so that we try to scroll the |
| 2674 // viewport only once. i.e. The inner viewport layer represents the | 2672 // viewport only once. i.e. The inner viewport layer represents the |
| 2675 // viewport. | 2673 // viewport. |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2793 | 2791 |
| 2794 void LayerTreeHostImpl::ScrollEnd() { | 2792 void LayerTreeHostImpl::ScrollEnd() { |
| 2795 top_controls_manager_->ScrollEnd(); | 2793 top_controls_manager_->ScrollEnd(); |
| 2796 ClearCurrentlyScrollingLayer(); | 2794 ClearCurrentlyScrollingLayer(); |
| 2797 } | 2795 } |
| 2798 | 2796 |
| 2799 InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() { | 2797 InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() { |
| 2800 if (!CurrentlyScrollingLayer()) | 2798 if (!CurrentlyScrollingLayer()) |
| 2801 return SCROLL_IGNORED; | 2799 return SCROLL_IGNORED; |
| 2802 | 2800 |
| 2803 bool currently_scrolling_viewport = | |
| 2804 CurrentlyScrollingLayer() == OuterViewportScrollLayer() || | |
| 2805 CurrentlyScrollingLayer() == InnerViewportScrollLayer(); | |
| 2806 if (!wheel_scrolling_ && !currently_scrolling_viewport) { | |
| 2807 // Allow the fling to lock to the first layer that moves after the initial | |
| 2808 // fling |ScrollBy()| event, unless we're already scrolling the viewport. | |
| 2809 did_lock_scrolling_layer_ = false; | |
| 2810 should_bubble_scrolls_ = false; | |
| 2811 } | |
| 2812 | |
| 2813 return SCROLL_STARTED; | 2801 return SCROLL_STARTED; |
| 2814 } | 2802 } |
| 2815 | 2803 |
| 2816 float LayerTreeHostImpl::DeviceSpaceDistanceToLayer( | 2804 float LayerTreeHostImpl::DeviceSpaceDistanceToLayer( |
| 2817 const gfx::PointF& device_viewport_point, | 2805 const gfx::PointF& device_viewport_point, |
| 2818 LayerImpl* layer_impl) { | 2806 LayerImpl* layer_impl) { |
| 2819 if (!layer_impl) | 2807 if (!layer_impl) |
| 2820 return std::numeric_limits<float>::max(); | 2808 return std::numeric_limits<float>::max(); |
| 2821 | 2809 |
| 2822 gfx::Rect layer_impl_bounds(layer_impl->bounds()); | 2810 gfx::Rect layer_impl_bounds(layer_impl->bounds()); |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3612 if (active_tree()) { | 3600 if (active_tree()) { |
| 3613 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3601 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); |
| 3614 if (layer) | 3602 if (layer) |
| 3615 return layer->ScrollOffsetForAnimation(); | 3603 return layer->ScrollOffsetForAnimation(); |
| 3616 } | 3604 } |
| 3617 | 3605 |
| 3618 return gfx::ScrollOffset(); | 3606 return gfx::ScrollOffset(); |
| 3619 } | 3607 } |
| 3620 | 3608 |
| 3621 } // namespace cc | 3609 } // namespace cc |
| OLD | NEW |