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

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: Caching feature. Created 4 years, 9 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 namespace features {
30 : pending_input_event_count_(0), 32
33 // Enables the recording of gesture as UMA user actions.
Alexei Svitkine (slow) 2016/03/17 21:38:46 Maybe add a comment about the reasoning for this b
beaudoin 2016/03/18 16:08:36 Done.
34 const base::Feature kRecordGestureAction = {"RecordGestureActions",
Alexei Svitkine (slow) 2016/03/17 21:38:46 Nit: No need for =.
beaudoin 2016/03/18 16:08:36 Done.
35 base::FEATURE_DISABLED_BY_DEFAULT};
36
37 } // namespace features
38
39 UserModel::UserModel(
40 const scoped_refptr<base::SingleThreadTaskRunner>& default_task_runner)
41 : default_task_runner_(default_task_runner),
42 pending_input_event_count_(0),
31 is_gesture_active_(false), 43 is_gesture_active_(false),
32 is_gesture_expected_(false) {} 44 is_gesture_expected_(false),
45 record_gesture_action_(
46 base::FeatureList::IsEnabled(features::kRecordGestureAction)) {}
33 UserModel::~UserModel() {} 47 UserModel::~UserModel() {}
34 48
35 void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type, 49 void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type,
36 const base::TimeTicks now) { 50 const base::TimeTicks now) {
37 last_input_signal_time_ = now; 51 last_input_signal_time_ = now;
38 if (type == blink::WebInputEvent::TouchStart || 52 if (type == blink::WebInputEvent::TouchStart ||
39 type == blink::WebInputEvent::GestureScrollBegin || 53 type == blink::WebInputEvent::GestureScrollBegin ||
40 type == blink::WebInputEvent::GesturePinchBegin) { 54 type == blink::WebInputEvent::GesturePinchBegin) {
41 // Only update stats once per gesture. 55 // Only update stats once per gesture.
42 if (!is_gesture_active_) { 56 if (!is_gesture_active_) {
43 last_gesture_start_time_ = now; 57 last_gesture_start_time_ = now;
44 58
59 if (record_gesture_action_) {
60 default_task_runner_->PostTask(
61 FROM_HERE,
62 base::Bind(&base::RecordAction,
63 base::UserMetricsAction(
64 "RendererScheduler.UserModel.GestureStart")));
65 }
66
45 RecordGesturePrediction(is_gesture_expected_ 67 RecordGesturePrediction(is_gesture_expected_
46 ? GESTURE_OCCURED_WAS_PREDICTED 68 ? GESTURE_OCCURED_WAS_PREDICTED
47 : GESTURE_OCCURED_BUT_NOT_PREDICTED); 69 : GESTURE_OCCURED_BUT_NOT_PREDICTED);
48 70
49 if (!last_reset_time_.is_null()) { 71 if (!last_reset_time_.is_null()) {
50 base::TimeDelta time_since_reset = now - last_reset_time_; 72 base::TimeDelta time_since_reset = now - last_reset_time_;
51 UMA_HISTOGRAM_MEDIUM_TIMES( 73 UMA_HISTOGRAM_MEDIUM_TIMES(
52 "RendererScheduler.UserModel.GestureStartTimeSinceModelReset", 74 "RendererScheduler.UserModel.GestureStartTimeSinceModelReset",
53 time_since_reset); 75 time_since_reset);
54 } 76 }
(...skipping 29 matching lines...) Expand all
84 // metric that tracks its duration. 106 // metric that tracks its duration.
85 if (type == blink::WebInputEvent::GestureScrollEnd || 107 if (type == blink::WebInputEvent::GestureScrollEnd ||
86 type == blink::WebInputEvent::GesturePinchEnd || 108 type == blink::WebInputEvent::GesturePinchEnd ||
87 type == blink::WebInputEvent::GestureFlingStart || 109 type == blink::WebInputEvent::GestureFlingStart ||
88 type == blink::WebInputEvent::TouchEnd) { 110 type == blink::WebInputEvent::TouchEnd) {
89 // Only update stats once per gesture. 111 // Only update stats once per gesture.
90 if (is_gesture_active_) { 112 if (is_gesture_active_) {
91 base::TimeDelta duration = now - last_gesture_start_time_; 113 base::TimeDelta duration = now - last_gesture_start_time_;
92 UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration", 114 UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration",
93 duration); 115 duration);
116 if (record_gesture_action_) {
117 default_task_runner_->PostTask(
118 FROM_HERE,
119 base::Bind(&base::RecordAction,
120 base::UserMetricsAction(
121 "RendererScheduler.UserModel.GestureEnd")));
122 }
94 } 123 }
95 is_gesture_active_ = false; 124 is_gesture_active_ = false;
96 } 125 }
97 126
98 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 127 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
99 "is_gesture_active", is_gesture_active_); 128 "is_gesture_active", is_gesture_active_);
100 129
101 pending_input_event_count_++; 130 pending_input_event_count_++;
102 } 131 }
103 132
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 (last_gesture_expected_start_time_ - base::TimeTicks()) 242 (last_gesture_expected_start_time_ - base::TimeTicks())
214 .InMillisecondsF()); 243 .InMillisecondsF());
215 state->SetDouble("last_reset_time", 244 state->SetDouble("last_reset_time",
216 (last_reset_time_ - base::TimeTicks()).InMillisecondsF()); 245 (last_reset_time_ - base::TimeTicks()).InMillisecondsF());
217 state->SetBoolean("is_gesture_expected", is_gesture_expected_); 246 state->SetBoolean("is_gesture_expected", is_gesture_expected_);
218 state->SetBoolean("is_gesture_active", is_gesture_active_); 247 state->SetBoolean("is_gesture_active", is_gesture_active_);
219 state->EndDictionary(); 248 state->EndDictionary();
220 } 249 }
221 250
222 } // namespace scheduler 251 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698