| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index c7bcf2ca484f883ab57a95dcddff2050f5a4b57a..504d36efdfa7992b69f0071fb8012e459181b2e8 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -141,12 +141,16 @@ void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) {
|
| TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id);
|
| }
|
|
|
| +bool IsWheelBasedScroll(InputHandler::ScrollInputType type) {
|
| + return type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL;
|
| +}
|
| +
|
| enum ScrollThread { MAIN_THREAD, CC_THREAD };
|
|
|
| void RecordCompositorSlowScrollMetric(InputHandler::ScrollInputType type,
|
| ScrollThread scroll_thread) {
|
| bool scroll_on_main_thread = (scroll_thread == MAIN_THREAD);
|
| - if (type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL) {
|
| + if (IsWheelBasedScroll(type)) {
|
| UMA_HISTOGRAM_BOOLEAN("Renderer4.CompositorWheelScrollUpdateThread",
|
| scroll_on_main_thread);
|
| } else {
|
| @@ -2477,14 +2481,12 @@ InputHandler::ScrollStatus LayerTreeHostImpl::TryScroll(
|
| }
|
| }
|
|
|
| - if (type == InputHandler::WHEEL || type == InputHandler::ANIMATED_WHEEL) {
|
| + if (IsWheelBasedScroll(type) &&
|
| + !active_tree()->settings().use_mouse_wheel_gestures) {
|
| EventListenerProperties event_properties =
|
| active_tree()->event_listener_properties(
|
| EventListenerClass::kMouseWheel);
|
| - if (event_properties == EventListenerProperties::kBlocking ||
|
| - event_properties == EventListenerProperties::kBlockingAndPassive ||
|
| - (!active_tree()->settings().use_mouse_wheel_gestures &&
|
| - event_properties == EventListenerProperties::kPassive)) {
|
| + if (event_properties != EventListenerProperties::kNone) {
|
| TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers");
|
| scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD;
|
| scroll_status.main_thread_scrolling_reasons =
|
| @@ -2622,7 +2624,7 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl(
|
| active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl);
|
| // TODO(majidvp): get rid of wheel_scrolling_ and set is_direct_manipulation
|
| // in input_handler_proxy instead.
|
| - wheel_scrolling_ = (type == WHEEL || type == ANIMATED_WHEEL);
|
| + wheel_scrolling_ = IsWheelBasedScroll(type);
|
| scroll_state->set_is_direct_manipulation(!wheel_scrolling_);
|
| // Invoke |DistributeScrollDelta| even with zero delta and velocity to ensure
|
| // scroll customization callbacks are invoked.
|
| @@ -2694,6 +2696,46 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin(
|
| return ScrollBeginImpl(scroll_state, scrolling_layer_impl, type);
|
| }
|
|
|
| +InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin(
|
| + const gfx::Point& viewport_point) {
|
| + InputHandler::ScrollStatus scroll_status;
|
| + scroll_status.main_thread_scrolling_reasons =
|
| + MainThreadScrollingReason::kNotScrollingOnMain;
|
| + ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
|
| + ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode();
|
| + if (scroll_node) {
|
| + gfx::Vector2dF delta;
|
| +
|
| + if (ScrollAnimationUpdateTarget(scroll_node, delta)) {
|
| + scroll_status.thread = SCROLL_ON_IMPL_THREAD;
|
| + } else {
|
| + scroll_status.thread = SCROLL_IGNORED;
|
| + scroll_status.main_thread_scrolling_reasons =
|
| + MainThreadScrollingReason::kNotScrollable;
|
| + }
|
| + return scroll_status;
|
| + }
|
| + ScrollStateData scroll_state_data;
|
| + scroll_state_data.start_position_x = viewport_point.x();
|
| + scroll_state_data.start_position_y = viewport_point.y();
|
| + scroll_state_data.is_in_inertial_phase = true;
|
| + ScrollState scroll_state(scroll_state_data);
|
| +
|
| + // ScrollAnimated is used for animated wheel scrolls. We find the first layer
|
| + // that can scroll and set up an animation of its scroll offset. Note that
|
| + // this does not currently go through the scroll customization and viewport
|
| + // machinery that ScrollBy uses for non-animated wheel scrolls.
|
| + scroll_status = ScrollBegin(&scroll_state, ANIMATED_WHEEL);
|
| + scroll_node = scroll_tree.CurrentlyScrollingNode();
|
| + if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) {
|
| + ScrollStateData scroll_state_end_data;
|
| + scroll_state_end_data.is_ending = true;
|
| + ScrollState scroll_state_end(scroll_state_end_data);
|
| + ScrollEnd(&scroll_state_end);
|
| + }
|
| + return scroll_status;
|
| +}
|
| +
|
| InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated(
|
| const gfx::Point& viewport_point,
|
| const gfx::Vector2dF& scroll_delta) {
|
|
|