OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ui/events/blink/input_handler_proxy.h" | 5 #include "ui/events/blink/input_handler_proxy.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 expect_scroll_update_end_(false), | 247 expect_scroll_update_end_(false), |
248 #endif | 248 #endif |
249 gesture_scroll_on_impl_thread_(false), | 249 gesture_scroll_on_impl_thread_(false), |
250 gesture_pinch_on_impl_thread_(false), | 250 gesture_pinch_on_impl_thread_(false), |
251 fling_may_be_active_on_main_thread_(false), | 251 fling_may_be_active_on_main_thread_(false), |
252 disallow_horizontal_fling_scroll_(false), | 252 disallow_horizontal_fling_scroll_(false), |
253 disallow_vertical_fling_scroll_(false), | 253 disallow_vertical_fling_scroll_(false), |
254 has_fling_animation_started_(false), | 254 has_fling_animation_started_(false), |
255 smooth_scroll_enabled_(false), | 255 smooth_scroll_enabled_(false), |
256 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), | 256 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), |
257 touchpad_and_wheel_scroll_latching_enabled_(false), | |
258 touch_start_result_(kEventDispositionUndefined), | 257 touch_start_result_(kEventDispositionUndefined), |
259 current_overscroll_params_(nullptr), | 258 current_overscroll_params_(nullptr), |
260 has_ongoing_compositor_scroll_pinch_(false), | 259 has_ongoing_compositor_scroll_pinch_(false), |
261 tick_clock_(base::MakeUnique<base::DefaultTickClock>()) { | 260 tick_clock_(base::MakeUnique<base::DefaultTickClock>()) { |
262 DCHECK(client); | 261 DCHECK(client); |
263 input_handler_->BindToClient(this); | 262 input_handler_->BindToClient(this); |
264 cc::ScrollElasticityHelper* scroll_elasticity_helper = | 263 cc::ScrollElasticityHelper* scroll_elasticity_helper = |
265 input_handler_->CreateScrollElasticityHelper(); | 264 input_handler_->CreateScrollElasticityHelper(); |
266 if (scroll_elasticity_helper) { | 265 if (scroll_elasticity_helper) { |
267 scroll_elasticity_controller_.reset( | 266 scroll_elasticity_controller_.reset( |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 case cc::EventListenerProperties::kBlocking: | 606 case cc::EventListenerProperties::kBlocking: |
608 return DID_NOT_HANDLE; | 607 return DID_NOT_HANDLE; |
609 case cc::EventListenerProperties::kNone: | 608 case cc::EventListenerProperties::kNone: |
610 return DROP_EVENT; | 609 return DROP_EVENT; |
611 default: | 610 default: |
612 NOTREACHED(); | 611 NOTREACHED(); |
613 return DROP_EVENT; | 612 return DROP_EVENT; |
614 } | 613 } |
615 } | 614 } |
616 | 615 |
617 InputHandlerProxy::EventDisposition InputHandlerProxy::FlingScrollByMouseWheel( | 616 InputHandlerProxy::EventDisposition InputHandlerProxy::ScrollByMouseWheel( |
618 const WebMouseWheelEvent& wheel_event, | 617 const WebMouseWheelEvent& wheel_event, |
619 cc::EventListenerProperties listener_properties) { | 618 cc::EventListenerProperties listener_properties) { |
620 DCHECK(listener_properties == cc::EventListenerProperties::kPassive || | 619 DCHECK(listener_properties == cc::EventListenerProperties::kPassive || |
621 listener_properties == cc::EventListenerProperties::kNone); | 620 listener_properties == cc::EventListenerProperties::kNone); |
622 | 621 |
623 DCHECK(!wheel_event.railsMode); | 622 // TODO(ccameron): The rail information should be pushed down into |
624 gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY); | 623 // InputHandler. |
| 624 gfx::Vector2dF scroll_delta( |
| 625 wheel_event.railsMode != WebInputEvent::RailsModeVertical |
| 626 ? -wheel_event.deltaX |
| 627 : 0, |
| 628 wheel_event.railsMode != WebInputEvent::RailsModeHorizontal |
| 629 ? -wheel_event.deltaY |
| 630 : 0); |
625 | 631 |
626 DCHECK(!wheel_event.scrollByPage); | 632 if (wheel_event.scrollByPage) { |
627 DCHECK(wheel_event.hasPreciseScrollingDeltas); | 633 // TODO(jamesr): We don't properly handle scroll by page in the compositor |
628 if (touchpad_and_wheel_scroll_latching_enabled_) { | 634 // thread, so punt it to the main thread. http://crbug.com/236639 |
629 if (gesture_scroll_on_impl_thread_) { | 635 RecordMainThreadScrollingReasons( |
630 TRACE_EVENT_INSTANT2("input", | 636 blink::WebGestureDeviceTouchpad, |
631 "InputHandlerProxy::handle_input wheel scroll", | 637 cc::MainThreadScrollingReason::kPageBasedScrolling); |
632 TRACE_EVENT_SCOPE_THREAD, "deltaX", scroll_delta.x(), | 638 return DID_NOT_HANDLE; |
633 "deltaY", scroll_delta.y()); | |
634 | 639 |
635 cc::ScrollStateData scroll_state_update_data; | 640 } else if (ShouldAnimate(wheel_event.hasPreciseScrollingDeltas)) { |
636 scroll_state_update_data.delta_x = scroll_delta.x(); | 641 base::TimeTicks event_time = |
637 scroll_state_update_data.delta_y = scroll_delta.y(); | 642 base::TimeTicks() + |
638 scroll_state_update_data.position_x = wheel_event.x; | 643 base::TimeDelta::FromSecondsD(wheel_event.timeStampSeconds); |
639 scroll_state_update_data.position_y = wheel_event.y; | 644 base::TimeDelta delay = base::TimeTicks::Now() - event_time; |
640 cc::ScrollState scroll_state_update(scroll_state_update_data); | 645 cc::InputHandler::ScrollStatus scroll_status = |
| 646 input_handler_->ScrollAnimated(gfx::Point(wheel_event.x, wheel_event.y), |
| 647 scroll_delta, delay); |
641 | 648 |
642 cc::InputHandlerScrollResult scroll_result = | 649 RecordMainThreadScrollingReasons( |
643 input_handler_->ScrollBy(&scroll_state_update); | 650 blink::WebGestureDeviceTouchpad, |
644 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), scroll_result, | 651 scroll_status.main_thread_scrolling_reasons); |
645 false); | |
646 if (scroll_result.did_scroll) { | |
647 return listener_properties == cc::EventListenerProperties::kPassive | |
648 ? DID_HANDLE_NON_BLOCKING | |
649 : DID_HANDLE; | |
650 } | |
651 | 652 |
652 return DROP_EVENT; | 653 switch (scroll_status.thread) { |
653 } else { | 654 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: |
654 return DID_NOT_HANDLE; | 655 return DID_HANDLE; |
| 656 case cc::InputHandler::SCROLL_IGNORED: |
| 657 return DROP_EVENT; |
| 658 default: |
| 659 return DID_NOT_HANDLE; |
655 } | 660 } |
656 } else { // !touchpad_and_wheel_scroll_latching_enabled_ | 661 |
| 662 } else { |
657 cc::ScrollStateData scroll_state_begin_data; | 663 cc::ScrollStateData scroll_state_begin_data; |
658 scroll_state_begin_data.position_x = wheel_event.x; | 664 scroll_state_begin_data.position_x = wheel_event.x; |
659 scroll_state_begin_data.position_y = wheel_event.y; | 665 scroll_state_begin_data.position_y = wheel_event.y; |
660 scroll_state_begin_data.is_beginning = true; | 666 scroll_state_begin_data.is_beginning = true; |
661 cc::ScrollState scroll_state_begin(scroll_state_begin_data); | 667 cc::ScrollState scroll_state_begin(scroll_state_begin_data); |
662 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( | 668 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( |
663 &scroll_state_begin, cc::InputHandler::WHEEL); | 669 &scroll_state_begin, cc::InputHandler::WHEEL); |
664 | 670 |
665 RecordMainThreadScrollingReasons( | 671 RecordMainThreadScrollingReasons( |
666 blink::WebGestureDeviceTouchpad, | 672 blink::WebGestureDeviceTouchpad, |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 NOTREACHED(); | 873 NOTREACHED(); |
868 return DID_NOT_HANDLE; | 874 return DID_NOT_HANDLE; |
869 } | 875 } |
870 | 876 |
871 #ifndef NDEBUG | 877 #ifndef NDEBUG |
872 expect_scroll_update_end_ = false; | 878 expect_scroll_update_end_ = false; |
873 #endif | 879 #endif |
874 | 880 |
875 switch (scroll_status.thread) { | 881 switch (scroll_status.thread) { |
876 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { | 882 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { |
877 if (!touchpad_and_wheel_scroll_latching_enabled_ && | 883 if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) { |
878 gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) { | |
879 scroll_state.set_is_ending(true); | 884 scroll_state.set_is_ending(true); |
880 input_handler_->ScrollEnd(&scroll_state); | 885 input_handler_->ScrollEnd(&scroll_state); |
881 } | 886 } |
882 | 887 |
883 const float vx = gesture_event.data.flingStart.velocityX; | 888 const float vx = gesture_event.data.flingStart.velocityX; |
884 const float vy = gesture_event.data.flingStart.velocityY; | 889 const float vy = gesture_event.data.flingStart.velocityY; |
885 current_fling_velocity_ = gfx::Vector2dF(vx, vy); | 890 current_fling_velocity_ = gfx::Vector2dF(vx, vy); |
886 DCHECK(!current_fling_velocity_.IsZero()); | 891 DCHECK(!current_fling_velocity_.IsZero()); |
887 fling_curve_.reset(client_->CreateFlingAnimationCurve( | 892 fling_curve_.reset(client_->CreateFlingAnimationCurve( |
888 gesture_event.sourceDevice, | 893 gesture_event.sourceDevice, |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 if (CancelCurrentFlingWithoutNotifyingClient()) { | 1338 if (CancelCurrentFlingWithoutNotifyingClient()) { |
1334 client_->DidStopFlinging(); | 1339 client_->DidStopFlinging(); |
1335 return true; | 1340 return true; |
1336 } | 1341 } |
1337 return false; | 1342 return false; |
1338 } | 1343 } |
1339 | 1344 |
1340 bool InputHandlerProxy::CancelCurrentFlingWithoutNotifyingClient() { | 1345 bool InputHandlerProxy::CancelCurrentFlingWithoutNotifyingClient() { |
1341 bool had_fling_animation = !!fling_curve_; | 1346 bool had_fling_animation = !!fling_curve_; |
1342 if (had_fling_animation && | 1347 if (had_fling_animation && |
1343 (fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen || | 1348 fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen) { |
1344 (touchpad_and_wheel_scroll_latching_enabled_ && | |
1345 fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchpad))) { | |
1346 cc::ScrollStateData scroll_state_data; | 1349 cc::ScrollStateData scroll_state_data; |
1347 scroll_state_data.is_ending = true; | 1350 scroll_state_data.is_ending = true; |
1348 cc::ScrollState scroll_state(scroll_state_data); | 1351 cc::ScrollState scroll_state(scroll_state_data); |
1349 input_handler_->ScrollEnd(&scroll_state); | 1352 input_handler_->ScrollEnd(&scroll_state); |
1350 TRACE_EVENT_ASYNC_END0( | 1353 TRACE_EVENT_ASYNC_END0( |
1351 "input", | 1354 "input", |
1352 "InputHandlerProxy::HandleGestureFling::started", | 1355 "InputHandlerProxy::HandleGestureFling::started", |
1353 this); | 1356 this); |
1354 } | 1357 } |
1355 | 1358 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 fling_parameters_.modifiers, | 1409 fling_parameters_.modifiers, |
1407 InSecondsF(base::TimeTicks::Now())); | 1410 InSecondsF(base::TimeTicks::Now())); |
1408 synthetic_wheel.deltaX = increment.width; | 1411 synthetic_wheel.deltaX = increment.width; |
1409 synthetic_wheel.deltaY = increment.height; | 1412 synthetic_wheel.deltaY = increment.height; |
1410 synthetic_wheel.hasPreciseScrollingDeltas = true; | 1413 synthetic_wheel.hasPreciseScrollingDeltas = true; |
1411 synthetic_wheel.x = fling_parameters_.point.x; | 1414 synthetic_wheel.x = fling_parameters_.point.x; |
1412 synthetic_wheel.y = fling_parameters_.point.y; | 1415 synthetic_wheel.y = fling_parameters_.point.y; |
1413 synthetic_wheel.globalX = fling_parameters_.globalPoint.x; | 1416 synthetic_wheel.globalX = fling_parameters_.globalPoint.x; |
1414 synthetic_wheel.globalY = fling_parameters_.globalPoint.y; | 1417 synthetic_wheel.globalY = fling_parameters_.globalPoint.y; |
1415 | 1418 |
1416 disposition = FlingScrollByMouseWheel(synthetic_wheel, properties); | 1419 disposition = ScrollByMouseWheel(synthetic_wheel, properties); |
1417 | 1420 |
1418 // Send the event over to the main thread. | 1421 // Send the event over to the main thread. |
1419 if (disposition == DID_HANDLE_NON_BLOCKING) { | 1422 if (disposition == DID_HANDLE_NON_BLOCKING) { |
1420 client_->DispatchNonBlockingEventToMainThread( | 1423 client_->DispatchNonBlockingEventToMainThread( |
1421 ui::WebInputEventTraits::Clone(synthetic_wheel), ui::LatencyInfo()); | 1424 ui::WebInputEventTraits::Clone(synthetic_wheel), ui::LatencyInfo()); |
1422 } | 1425 } |
1423 break; | 1426 break; |
1424 } | 1427 } |
1425 default: | 1428 default: |
1426 NOTREACHED(); | 1429 NOTREACHED(); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1536 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, | 1539 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, |
1537 scroll_result)); | 1540 scroll_result)); |
1538 } | 1541 } |
1539 | 1542 |
1540 void InputHandlerProxy::SetTickClockForTesting( | 1543 void InputHandlerProxy::SetTickClockForTesting( |
1541 std::unique_ptr<base::TickClock> tick_clock) { | 1544 std::unique_ptr<base::TickClock> tick_clock) { |
1542 tick_clock_ = std::move(tick_clock); | 1545 tick_clock_ = std::move(tick_clock); |
1543 } | 1546 } |
1544 | 1547 |
1545 } // namespace ui | 1548 } // namespace ui |
OLD | NEW |