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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { | 134 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { |
135 if (visible) { | 135 if (visible) { |
136 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id, | 136 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id, |
137 "LayerTreeHostImpl", id); | 137 "LayerTreeHostImpl", id); |
138 return; | 138 return; |
139 } | 139 } |
140 | 140 |
141 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id); | 141 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id); |
142 } | 142 } |
143 | 143 |
| 144 bool IsWheelBasedScroll(InputHandler::ScrollInputType type) { |
| 145 return type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL; |
| 146 } |
| 147 |
144 enum ScrollThread { MAIN_THREAD, CC_THREAD }; | 148 enum ScrollThread { MAIN_THREAD, CC_THREAD }; |
145 | 149 |
146 void RecordCompositorSlowScrollMetric(InputHandler::ScrollInputType type, | 150 void RecordCompositorSlowScrollMetric(InputHandler::ScrollInputType type, |
147 ScrollThread scroll_thread) { | 151 ScrollThread scroll_thread) { |
148 bool scroll_on_main_thread = (scroll_thread == MAIN_THREAD); | 152 bool scroll_on_main_thread = (scroll_thread == MAIN_THREAD); |
149 if (type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL) { | 153 if (IsWheelBasedScroll(type)) { |
150 UMA_HISTOGRAM_BOOLEAN("Renderer4.CompositorWheelScrollUpdateThread", | 154 UMA_HISTOGRAM_BOOLEAN("Renderer4.CompositorWheelScrollUpdateThread", |
151 scroll_on_main_thread); | 155 scroll_on_main_thread); |
152 } else { | 156 } else { |
153 UMA_HISTOGRAM_BOOLEAN("Renderer4.CompositorTouchScrollUpdateThread", | 157 UMA_HISTOGRAM_BOOLEAN("Renderer4.CompositorTouchScrollUpdateThread", |
154 scroll_on_main_thread); | 158 scroll_on_main_thread); |
155 } | 159 } |
156 } | 160 } |
157 | 161 |
158 } // namespace | 162 } // namespace |
159 | 163 |
(...skipping 2310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2470 .Contains(gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { | 2474 .Contains(gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { |
2471 TRACE_EVENT0("cc", | 2475 TRACE_EVENT0("cc", |
2472 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); | 2476 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); |
2473 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 2477 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
2474 scroll_status.main_thread_scrolling_reasons = | 2478 scroll_status.main_thread_scrolling_reasons = |
2475 MainThreadScrollingReason::kNonFastScrollableRegion; | 2479 MainThreadScrollingReason::kNonFastScrollableRegion; |
2476 return scroll_status; | 2480 return scroll_status; |
2477 } | 2481 } |
2478 } | 2482 } |
2479 | 2483 |
2480 if (type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL) { | 2484 if (IsWheelBasedScroll(type) && |
| 2485 !active_tree()->settings().use_mouse_wheel_gestures) { |
2481 EventListenerProperties event_properties = | 2486 EventListenerProperties event_properties = |
2482 active_tree()->event_listener_properties( | 2487 active_tree()->event_listener_properties( |
2483 EventListenerClass::kMouseWheel); | 2488 EventListenerClass::kMouseWheel); |
2484 if (event_properties == EventListenerProperties::kBlocking || | 2489 if (event_properties != EventListenerProperties::kNone) { |
2485 event_properties == EventListenerProperties::kBlockingAndPassive || | |
2486 (!active_tree()->settings().use_mouse_wheel_gestures && | |
2487 event_properties == EventListenerProperties::kPassive)) { | |
2488 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); | 2490 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); |
2489 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 2491 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
2490 scroll_status.main_thread_scrolling_reasons = | 2492 scroll_status.main_thread_scrolling_reasons = |
2491 MainThreadScrollingReason::kEventHandlers; | 2493 MainThreadScrollingReason::kEventHandlers; |
2492 return scroll_status; | 2494 return scroll_status; |
2493 } | 2495 } |
2494 } | 2496 } |
2495 | 2497 |
2496 if (!scroll_node->data.scrollable) { | 2498 if (!scroll_node->data.scrollable) { |
2497 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); | 2499 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2615 return scroll_status; | 2617 return scroll_status; |
2616 } | 2618 } |
2617 scroll_status.thread = SCROLL_ON_IMPL_THREAD; | 2619 scroll_status.thread = SCROLL_ON_IMPL_THREAD; |
2618 ScrollAnimationAbort(scrolling_layer_impl); | 2620 ScrollAnimationAbort(scrolling_layer_impl); |
2619 | 2621 |
2620 top_controls_manager_->ScrollBegin(); | 2622 top_controls_manager_->ScrollBegin(); |
2621 | 2623 |
2622 active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl); | 2624 active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl); |
2623 // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation | 2625 // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation |
2624 // in input_handler_proxy instead. | 2626 // in input_handler_proxy instead. |
2625 wheel_scrolling_ = (type == WHEEL || type == ANIMATED_WHEEL); | 2627 wheel_scrolling_ = IsWheelBasedScroll(type); |
2626 scroll_state->set_is_direct_manipulation(!wheel_scrolling_); | 2628 scroll_state->set_is_direct_manipulation(!wheel_scrolling_); |
2627 // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure | 2629 // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure |
2628 // scroll customization callbacks are invoked. | 2630 // scroll customization callbacks are invoked. |
2629 DistributeScrollDelta(scroll_state); | 2631 DistributeScrollDelta(scroll_state); |
2630 | 2632 |
2631 client_->RenewTreePriority(); | 2633 client_->RenewTreePriority(); |
2632 RecordCompositorSlowScrollMetric(type, CC_THREAD); | 2634 RecordCompositorSlowScrollMetric(type, CC_THREAD); |
2633 | 2635 |
2634 return scroll_status; | 2636 return scroll_status; |
2635 } | 2637 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2687 if (scroll_on_main_thread) { | 2689 if (scroll_on_main_thread) { |
2688 RecordCompositorSlowScrollMetric(type, MAIN_THREAD); | 2690 RecordCompositorSlowScrollMetric(type, MAIN_THREAD); |
2689 | 2691 |
2690 scroll_status.thread = SCROLL_ON_MAIN_THREAD; | 2692 scroll_status.thread = SCROLL_ON_MAIN_THREAD; |
2691 return scroll_status; | 2693 return scroll_status; |
2692 } | 2694 } |
2693 | 2695 |
2694 return ScrollBeginImpl(scroll_state, scrolling_layer_impl, type); | 2696 return ScrollBeginImpl(scroll_state, scrolling_layer_impl, type); |
2695 } | 2697 } |
2696 | 2698 |
| 2699 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin( |
| 2700 const gfx::Point& viewport_point) { |
| 2701 InputHandler::ScrollStatus scroll_status; |
| 2702 scroll_status.main_thread_scrolling_reasons = |
| 2703 MainThreadScrollingReason::kNotScrollingOnMain; |
| 2704 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
| 2705 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
| 2706 if (scroll_node) { |
| 2707 gfx::Vector2dF delta; |
| 2708 |
| 2709 if (ScrollAnimationUpdateTarget(scroll_node, delta)) { |
| 2710 scroll_status.thread = SCROLL_ON_IMPL_THREAD; |
| 2711 } else { |
| 2712 scroll_status.thread = SCROLL_IGNORED; |
| 2713 scroll_status.main_thread_scrolling_reasons = |
| 2714 MainThreadScrollingReason::kNotScrollable; |
| 2715 } |
| 2716 return scroll_status; |
| 2717 } |
| 2718 ScrollStateData scroll_state_data; |
| 2719 scroll_state_data.start_position_x = viewport_point.x(); |
| 2720 scroll_state_data.start_position_y = viewport_point.y(); |
| 2721 scroll_state_data.is_in_inertial_phase = true; |
| 2722 ScrollState scroll_state(scroll_state_data); |
| 2723 |
| 2724 // ScrollAnimated is used for animated wheel scrolls. We find the first layer |
| 2725 // that can scroll and set up an animation of its scroll offset. Note that |
| 2726 // this does not currently go through the scroll customization and viewport |
| 2727 // machinery that ScrollBy uses for non-animated wheel scrolls. |
| 2728 scroll_status = ScrollBegin(&scroll_state, ANIMATED_WHEEL); |
| 2729 scroll_node = scroll_tree.CurrentlyScrollingNode(); |
| 2730 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { |
| 2731 ScrollStateData scroll_state_end_data; |
| 2732 scroll_state_end_data.is_ending = true; |
| 2733 ScrollState scroll_state_end(scroll_state_end_data); |
| 2734 ScrollEnd(&scroll_state_end); |
| 2735 } |
| 2736 return scroll_status; |
| 2737 } |
| 2738 |
2697 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( | 2739 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
2698 const gfx::Point& viewport_point, | 2740 const gfx::Point& viewport_point, |
2699 const gfx::Vector2dF& scroll_delta) { | 2741 const gfx::Vector2dF& scroll_delta) { |
2700 InputHandler::ScrollStatus scroll_status; | 2742 InputHandler::ScrollStatus scroll_status; |
2701 scroll_status.main_thread_scrolling_reasons = | 2743 scroll_status.main_thread_scrolling_reasons = |
2702 MainThreadScrollingReason::kNotScrollingOnMain; | 2744 MainThreadScrollingReason::kNotScrollingOnMain; |
2703 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 2745 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
2704 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 2746 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
2705 if (scroll_node) { | 2747 if (scroll_node) { |
2706 gfx::Vector2dF delta = scroll_delta; | 2748 gfx::Vector2dF delta = scroll_delta; |
(...skipping 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3963 return task_runner_provider_->HasImplThread(); | 4005 return task_runner_provider_->HasImplThread(); |
3964 } | 4006 } |
3965 | 4007 |
3966 bool LayerTreeHostImpl::CommitToActiveTree() const { | 4008 bool LayerTreeHostImpl::CommitToActiveTree() const { |
3967 // In single threaded mode we skip the pending tree and commit directly to the | 4009 // In single threaded mode we skip the pending tree and commit directly to the |
3968 // active tree. | 4010 // active tree. |
3969 return !task_runner_provider_->HasImplThread(); | 4011 return !task_runner_provider_->HasImplThread(); |
3970 } | 4012 } |
3971 | 4013 |
3972 } // namespace cc | 4014 } // namespace cc |
OLD | NEW |