| 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 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| 229 cc::InputHandler::ScrollInputType GestureScrollInputType( | 229 cc::InputHandler::ScrollInputType GestureScrollInputType( |
| 230 blink::WebGestureDevice device) { | 230 blink::WebGestureDevice device) { |
| 231 return device == blink::WebGestureDeviceTouchpad | 231 return device == blink::WebGestureDeviceTouchpad |
| 232 ? cc::InputHandler::WHEEL | 232 ? cc::InputHandler::WHEEL |
| 233 : cc::InputHandler::TOUCHSCREEN; | 233 : cc::InputHandler::TOUCHSCREEN; |
| 234 } | 234 } |
| 235 | 235 |
| 236 enum ScrollingThreadStatus { |
| 237 SCROLLING_ON_COMPOSITOR, |
| 238 SCROLLING_ON_COMPOSITOR_BLOCKED_ON_MAIN, |
| 239 SCROLLING_ON_MAIN, |
| 240 LAST_SCROLLING_THREAD_STATUS_VALUE = SCROLLING_ON_MAIN, |
| 241 }; |
| 242 |
| 236 } // namespace | 243 } // namespace |
| 237 | 244 |
| 238 namespace ui { | 245 namespace ui { |
| 239 | 246 |
| 240 InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler, | 247 InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler, |
| 241 InputHandlerProxyClient* client) | 248 InputHandlerProxyClient* client) |
| 242 : client_(client), | 249 : client_(client), |
| 243 input_handler_(input_handler), | 250 input_handler_(input_handler), |
| 244 deferred_fling_cancel_time_seconds_(0), | 251 deferred_fling_cancel_time_seconds_(0), |
| 245 synchronous_input_handler_(nullptr), | 252 synchronous_input_handler_(nullptr), |
| 246 allow_root_animate_(true), | 253 allow_root_animate_(true), |
| 247 #ifndef NDEBUG | 254 #ifndef NDEBUG |
| 248 expect_scroll_update_end_(false), | 255 expect_scroll_update_end_(false), |
| 249 #endif | 256 #endif |
| 250 gesture_scroll_on_impl_thread_(false), | 257 gesture_scroll_on_impl_thread_(false), |
| 251 gesture_pinch_on_impl_thread_(false), | 258 gesture_pinch_on_impl_thread_(false), |
| 252 fling_may_be_active_on_main_thread_(false), | 259 fling_may_be_active_on_main_thread_(false), |
| 253 disallow_horizontal_fling_scroll_(false), | 260 disallow_horizontal_fling_scroll_(false), |
| 254 disallow_vertical_fling_scroll_(false), | 261 disallow_vertical_fling_scroll_(false), |
| 255 has_fling_animation_started_(false), | 262 has_fling_animation_started_(false), |
| 256 smooth_scroll_enabled_(false), | 263 smooth_scroll_enabled_(false), |
| 257 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), | 264 uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()), |
| 258 touchpad_and_wheel_scroll_latching_enabled_(false), | 265 touchpad_and_wheel_scroll_latching_enabled_(false), |
| 259 touch_start_result_(kEventDispositionUndefined), | 266 touch_start_result_(kEventDispositionUndefined), |
| 267 mouse_wheel_result_(kEventDispositionUndefined), |
| 260 current_overscroll_params_(nullptr), | 268 current_overscroll_params_(nullptr), |
| 261 has_ongoing_compositor_scroll_pinch_(false), | 269 has_ongoing_compositor_scroll_pinch_(false), |
| 262 tick_clock_(base::MakeUnique<base::DefaultTickClock>()) { | 270 tick_clock_(base::MakeUnique<base::DefaultTickClock>()) { |
| 263 DCHECK(client); | 271 DCHECK(client); |
| 264 input_handler_->BindToClient(this); | 272 input_handler_->BindToClient(this); |
| 265 cc::ScrollElasticityHelper* scroll_elasticity_helper = | 273 cc::ScrollElasticityHelper* scroll_elasticity_helper = |
| 266 input_handler_->CreateScrollElasticityHelper(); | 274 input_handler_->CreateScrollElasticityHelper(); |
| 267 if (scroll_elasticity_helper) { | 275 if (scroll_elasticity_helper) { |
| 268 scroll_elasticity_controller_.reset( | 276 scroll_elasticity_controller_.reset( |
| 269 new InputScrollElasticityController(scroll_elasticity_helper)); | 277 new InputScrollElasticityController(scroll_elasticity_helper)); |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 UMA_HISTOGRAM_ENUMERATION(kGestureHistogramName, i + 1, | 587 UMA_HISTOGRAM_ENUMERATION(kGestureHistogramName, i + 1, |
| 580 mainThreadScrollingReasonEnumMax); | 588 mainThreadScrollingReasonEnumMax); |
| 581 } else { | 589 } else { |
| 582 UMA_HISTOGRAM_ENUMERATION(kWheelHistogramName, i + 1, | 590 UMA_HISTOGRAM_ENUMERATION(kWheelHistogramName, i + 1, |
| 583 mainThreadScrollingReasonEnumMax); | 591 mainThreadScrollingReasonEnumMax); |
| 584 } | 592 } |
| 585 } | 593 } |
| 586 } | 594 } |
| 587 } | 595 } |
| 588 | 596 |
| 597 void InputHandlerProxy::RecordScrollingThreadStatus( |
| 598 blink::WebGestureDevice device, |
| 599 uint32_t reasons) { |
| 600 DCHECK(device == blink::WebGestureDeviceTouchpad || |
| 601 device == blink::WebGestureDeviceTouchscreen); |
| 602 |
| 603 if (device != blink::WebGestureDeviceTouchpad && |
| 604 device != blink::WebGestureDeviceTouchscreen) { |
| 605 return; |
| 606 } |
| 607 |
| 608 ScrollingThreadStatus scrolling_thread_status = SCROLLING_ON_MAIN; |
| 609 if (reasons == cc::MainThreadScrollingReason::kNotScrollingOnMain) { |
| 610 int32_t event_disposition_result = |
| 611 (device == blink::WebGestureDeviceTouchpad ? mouse_wheel_result_ |
| 612 : touch_start_result_); |
| 613 switch (event_disposition_result) { |
| 614 case kEventDispositionUndefined: |
| 615 case DID_NOT_HANDLE_NON_BLOCKING_DUE_TO_FLING: |
| 616 case DID_HANDLE_NON_BLOCKING: |
| 617 case DROP_EVENT: |
| 618 scrolling_thread_status = SCROLLING_ON_COMPOSITOR; |
| 619 break; |
| 620 case DID_NOT_HANDLE: |
| 621 scrolling_thread_status = SCROLLING_ON_COMPOSITOR_BLOCKED_ON_MAIN; |
| 622 break; |
| 623 default: |
| 624 NOTREACHED(); |
| 625 scrolling_thread_status = SCROLLING_ON_COMPOSITOR; |
| 626 } |
| 627 } |
| 628 |
| 629 // UMA_HISTOGRAM_ENUMERATION requires that the enum_max must be strictly |
| 630 // greater than the sample value. |
| 631 const uint32_t kScrolingThreadStatusEnumMax = |
| 632 ScrollingThreadStatus::LAST_SCROLLING_THREAD_STATUS_VALUE + 1; |
| 633 |
| 634 if (device == blink::WebGestureDeviceTouchscreen) { |
| 635 UMA_HISTOGRAM_ENUMERATION("Renderer4.GestureScrollingThreadStatus", |
| 636 scrolling_thread_status, |
| 637 kScrolingThreadStatusEnumMax); |
| 638 } else { |
| 639 UMA_HISTOGRAM_ENUMERATION("Renderer4.WheelScrollingThreadStatus", |
| 640 scrolling_thread_status, |
| 641 kScrolingThreadStatusEnumMax); |
| 642 } |
| 643 } |
| 644 |
| 589 bool InputHandlerProxy::ShouldAnimate(bool has_precise_scroll_deltas) const { | 645 bool InputHandlerProxy::ShouldAnimate(bool has_precise_scroll_deltas) const { |
| 590 #if defined(OS_MACOSX) | 646 #if defined(OS_MACOSX) |
| 591 // Mac does not smooth scroll wheel events (crbug.com/574283). | 647 // Mac does not smooth scroll wheel events (crbug.com/574283). |
| 592 return false; | 648 return false; |
| 593 #else | 649 #else |
| 594 return smooth_scroll_enabled_ && !has_precise_scroll_deltas; | 650 return smooth_scroll_enabled_ && !has_precise_scroll_deltas; |
| 595 #endif | 651 #endif |
| 596 } | 652 } |
| 597 | 653 |
| 598 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel( | 654 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel( |
| 599 const WebMouseWheelEvent& wheel_event) { | 655 const WebMouseWheelEvent& wheel_event) { |
| 600 // Only call |CancelCurrentFling()| if a fling was active, as it will | 656 // Only call |CancelCurrentFling()| if a fling was active, as it will |
| 601 // otherwise disrupt an in-progress touch scroll. | 657 // otherwise disrupt an in-progress touch scroll. |
| 602 if (!wheel_event.hasPreciseScrollingDeltas && fling_curve_) | 658 if (!wheel_event.hasPreciseScrollingDeltas && fling_curve_) |
| 603 CancelCurrentFling(); | 659 CancelCurrentFling(); |
| 604 | 660 |
| 661 InputHandlerProxy::EventDisposition result = DROP_EVENT; |
| 605 cc::EventListenerProperties properties = | 662 cc::EventListenerProperties properties = |
| 606 input_handler_->GetEventListenerProperties( | 663 input_handler_->GetEventListenerProperties( |
| 607 cc::EventListenerClass::kMouseWheel); | 664 cc::EventListenerClass::kMouseWheel); |
| 608 switch (properties) { | 665 switch (properties) { |
| 609 case cc::EventListenerProperties::kPassive: | 666 case cc::EventListenerProperties::kPassive: |
| 610 return DID_HANDLE_NON_BLOCKING; | 667 result = DID_HANDLE_NON_BLOCKING; |
| 668 break; |
| 611 case cc::EventListenerProperties::kBlockingAndPassive: | 669 case cc::EventListenerProperties::kBlockingAndPassive: |
| 612 case cc::EventListenerProperties::kBlocking: | 670 case cc::EventListenerProperties::kBlocking: |
| 613 return DID_NOT_HANDLE; | 671 result = DID_NOT_HANDLE; |
| 672 break; |
| 614 case cc::EventListenerProperties::kNone: | 673 case cc::EventListenerProperties::kNone: |
| 615 return DROP_EVENT; | 674 result = DROP_EVENT; |
| 675 break; |
| 616 default: | 676 default: |
| 617 NOTREACHED(); | 677 NOTREACHED(); |
| 618 return DROP_EVENT; | 678 result = DROP_EVENT; |
| 619 } | 679 } |
| 680 |
| 681 mouse_wheel_result_ = result; |
| 682 return result; |
| 620 } | 683 } |
| 621 | 684 |
| 622 InputHandlerProxy::EventDisposition InputHandlerProxy::FlingScrollByMouseWheel( | 685 InputHandlerProxy::EventDisposition InputHandlerProxy::FlingScrollByMouseWheel( |
| 623 const WebMouseWheelEvent& wheel_event, | 686 const WebMouseWheelEvent& wheel_event, |
| 624 cc::EventListenerProperties listener_properties) { | 687 cc::EventListenerProperties listener_properties) { |
| 625 DCHECK(listener_properties == cc::EventListenerProperties::kPassive || | 688 DCHECK(listener_properties == cc::EventListenerProperties::kPassive || |
| 626 listener_properties == cc::EventListenerProperties::kNone); | 689 listener_properties == cc::EventListenerProperties::kNone); |
| 627 | 690 |
| 628 DCHECK(!wheel_event.railsMode); | 691 DCHECK(!wheel_event.railsMode); |
| 629 gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY); | 692 gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 scroll_state_begin_data.position_y = wheel_event.y; | 727 scroll_state_begin_data.position_y = wheel_event.y; |
| 665 scroll_state_begin_data.is_beginning = true; | 728 scroll_state_begin_data.is_beginning = true; |
| 666 cc::ScrollState scroll_state_begin(scroll_state_begin_data); | 729 cc::ScrollState scroll_state_begin(scroll_state_begin_data); |
| 667 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( | 730 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( |
| 668 &scroll_state_begin, cc::InputHandler::WHEEL); | 731 &scroll_state_begin, cc::InputHandler::WHEEL); |
| 669 | 732 |
| 670 RecordMainThreadScrollingReasons( | 733 RecordMainThreadScrollingReasons( |
| 671 blink::WebGestureDeviceTouchpad, | 734 blink::WebGestureDeviceTouchpad, |
| 672 scroll_status.main_thread_scrolling_reasons); | 735 scroll_status.main_thread_scrolling_reasons); |
| 673 | 736 |
| 737 mouse_wheel_result_ = |
| 738 (listener_properties == cc::EventListenerProperties::kPassive) |
| 739 ? DID_HANDLE_NON_BLOCKING |
| 740 : DROP_EVENT; |
| 741 RecordScrollingThreadStatus(blink::WebGestureDeviceTouchpad, |
| 742 scroll_status.main_thread_scrolling_reasons); |
| 743 |
| 674 switch (scroll_status.thread) { | 744 switch (scroll_status.thread) { |
| 675 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { | 745 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { |
| 676 TRACE_EVENT_INSTANT2("input", | 746 TRACE_EVENT_INSTANT2("input", |
| 677 "InputHandlerProxy::handle_input wheel scroll", | 747 "InputHandlerProxy::handle_input wheel scroll", |
| 678 TRACE_EVENT_SCOPE_THREAD, "deltaX", | 748 TRACE_EVENT_SCOPE_THREAD, "deltaX", |
| 679 scroll_delta.x(), "deltaY", scroll_delta.y()); | 749 scroll_delta.x(), "deltaY", scroll_delta.y()); |
| 680 | 750 |
| 681 cc::ScrollStateData scroll_state_update_data; | 751 cc::ScrollStateData scroll_state_update_data; |
| 682 scroll_state_update_data.delta_x = scroll_delta.x(); | 752 scroll_state_update_data.delta_x = scroll_delta.x(); |
| 683 scroll_state_update_data.delta_y = scroll_delta.y(); | 753 scroll_state_update_data.delta_y = scroll_delta.y(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 scroll_status = input_handler_->ScrollBegin( | 816 scroll_status = input_handler_->ScrollBegin( |
| 747 &scroll_state, GestureScrollInputType(gesture_event.sourceDevice)); | 817 &scroll_state, GestureScrollInputType(gesture_event.sourceDevice)); |
| 748 } | 818 } |
| 749 UMA_HISTOGRAM_ENUMERATION("Renderer4.CompositorScrollHitTestResult", | 819 UMA_HISTOGRAM_ENUMERATION("Renderer4.CompositorScrollHitTestResult", |
| 750 scroll_status.thread, | 820 scroll_status.thread, |
| 751 cc::InputHandler::LAST_SCROLL_STATUS + 1); | 821 cc::InputHandler::LAST_SCROLL_STATUS + 1); |
| 752 | 822 |
| 753 RecordMainThreadScrollingReasons(gesture_event.sourceDevice, | 823 RecordMainThreadScrollingReasons(gesture_event.sourceDevice, |
| 754 scroll_status.main_thread_scrolling_reasons); | 824 scroll_status.main_thread_scrolling_reasons); |
| 755 | 825 |
| 826 RecordScrollingThreadStatus(gesture_event.sourceDevice, |
| 827 scroll_status.main_thread_scrolling_reasons); |
| 828 |
| 756 InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE; | 829 InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE; |
| 757 switch (scroll_status.thread) { | 830 switch (scroll_status.thread) { |
| 758 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: | 831 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: |
| 759 TRACE_EVENT_INSTANT0("input", | 832 TRACE_EVENT_INSTANT0("input", |
| 760 "InputHandlerProxy::handle_input gesture scroll", | 833 "InputHandlerProxy::handle_input gesture scroll", |
| 761 TRACE_EVENT_SCOPE_THREAD); | 834 TRACE_EVENT_SCOPE_THREAD); |
| 762 gesture_scroll_on_impl_thread_ = true; | 835 gesture_scroll_on_impl_thread_ = true; |
| 763 result = DID_HANDLE; | 836 result = DID_HANDLE; |
| 764 break; | 837 break; |
| 765 case cc::InputHandler::SCROLL_UNKNOWN: | 838 case cc::InputHandler::SCROLL_UNKNOWN: |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, | 1614 scroll_elasticity_controller_->GetWeakPtr(), gesture_event, |
| 1542 scroll_result)); | 1615 scroll_result)); |
| 1543 } | 1616 } |
| 1544 | 1617 |
| 1545 void InputHandlerProxy::SetTickClockForTesting( | 1618 void InputHandlerProxy::SetTickClockForTesting( |
| 1546 std::unique_ptr<base::TickClock> tick_clock) { | 1619 std::unique_ptr<base::TickClock> tick_clock) { |
| 1547 tick_clock_ = std::move(tick_clock); | 1620 tick_clock_ = std::move(tick_clock); |
| 1548 } | 1621 } |
| 1549 | 1622 |
| 1550 } // namespace ui | 1623 } // namespace ui |
| OLD | NEW |