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

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

Issue 1320633002: Optimize for TouchStart responsiveness (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix small bug in UpdateForInputEventOnCompositorThread Created 5 years, 3 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/scheduler/renderer/user_model.h"
6
7 #include "base/test/simple_test_tick_clock.h"
8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace scheduler {
12
13 class UserModelTest : public testing::Test {
14 public:
15 UserModelTest() {}
16 ~UserModelTest() override {}
17
18 void SetUp() override {
19 clock_.reset(new base::SimpleTestTickClock());
20 clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
21
22 user_model_.reset(new UserModel());
23 }
24
25 protected:
26 static base::TimeDelta priority_escalation_after_input_duration() {
27 return base::TimeDelta::FromMilliseconds(
28 UserModel::kPriorityEscalationAfterInputMillis);
29 }
30
31 static base::TimeDelta subsequent_input_expected_after_input_duration() {
32 return base::TimeDelta::FromMilliseconds(
33 UserModel::kExpectSubsequentInputMillis);
34 }
35
36 static base::TimeDelta minimum_typical_scroll_duration_millis() {
37 return base::TimeDelta::FromMilliseconds(
38 UserModel::kMinimumTypicalScrollDurationMillis);
39 }
40
41 scoped_ptr<base::SimpleTestTickClock> clock_;
42 scoped_ptr<UserModel> user_model_;
43 };
44
45 TEST_F(UserModelTest, TimeLeftInInputEscalatedPolicy_NoInput) {
46 EXPECT_EQ(base::TimeDelta(),
47 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
48 }
49
50 TEST_F(UserModelTest, TimeLeftInInputEscalatedPolicy_ImmediatelyAfterInput) {
51 user_model_->DidStartProcessingInputEvent(
52 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
53 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
54 EXPECT_EQ(priority_escalation_after_input_duration(),
55 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
56 }
57
58 TEST_F(UserModelTest, TimeLeftInInputEscalatedPolicy_ShortlyAfterInput) {
59 user_model_->DidStartProcessingInputEvent(
60 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
61 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
62 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
63 clock_->Advance(delta);
64 EXPECT_EQ(priority_escalation_after_input_duration() - delta,
65 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
66 }
67
68 TEST_F(UserModelTest, TimeLeftInInputEscalatedPolicy_LongAfterInput) {
69 user_model_->DidStartProcessingInputEvent(
70 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
71 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
72 clock_->Advance(priority_escalation_after_input_duration() * 2);
73 EXPECT_EQ(base::TimeDelta(),
74 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
75 }
76
77 TEST_F(UserModelTest, DidFinishProcessingInputEvent_Delayed) {
78 user_model_->DidStartProcessingInputEvent(
79 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
80 clock_->Advance(priority_escalation_after_input_duration() * 10);
81
82 EXPECT_EQ(priority_escalation_after_input_duration(),
83 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
84
85 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
86 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
87 clock_->Advance(delta);
88
89 EXPECT_EQ(priority_escalation_after_input_duration() - delta,
90 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
91 }
92
93 TEST_F(UserModelTest, TouchStartExpectedSoon_UseCase_NONE_NoRecentInput) {
94 base::TimeDelta prediction_valid_duration;
95 EXPECT_FALSE(user_model_->IsTouchStartExpectedSoon(
96 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
97 &prediction_valid_duration));
98 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
99 }
100
101 TEST_F(UserModelTest,
102 TouchStartExpectedSoon_UseCase_NONE_ImmediatelyAfterInput) {
103 user_model_->DidStartProcessingInputEvent(
104 blink::WebInputEvent::Type::TouchEnd, clock_->NowTicks());
105 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
106
107 base::TimeDelta prediction_valid_duration;
108 EXPECT_TRUE(user_model_->IsTouchStartExpectedSoon(
109 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
110 &prediction_valid_duration));
111 EXPECT_EQ(subsequent_input_expected_after_input_duration(),
112 prediction_valid_duration);
113 }
114
115 TEST_F(UserModelTest, TouchStartExpectedSoon_UseCase_NONE_ShortlyAfterInput) {
116 user_model_->DidStartProcessingInputEvent(
117 blink::WebInputEvent::Type::TouchEnd, clock_->NowTicks());
118 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
119
120 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
121 clock_->Advance(delta);
122
123 base::TimeDelta prediction_valid_duration;
124 EXPECT_TRUE(user_model_->IsTouchStartExpectedSoon(
125 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
126 &prediction_valid_duration));
127 EXPECT_EQ(subsequent_input_expected_after_input_duration() - delta,
128 prediction_valid_duration);
129 }
130
131 TEST_F(UserModelTest, TouchStartExpectedSoon_UseCase_NONE_LongAfterInput) {
132 user_model_->DidStartProcessingInputEvent(
133 blink::WebInputEvent::Type::TouchEnd, clock_->NowTicks());
134 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
135 clock_->Advance(subsequent_input_expected_after_input_duration() * 2);
136
137 base::TimeDelta prediction_valid_duration;
138 EXPECT_FALSE(user_model_->IsTouchStartExpectedSoon(
139 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
140 &prediction_valid_duration));
141 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
142 }
143
144 TEST_F(UserModelTest,
145 TouchStartExpectedSoon_COMPOSITOR_GESTURE_ImmediatelyAfterInput) {
146 user_model_->DidStartProcessingInputEvent(
147 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
148 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
149
150 base::TimeDelta prediction_valid_duration;
151 EXPECT_FALSE(user_model_->IsTouchStartExpectedSoon(
152 RendererScheduler::UseCase::COMPOSITOR_GESTURE, clock_->NowTicks(),
153 &prediction_valid_duration));
154 EXPECT_EQ(minimum_typical_scroll_duration_millis(),
155 prediction_valid_duration);
156 }
157
158 TEST_F(UserModelTest,
159 TouchStartExpectedSoon_COMPOSITOR_GESTURE_ShortlyAfterInput) {
160 user_model_->DidStartProcessingInputEvent(
161 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
162 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
163
164 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
165 clock_->Advance(delta);
166
167 base::TimeDelta prediction_valid_duration;
168 EXPECT_FALSE(user_model_->IsTouchStartExpectedSoon(
169 RendererScheduler::UseCase::COMPOSITOR_GESTURE, clock_->NowTicks(),
170 &prediction_valid_duration));
171 EXPECT_EQ(minimum_typical_scroll_duration_millis() - delta,
172 prediction_valid_duration);
173 }
174
175 TEST_F(UserModelTest,
176 TouchStartExpectedSoon_COMPOSITOR_GESTURE_LongAfterInput) {
177 user_model_->DidStartProcessingInputEvent(
178 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
179 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
180
181 clock_->Advance(minimum_typical_scroll_duration_millis() * 2);
182
183 base::TimeDelta prediction_valid_duration;
184 // Note this isn't a bug, the UseCase will change to NONE eventually so it's
185 // OK for this to always be true after minimum_typical_scroll_duration_millis
186 EXPECT_TRUE(user_model_->IsTouchStartExpectedSoon(
187 RendererScheduler::UseCase::COMPOSITOR_GESTURE, clock_->NowTicks(),
188 &prediction_valid_duration));
189 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
190 }
191
192 TEST_F(UserModelTest,
193 TouchStartExpectedSoon_MAIN_THREAD_GESTURE_ImmediatelyAfterInput) {
194 user_model_->DidStartProcessingInputEvent(
195 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
196
197 // DidFinishProcessingInputEvent is always a little bit delayed.
198 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
199 clock_->Advance(delay);
200 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
201
202 base::TimeDelta prediction_valid_duration;
203 EXPECT_FALSE(user_model_->IsTouchStartExpectedSoon(
204 RendererScheduler::UseCase::MAIN_THREAD_GESTURE, clock_->NowTicks(),
205 &prediction_valid_duration));
206 EXPECT_EQ(minimum_typical_scroll_duration_millis() - delay,
207 prediction_valid_duration);
208 }
209
210 TEST_F(UserModelTest,
211 TouchStartExpectedSoon_MAIN_THREAD_GESTURE_ShortlyAfterInput) {
212 user_model_->DidStartProcessingInputEvent(
213 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
214 // DidFinishProcessingInputEvent is always a little bit delayed.
215 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
216 clock_->Advance(delay);
217 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
218
219 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
220 clock_->Advance(delta);
221
222 base::TimeDelta prediction_valid_duration;
223 EXPECT_FALSE(user_model_->IsTouchStartExpectedSoon(
224 RendererScheduler::UseCase::MAIN_THREAD_GESTURE, clock_->NowTicks(),
225 &prediction_valid_duration));
226 EXPECT_EQ(minimum_typical_scroll_duration_millis() - delta - delay,
227 prediction_valid_duration);
228 }
229
230 TEST_F(UserModelTest,
231 TouchStartExpectedSoon_MAIN_THREAD_GESTURE_LongAfterInput) {
232 user_model_->DidStartProcessingInputEvent(
233 blink::WebInputEvent::Type::TouchStart, clock_->NowTicks());
234
235 // DidFinishProcessingInputEvent is always a little bit delayed.
236 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
237 clock_->Advance(delay);
238 user_model_->DidFinishProcessingInputEvent(clock_->NowTicks());
239
240 clock_->Advance(minimum_typical_scroll_duration_millis() * 2);
241
242 base::TimeDelta prediction_valid_duration;
243 // Note this isn't a bug, the UseCase will change to NONE eventually so it's
244 // OK for this to always be true after minimum_typical_scroll_duration_millis
245 EXPECT_TRUE(user_model_->IsTouchStartExpectedSoon(
246 RendererScheduler::UseCase::MAIN_THREAD_GESTURE, clock_->NowTicks(),
247 &prediction_valid_duration));
248 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
249 }
250
251 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698