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

Side by Side Diff: components/scheduler/renderer/user_model.cc

Issue 1683583002: Report user actions when gesture starts and stops in user_model. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/scheduler/renderer/user_model.h" 5 #include "components/scheduler/renderer/user_model.h"
6 6
7 #include "base/metrics/histogram_macros.h" 7 #include "base/metrics/histogram_macros.h"
8 #include "base/metrics/user_metrics.h"
9 #include "base/single_thread_task_runner.h"
8 10
9 namespace scheduler { 11 namespace scheduler {
10 12
11 namespace { 13 namespace {
12 // This enum is used to back a histogram, and should therefore be treated as 14 // This enum is used to back a histogram, and should therefore be treated as
13 // append-only. 15 // append-only.
14 enum GesturePredictionResult { 16 enum GesturePredictionResult {
15 GESTURE_OCCURED_WAS_PREDICTED = 0, 17 GESTURE_OCCURED_WAS_PREDICTED = 0,
16 GESTURE_OCCURED_BUT_NOT_PREDICTED = 1, 18 GESTURE_OCCURED_BUT_NOT_PREDICTED = 1,
17 GESTURE_PREDICTED_BUT_DID_NOT_OCCUR = 2, 19 GESTURE_PREDICTED_BUT_DID_NOT_OCCUR = 2,
18 GESTURE_PREDICTION_RESULT_COUNT = 3 20 GESTURE_PREDICTION_RESULT_COUNT = 3
19 }; 21 };
20 22
21 void RecordGesturePrediction(GesturePredictionResult result) { 23 void RecordGesturePrediction(GesturePredictionResult result) {
22 UMA_HISTOGRAM_ENUMERATION( 24 UMA_HISTOGRAM_ENUMERATION(
23 "RendererScheduler.UserModel.GesturePredictedCorrectly", result, 25 "RendererScheduler.UserModel.GesturePredictedCorrectly", result,
24 GESTURE_PREDICTION_RESULT_COUNT); 26 GESTURE_PREDICTION_RESULT_COUNT);
25 } 27 }
26 28
27 } // namespace 29 } // namespace
28 30
29 UserModel::UserModel() 31 UserModel::UserModel(
30 : pending_input_event_count_(0), 32 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
33 : task_runner_(task_runner),
34 pending_input_event_count_(0),
31 is_gesture_active_(false), 35 is_gesture_active_(false),
32 is_gesture_expected_(false) {} 36 is_gesture_expected_(false) {}
33 UserModel::~UserModel() {} 37 UserModel::~UserModel() {}
34 38
35 void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type, 39 void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type,
36 const base::TimeTicks now) { 40 const base::TimeTicks now) {
37 last_input_signal_time_ = now; 41 last_input_signal_time_ = now;
38 if (type == blink::WebInputEvent::TouchStart || 42 if (type == blink::WebInputEvent::TouchStart ||
39 type == blink::WebInputEvent::GestureScrollBegin || 43 type == blink::WebInputEvent::GestureScrollBegin ||
40 type == blink::WebInputEvent::GesturePinchBegin) { 44 type == blink::WebInputEvent::GesturePinchBegin) {
41 // Only update stats once per gesture. 45 // Only update stats once per gesture.
42 if (!is_gesture_active_) { 46 if (!is_gesture_active_) {
43 last_gesture_start_time_ = now; 47 last_gesture_start_time_ = now;
44 48
49 // NULL when testing.
Sami 2016/02/10 10:50:40 Could you instead pass in a mock task runner in th
beaudoin 2016/02/11 22:03:27 Done.
50 if (task_runner_) {
51 task_runner_->PostTask(FROM_HERE, base::Bind(&base::RecordAction,
Ilya Sherman 2016/02/09 22:03:25 This is pretty weirdly wrapped -- is this clang-fo
beaudoin 2016/02/11 22:03:27 Forgot to run it, oops. Done.
52 base::UserMetricsAction(
Sami 2016/02/10 10:50:40 Is there a version of UserMetricsAction that takes
Ilya Sherman 2016/02/10 22:43:04 The PostTask delay is only part of the total delay
beaudoin 2016/02/11 15:30:01 [Answered above]
53 "RendererScheduler.UserModel.GestureStart")));
54 }
55
45 RecordGesturePrediction(is_gesture_expected_ 56 RecordGesturePrediction(is_gesture_expected_
46 ? GESTURE_OCCURED_WAS_PREDICTED 57 ? GESTURE_OCCURED_WAS_PREDICTED
47 : GESTURE_OCCURED_BUT_NOT_PREDICTED); 58 : GESTURE_OCCURED_BUT_NOT_PREDICTED);
48 59
49 if (!last_reset_time_.is_null()) { 60 if (!last_reset_time_.is_null()) {
50 base::TimeDelta time_since_reset = now - last_reset_time_; 61 base::TimeDelta time_since_reset = now - last_reset_time_;
51 UMA_HISTOGRAM_MEDIUM_TIMES( 62 UMA_HISTOGRAM_MEDIUM_TIMES(
52 "RendererScheduler.UserModel.GestureStartTimeSinceModelReset", 63 "RendererScheduler.UserModel.GestureStartTimeSinceModelReset",
53 time_since_reset); 64 time_since_reset);
54 } 65 }
(...skipping 29 matching lines...) Expand all
84 // metric that tracks its duration. 95 // metric that tracks its duration.
85 if (type == blink::WebInputEvent::GestureScrollEnd || 96 if (type == blink::WebInputEvent::GestureScrollEnd ||
86 type == blink::WebInputEvent::GesturePinchEnd || 97 type == blink::WebInputEvent::GesturePinchEnd ||
87 type == blink::WebInputEvent::GestureFlingStart || 98 type == blink::WebInputEvent::GestureFlingStart ||
88 type == blink::WebInputEvent::TouchEnd) { 99 type == blink::WebInputEvent::TouchEnd) {
89 // Only update stats once per gesture. 100 // Only update stats once per gesture.
90 if (is_gesture_active_) { 101 if (is_gesture_active_) {
91 base::TimeDelta duration = now - last_gesture_start_time_; 102 base::TimeDelta duration = now - last_gesture_start_time_;
92 UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration", 103 UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration",
93 duration); 104 duration);
105 // NULL when testing.
Ilya Sherman 2016/02/09 22:03:25 Are there any tests that do end up exercising this
alex clarke (OOO till 29th) 2016/02/10 10:17:01 Looks like it would be possible to test this via A
beaudoin 2016/02/11 15:30:01 From a quick look, many tests seems to be called w
106 if (task_runner_) {
107 task_runner_->PostTask(FROM_HERE, base::Bind(&base::RecordAction,
108 base::UserMetricsAction("RendererScheduler.UserModel.GestureEnd")));
109 }
94 } 110 }
95 is_gesture_active_ = false; 111 is_gesture_active_ = false;
96 } 112 }
97 113
98 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 114 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
99 "is_gesture_active", is_gesture_active_); 115 "is_gesture_active", is_gesture_active_);
100 116
101 pending_input_event_count_++; 117 pending_input_event_count_++;
102 } 118 }
103 119
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 (last_gesture_expected_start_time_ - base::TimeTicks()) 229 (last_gesture_expected_start_time_ - base::TimeTicks())
214 .InMillisecondsF()); 230 .InMillisecondsF());
215 state->SetDouble("last_reset_time", 231 state->SetDouble("last_reset_time",
216 (last_reset_time_ - base::TimeTicks()).InMillisecondsF()); 232 (last_reset_time_ - base::TimeTicks()).InMillisecondsF());
217 state->SetBoolean("is_gesture_expected", is_gesture_expected_); 233 state->SetBoolean("is_gesture_expected", is_gesture_expected_);
218 state->SetBoolean("is_gesture_active", is_gesture_active_); 234 state->SetBoolean("is_gesture_active", is_gesture_active_);
219 state->EndDictionary(); 235 state->EndDictionary();
220 } 236 }
221 237
222 } // namespace scheduler 238 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698