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