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

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: Fixed test 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.
34 const base::Feature kRecordGestureAction = {"RecordGestureActions",
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) {}
33 UserModel::~UserModel() {} 45 UserModel::~UserModel() {}
34 46
35 void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type, 47 void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type,
36 const base::TimeTicks now) { 48 const base::TimeTicks now) {
37 last_input_signal_time_ = now; 49 last_input_signal_time_ = now;
38 if (type == blink::WebInputEvent::TouchStart || 50 if (type == blink::WebInputEvent::TouchStart ||
39 type == blink::WebInputEvent::GestureScrollBegin || 51 type == blink::WebInputEvent::GestureScrollBegin ||
40 type == blink::WebInputEvent::GesturePinchBegin) { 52 type == blink::WebInputEvent::GesturePinchBegin) {
41 // Only update stats once per gesture. 53 // Only update stats once per gesture.
42 if (!is_gesture_active_) { 54 if (!is_gesture_active_) {
43 last_gesture_start_time_ = now; 55 last_gesture_start_time_ = now;
44 56
57 if (base::FeatureList::IsEnabled(features::kRecordGestureAction)) {
alex clarke (OOO till 29th) 2016/03/17 17:11:11 I wonder if it's worth caching this? Sami WDYT?
beaudoin 2016/03/17 17:35:34 Good call. Looking at the code, it's a map<> looku
58 default_task_runner_->PostTask(
59 FROM_HERE,
60 base::Bind(&base::RecordAction,
61 base::UserMetricsAction(
62 "RendererScheduler.UserModel.GestureStart")));
63 }
64
45 RecordGesturePrediction(is_gesture_expected_ 65 RecordGesturePrediction(is_gesture_expected_
46 ? GESTURE_OCCURED_WAS_PREDICTED 66 ? GESTURE_OCCURED_WAS_PREDICTED
47 : GESTURE_OCCURED_BUT_NOT_PREDICTED); 67 : GESTURE_OCCURED_BUT_NOT_PREDICTED);
48 68
49 if (!last_reset_time_.is_null()) { 69 if (!last_reset_time_.is_null()) {
50 base::TimeDelta time_since_reset = now - last_reset_time_; 70 base::TimeDelta time_since_reset = now - last_reset_time_;
51 UMA_HISTOGRAM_MEDIUM_TIMES( 71 UMA_HISTOGRAM_MEDIUM_TIMES(
52 "RendererScheduler.UserModel.GestureStartTimeSinceModelReset", 72 "RendererScheduler.UserModel.GestureStartTimeSinceModelReset",
53 time_since_reset); 73 time_since_reset);
54 } 74 }
(...skipping 29 matching lines...) Expand all
84 // metric that tracks its duration. 104 // metric that tracks its duration.
85 if (type == blink::WebInputEvent::GestureScrollEnd || 105 if (type == blink::WebInputEvent::GestureScrollEnd ||
86 type == blink::WebInputEvent::GesturePinchEnd || 106 type == blink::WebInputEvent::GesturePinchEnd ||
87 type == blink::WebInputEvent::GestureFlingStart || 107 type == blink::WebInputEvent::GestureFlingStart ||
88 type == blink::WebInputEvent::TouchEnd) { 108 type == blink::WebInputEvent::TouchEnd) {
89 // Only update stats once per gesture. 109 // Only update stats once per gesture.
90 if (is_gesture_active_) { 110 if (is_gesture_active_) {
91 base::TimeDelta duration = now - last_gesture_start_time_; 111 base::TimeDelta duration = now - last_gesture_start_time_;
92 UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration", 112 UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration",
93 duration); 113 duration);
114 if (base::FeatureList::IsEnabled(features::kRecordGestureAction)) {
115 default_task_runner_->PostTask(
116 FROM_HERE,
117 base::Bind(&base::RecordAction,
118 base::UserMetricsAction(
119 "RendererScheduler.UserModel.GestureEnd")));
120 }
94 } 121 }
95 is_gesture_active_ = false; 122 is_gesture_active_ = false;
96 } 123 }
97 124
98 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 125 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
99 "is_gesture_active", is_gesture_active_); 126 "is_gesture_active", is_gesture_active_);
100 127
101 pending_input_event_count_++; 128 pending_input_event_count_++;
102 } 129 }
103 130
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 (last_gesture_expected_start_time_ - base::TimeTicks()) 240 (last_gesture_expected_start_time_ - base::TimeTicks())
214 .InMillisecondsF()); 241 .InMillisecondsF());
215 state->SetDouble("last_reset_time", 242 state->SetDouble("last_reset_time",
216 (last_reset_time_ - base::TimeTicks()).InMillisecondsF()); 243 (last_reset_time_ - base::TimeTicks()).InMillisecondsF());
217 state->SetBoolean("is_gesture_expected", is_gesture_expected_); 244 state->SetBoolean("is_gesture_expected", is_gesture_expected_);
218 state->SetBoolean("is_gesture_active", is_gesture_active_); 245 state->SetBoolean("is_gesture_active", is_gesture_active_);
219 state->EndDictionary(); 246 state->EndDictionary();
220 } 247 }
221 248
222 } // namespace scheduler 249 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/renderer/user_model.h ('k') | components/scheduler/renderer/user_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698