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

Unified Diff: content/renderer/render_widget.cc

Issue 1474443002: Add UMA metrics to determine the usefulness of passive event listeners. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_passive_uma
Patch Set: Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/metrics/histograms/histograms.xml » ('j') | tools/metrics/histograms/histograms.xml » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_widget.cc
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index a4020cdce464401523d63ee87736c61dc06676f8..394d274d9d4513051702b8bbe15f1687d8b0b5d9 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -241,6 +241,46 @@ void LogInputEventLatencyUma(const WebInputEvent& event, base::TimeTicks now,
}
}
+void LogPassiveLatency(int64 latency) {
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Event.PassiveListeners.Latency", latency, 1,
+ 10000000, 100);
+}
+
+void LogPassiveEventListenersUma(WebInputEventResult result,
+ bool passive,
+ bool cancelable,
+ double event_timestamp,
+ base::TimeTicks now,
+ const ui::LatencyInfo& latency_info) {
+ enum {
+ PASSIVE_LISTENER_UMA_ENUM_PASSIVE,
+ PASSIVE_LISTENER_UMA_ENUM_UNCANCELABLE,
+ PASSIVE_LISTENER_UMA_ENUM_CANCELABLE,
+ PASSIVE_LISTENER_UMA_ENUM_CANCELABLE_AND_CANCELED,
+ PASSIVE_LISTENER_UMA_ENUM_COUNT
+ };
+
+ int enum_value;
+ if (passive)
+ enum_value = PASSIVE_LISTENER_UMA_ENUM_PASSIVE;
+ else if (!cancelable)
+ enum_value = PASSIVE_LISTENER_UMA_ENUM_UNCANCELABLE;
+ else if (result == WebInputEventResult::HandledScript)
+ enum_value = PASSIVE_LISTENER_UMA_ENUM_CANCELABLE_AND_CANCELED;
+ else
+ enum_value = PASSIVE_LISTENER_UMA_ENUM_CANCELABLE;
+
+ UMA_HISTOGRAM_ENUMERATION("Event.PassiveListeners", enum_value,
+ PASSIVE_LISTENER_UMA_ENUM_COUNT);
+
+ if (enum_value == PASSIVE_LISTENER_UMA_ENUM_CANCELABLE && !now.is_null()) {
+ LogPassiveLatency(GetEventLatencyMicros(event_timestamp, now));
+ for (size_t i = 0; i < latency_info.coalesced_events_size(); i++)
+ LogPassiveLatency(GetEventLatencyMicros(
+ latency_info.timestamps_of_coalesced_events()[i], now));
+ }
+}
+
} // namespace
namespace content {
@@ -1093,6 +1133,7 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event,
const ui::LatencyInfo& latency_info) {
if (!input_event)
return;
+ bool passive = false;
tdresser 2015/11/23 21:14:34 Add a comment linking to the bug indicating that t
dtapuska 2015/11/27 20:05:25 Done.
base::AutoReset<bool> handling_input_event_resetter(&handling_input_event_,
true);
base::AutoReset<WebInputEvent::Type> handling_event_type_resetter(
@@ -1178,12 +1219,26 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event,
prevent_default = prevent_default || WillHandleGestureEvent(gesture_event);
}
- bool processed = prevent_default;
+ WebInputEventResult processed =
+ prevent_default ? WebInputEventResult::HandledDefaultHandler
+ : WebInputEventResult::NotHandled;
if (input_event->type != WebInputEvent::Char || !suppress_next_char_events_) {
suppress_next_char_events_ = false;
- if (!processed && webwidget_)
- processed = webwidget_->handleInputEvent(*input_event) !=
- WebInputEventResult::NotHandled;
+ if (processed == WebInputEventResult::NotHandled && webwidget_)
+ processed = webwidget_->handleInputEvent(*input_event);
+ }
+
+ if (input_event->type == WebInputEvent::TouchStart ||
+ input_event->type == WebInputEvent::TouchMove ||
+ input_event->type == WebInputEvent::TouchEnd) {
tdresser 2015/11/23 21:14:34 Does isTouchEventType work for you? https://code.g
dtapuska 2015/11/23 21:33:57 I didn't necessarily want to capture TouchCancel s
+ LogPassiveEventListenersUma(
+ processed, passive,
+ static_cast<const WebTouchEvent*>(input_event)->cancelable,
+ input_event->timeStampSeconds, start_time, latency_info);
+ } else if (input_event->type == WebInputEvent::MouseWheel) {
+ LogPassiveEventListenersUma(processed, passive, !passive,
tdresser 2015/11/23 21:14:34 Does this make it more difficult to draw conclusio
dtapuska 2015/11/23 21:33:57 UMA would only record a non-cancelable event for t
+ input_event->timeStampSeconds, start_time,
+ latency_info);
}
// If this RawKeyDown event corresponds to a browser keyboard shortcut and
@@ -1192,12 +1247,14 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event,
bool is_keyboard_shortcut =
input_event->type == WebInputEvent::RawKeyDown &&
static_cast<const WebKeyboardEvent*>(input_event)->isBrowserShortcut;
- if (!processed && is_keyboard_shortcut)
+ if (processed == WebInputEventResult::NotHandled && is_keyboard_shortcut)
suppress_next_char_events_ = true;
- InputEventAckState ack_result = processed ?
- INPUT_EVENT_ACK_STATE_CONSUMED : INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
- if (!processed && input_event->type == WebInputEvent::TouchStart) {
+ InputEventAckState ack_result = processed == WebInputEventResult::NotHandled
+ ? INPUT_EVENT_ACK_STATE_NOT_CONSUMED
+ : INPUT_EVENT_ACK_STATE_CONSUMED;
+ if (processed == WebInputEventResult::NotHandled &&
+ input_event->type == WebInputEvent::TouchStart) {
const WebTouchEvent& touch_event =
*static_cast<const WebTouchEvent*>(input_event);
// Hit-test for all the pressed touch points. If there is a touch-handler
@@ -1221,7 +1278,7 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event,
static_cast<const WebMouseWheelEvent&>(*input_event),
event_overscroll ? event_overscroll->latest_overscroll_delta
: gfx::Vector2dF(),
- processed);
+ processed != WebInputEventResult::NotHandled);
}
bool frame_pending = compositor_ && compositor_->BeginMainFrameRequested();
@@ -1288,13 +1345,15 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event,
#if defined(OS_ANDROID)
// Allow the IME to be shown when the focus changes as a consequence
// of a processed touch end event.
- if (input_event->type == WebInputEvent::TouchEnd && processed)
+ if (input_event->type == WebInputEvent::TouchEnd &&
+ processed != WebInputEventResult::NotHandled)
tdresser 2015/11/23 21:14:34 I'm a fan of braces when the condition is multi-li
dtapuska 2015/11/23 21:33:57 woops; that is me not checking git cl format.
dtapuska 2015/11/27 20:05:25 Done.
UpdateTextInputState(SHOW_IME_IF_NEEDED, FROM_NON_IME);
#elif defined(USE_AURA)
// Show the virtual keyboard if enabled and a user gesture triggers a focus
// change.
- if (processed && (input_event->type == WebInputEvent::TouchEnd ||
- input_event->type == WebInputEvent::MouseUp)) {
+ if (processed != WebInputEventResult::NotHandled &&
+ (input_event->type == WebInputEvent::TouchEnd ||
+ input_event->type == WebInputEvent::MouseUp)) {
UpdateTextInputState(SHOW_IME_IF_NEEDED, FROM_IME);
}
#endif
@@ -1308,8 +1367,9 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event,
// virtual keyboard.
#if !defined(OS_ANDROID)
// Virtual keyboard is not supported, so react to focus change immediately.
- if (processed && (input_event->type == WebInputEvent::TouchEnd ||
- input_event->type == WebInputEvent::MouseUp)) {
+ if (processed != WebInputEventResult::NotHandled &&
+ (input_event->type == WebInputEvent::TouchEnd ||
+ input_event->type == WebInputEvent::MouseUp)) {
FocusChangeComplete();
}
#endif
« no previous file with comments | « no previous file | tools/metrics/histograms/histograms.xml » ('j') | tools/metrics/histograms/histograms.xml » ('J')

Powered by Google App Engine
This is Rietveld 408576698