Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(487)

Side by Side Diff: ui/events/blink/input_handler_proxy.cc

Issue 2651883007: Re-landing "UMA metrics for fractions of wheel and touch scrolls blocked on the main thread." (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/events/blink/input_handler_proxy.h ('k') | ui/events/blink/input_handler_proxy_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « ui/events/blink/input_handler_proxy.h ('k') | ui/events/blink/input_handler_proxy_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698