Chromium Code Reviews| 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); |
|
bokan
2017/01/10 18:53:58
Is this because the TODO was resolved?
sahel
2017/01/10 21:10:06
No it's not, it is because this function is only c
| |
| 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); |
|
bokan
2017/01/10 18:53:58
The bug linked with the TODO(jamesr) is still open
sahel
2017/01/10 21:10:06
Similarly, this part of the code was never execute
| |
| 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_) { |
|
bokan
2017/01/10 18:53:58
nit:
if (!gesture_scroll_on_impl_thread_)
ret
sahel
2017/01/10 21:10:06
Done.
| |
| 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; |
|
bokan
2017/01/10 18:53:58
This code is duplicated from below. Instead of cop
sahel
2017/01/10 21:10:06
I initially did that in mouse_wheel_event_queue. I
bokan
2017/01/10 21:25:06
Ok, if it's going away eventually duplication is f
sahel
2017/01/12 18:53:44
Acknowledged.
| |
| 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 } | |
| 651 // End of fling. | |
| 652 cc::ScrollStateData scroll_state_end_data; | |
| 653 scroll_state_end_data.is_ending = true; | |
| 654 cc::ScrollState scroll_state_end(scroll_state_end_data); | |
| 655 input_handler_->ScrollEnd(&scroll_state_end); | |
| 652 | 656 |
| 653 switch (scroll_status.thread) { | 657 return DROP_EVENT; |
| 654 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: | 658 } else { |
| 655 return DID_HANDLE; | 659 return DID_NOT_HANDLE; |
| 656 case cc::InputHandler::SCROLL_IGNORED: | |
| 657 return DROP_EVENT; | |
| 658 default: | |
| 659 return DID_NOT_HANDLE; | |
| 660 } | 660 } |
| 661 | 661 } else { // !touchpad_and_wheel_scroll_latching_enabled_ |
| 662 } else { | |
| 663 cc::ScrollStateData scroll_state_begin_data; | 662 cc::ScrollStateData scroll_state_begin_data; |
| 664 scroll_state_begin_data.position_x = wheel_event.x; | 663 scroll_state_begin_data.position_x = wheel_event.x; |
| 665 scroll_state_begin_data.position_y = wheel_event.y; | 664 scroll_state_begin_data.position_y = wheel_event.y; |
| 666 scroll_state_begin_data.is_beginning = true; | 665 scroll_state_begin_data.is_beginning = true; |
| 667 cc::ScrollState scroll_state_begin(scroll_state_begin_data); | 666 cc::ScrollState scroll_state_begin(scroll_state_begin_data); |
| 668 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( | 667 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( |
| 669 &scroll_state_begin, cc::InputHandler::WHEEL); | 668 &scroll_state_begin, cc::InputHandler::WHEEL); |
| 670 | 669 |
| 671 RecordMainThreadScrollingReasons( | 670 RecordMainThreadScrollingReasons( |
| 672 blink::WebGestureDeviceTouchpad, | 671 blink::WebGestureDeviceTouchpad, |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 873 NOTREACHED(); | 872 NOTREACHED(); |
| 874 return DID_NOT_HANDLE; | 873 return DID_NOT_HANDLE; |
| 875 } | 874 } |
| 876 | 875 |
| 877 #ifndef NDEBUG | 876 #ifndef NDEBUG |
| 878 expect_scroll_update_end_ = false; | 877 expect_scroll_update_end_ = false; |
| 879 #endif | 878 #endif |
| 880 | 879 |
| 881 switch (scroll_status.thread) { | 880 switch (scroll_status.thread) { |
| 882 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { | 881 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { |
| 883 if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) { | 882 if (!touchpad_and_wheel_scroll_latching_enabled_ && |
| 883 gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) { | |
| 884 scroll_state.set_is_ending(true); | 884 scroll_state.set_is_ending(true); |
| 885 input_handler_->ScrollEnd(&scroll_state); | 885 input_handler_->ScrollEnd(&scroll_state); |
| 886 } | 886 } |
| 887 | 887 |
| 888 const float vx = gesture_event.data.flingStart.velocityX; | 888 const float vx = gesture_event.data.flingStart.velocityX; |
| 889 const float vy = gesture_event.data.flingStart.velocityY; | 889 const float vy = gesture_event.data.flingStart.velocityY; |
| 890 current_fling_velocity_ = gfx::Vector2dF(vx, vy); | 890 current_fling_velocity_ = gfx::Vector2dF(vx, vy); |
| 891 DCHECK(!current_fling_velocity_.IsZero()); | 891 DCHECK(!current_fling_velocity_.IsZero()); |
| 892 fling_curve_.reset(client_->CreateFlingAnimationCurve( | 892 fling_curve_.reset(client_->CreateFlingAnimationCurve( |
| 893 gesture_event.sourceDevice, | 893 gesture_event.sourceDevice, |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1409 fling_parameters_.modifiers, | 1409 fling_parameters_.modifiers, |
| 1410 InSecondsF(base::TimeTicks::Now())); | 1410 InSecondsF(base::TimeTicks::Now())); |
| 1411 synthetic_wheel.deltaX = increment.width; | 1411 synthetic_wheel.deltaX = increment.width; |
| 1412 synthetic_wheel.deltaY = increment.height; | 1412 synthetic_wheel.deltaY = increment.height; |
| 1413 synthetic_wheel.hasPreciseScrollingDeltas = true; | 1413 synthetic_wheel.hasPreciseScrollingDeltas = true; |
| 1414 synthetic_wheel.x = fling_parameters_.point.x; | 1414 synthetic_wheel.x = fling_parameters_.point.x; |
| 1415 synthetic_wheel.y = fling_parameters_.point.y; | 1415 synthetic_wheel.y = fling_parameters_.point.y; |
| 1416 synthetic_wheel.globalX = fling_parameters_.globalPoint.x; | 1416 synthetic_wheel.globalX = fling_parameters_.globalPoint.x; |
| 1417 synthetic_wheel.globalY = fling_parameters_.globalPoint.y; | 1417 synthetic_wheel.globalY = fling_parameters_.globalPoint.y; |
| 1418 | 1418 |
| 1419 disposition = ScrollByMouseWheel(synthetic_wheel, properties); | 1419 disposition = FlingScrollByMouseWheel(synthetic_wheel, properties); |
| 1420 | 1420 |
| 1421 // Send the event over to the main thread. | 1421 // Send the event over to the main thread. |
| 1422 if (disposition == DID_HANDLE_NON_BLOCKING) { | 1422 if (disposition == DID_HANDLE_NON_BLOCKING) { |
| 1423 client_->DispatchNonBlockingEventToMainThread( | 1423 client_->DispatchNonBlockingEventToMainThread( |
| 1424 ui::WebInputEventTraits::Clone(synthetic_wheel), ui::LatencyInfo()); | 1424 ui::WebInputEventTraits::Clone(synthetic_wheel), ui::LatencyInfo()); |
| 1425 } | 1425 } |
| 1426 break; | 1426 break; |
| 1427 } | 1427 } |
| 1428 default: | 1428 default: |
| 1429 NOTREACHED(); | 1429 NOTREACHED(); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1539 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, | 1539 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, |
| 1540 scroll_result)); | 1540 scroll_result)); |
| 1541 } | 1541 } |
| 1542 | 1542 |
| 1543 void InputHandlerProxy::SetTickClockForTesting( | 1543 void InputHandlerProxy::SetTickClockForTesting( |
| 1544 std::unique_ptr<base::TickClock> tick_clock) { | 1544 std::unique_ptr<base::TickClock> tick_clock) { |
| 1545 tick_clock_ = std::move(tick_clock); | 1545 tick_clock_ = std::move(tick_clock); |
| 1546 } | 1546 } |
| 1547 | 1547 |
| 1548 } // namespace ui | 1548 } // namespace ui |
| OLD | NEW |