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

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: Introduced a UserModel class 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_->DidHandleInputEventOnCompositorThread(
52 blink::WebInputEvent::Type::TouchStart,
53 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
54 clock_->NowTicks());
55 EXPECT_EQ(priority_escalation_after_input_duration(),
56 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
57 }
58
59 TEST_F(UserModelTest, TimeLeftInInputEscalatedPolicy_ShortlyAfterInput) {
60 user_model_->DidHandleInputEventOnCompositorThread(
61 blink::WebInputEvent::Type::TouchStart,
62 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
63 clock_->NowTicks());
64 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
65 clock_->Advance(delta);
66 EXPECT_EQ(priority_escalation_after_input_duration() - delta,
67 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
68 }
69
70 TEST_F(UserModelTest, TimeLeftInInputEscalatedPolicy_LongAfterInput) {
71 user_model_->DidHandleInputEventOnCompositorThread(
72 blink::WebInputEvent::Type::TouchStart,
73 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
74 clock_->NowTicks());
75 clock_->Advance(priority_escalation_after_input_duration() * 2);
76 EXPECT_EQ(base::TimeDelta(),
77 user_model_->TimeLeftInInputEscalatedPolicy(clock_->NowTicks()));
78 }
79
80 TEST_F(UserModelTest, TouchStartExpectedSoon_UseCase_NONE_NoRecentInput) {
81 base::TimeDelta prediction_valid_duration;
82 EXPECT_FALSE(user_model_->TouchStartExpectedSoon(
83 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
84 &prediction_valid_duration));
85 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
86 }
87
88 TEST_F(UserModelTest,
89 TouchStartExpectedSoon_UseCase_NONE_ImmediatelyAfterInput) {
90 user_model_->DidHandleInputEventOnCompositorThread(
91 blink::WebInputEvent::Type::TouchEnd,
92 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
93 clock_->NowTicks());
94
95 base::TimeDelta prediction_valid_duration;
96 EXPECT_TRUE(user_model_->TouchStartExpectedSoon(
97 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
98 &prediction_valid_duration));
99 EXPECT_EQ(subsequent_input_expected_after_input_duration(),
100 prediction_valid_duration);
101 }
102
103 TEST_F(UserModelTest, TouchStartExpectedSoon_UseCase_NONE_ShortlyAfterInput) {
104 user_model_->DidHandleInputEventOnCompositorThread(
105 blink::WebInputEvent::Type::TouchEnd,
106 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
107 clock_->NowTicks());
108
109 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
110 clock_->Advance(delta);
111
112 base::TimeDelta prediction_valid_duration;
113 EXPECT_TRUE(user_model_->TouchStartExpectedSoon(
114 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
115 &prediction_valid_duration));
116 EXPECT_EQ(subsequent_input_expected_after_input_duration() - delta,
117 prediction_valid_duration);
118 }
119
120 TEST_F(UserModelTest, TouchStartExpectedSoon_UseCase_NONE_LongAfterInput) {
121 user_model_->DidHandleInputEventOnCompositorThread(
122 blink::WebInputEvent::Type::TouchEnd,
123 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
124 clock_->NowTicks());
125 clock_->Advance(subsequent_input_expected_after_input_duration() * 2);
126
127 base::TimeDelta prediction_valid_duration;
128 EXPECT_FALSE(user_model_->TouchStartExpectedSoon(
129 RendererScheduler::UseCase::NONE, clock_->NowTicks(),
130 &prediction_valid_duration));
131 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
132 }
133
134 TEST_F(UserModelTest,
135 TouchStartExpectedSoon_COMPOSITOR_GESTURE_ImmediatelyAfterInput) {
136 user_model_->DidHandleInputEventOnCompositorThread(
137 blink::WebInputEvent::Type::TouchStart,
138 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
139 clock_->NowTicks());
140
141 base::TimeDelta prediction_valid_duration;
142 EXPECT_FALSE(user_model_->TouchStartExpectedSoon(
143 RendererScheduler::UseCase::COMPOSITOR_GESTURE, clock_->NowTicks(),
144 &prediction_valid_duration));
145 EXPECT_EQ(minimum_typical_scroll_duration_millis(),
146 prediction_valid_duration);
147 }
148
149 TEST_F(UserModelTest,
150 TouchStartExpectedSoon_COMPOSITOR_GESTURE_ShortlyAfterInput) {
151 user_model_->DidHandleInputEventOnCompositorThread(
152 blink::WebInputEvent::Type::TouchStart,
153 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
154 clock_->NowTicks());
155
156 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
157 clock_->Advance(delta);
158
159 base::TimeDelta prediction_valid_duration;
160 EXPECT_FALSE(user_model_->TouchStartExpectedSoon(
161 RendererScheduler::UseCase::COMPOSITOR_GESTURE, clock_->NowTicks(),
162 &prediction_valid_duration));
163 EXPECT_EQ(minimum_typical_scroll_duration_millis() - delta,
164 prediction_valid_duration);
165 }
166
167 TEST_F(UserModelTest,
168 TouchStartExpectedSoon_COMPOSITOR_GESTURE_LongAfterInput) {
169 user_model_->DidHandleInputEventOnCompositorThread(
170 blink::WebInputEvent::Type::TouchStart,
171 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
172 clock_->NowTicks());
173
174 clock_->Advance(minimum_typical_scroll_duration_millis() * 2);
175
176 base::TimeDelta prediction_valid_duration;
177 // Note this isn't a bug, the UseCase will change to NONE eventually so it's
178 // OK for this to always be true after minimum_typical_scroll_duration_millis
179 EXPECT_TRUE(user_model_->TouchStartExpectedSoon(
180 RendererScheduler::UseCase::COMPOSITOR_GESTURE, clock_->NowTicks(),
181 &prediction_valid_duration));
182 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
183 }
184
185 TEST_F(UserModelTest,
186 TouchStartExpectedSoon_MAIN_THREAD_GESTURE_ImmediatelyAfterInput) {
187 user_model_->DidHandleInputEventOnCompositorThread(
188 blink::WebInputEvent::Type::TouchStart,
189 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
190 clock_->NowTicks());
191 // DidHandleInputEventOnMainThread is always a little bit delayed.
192 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
193 clock_->Advance(delay);
194 user_model_->DidHandleInputEventOnMainThread(clock_->NowTicks());
195
196 base::TimeDelta prediction_valid_duration;
197 EXPECT_FALSE(user_model_->TouchStartExpectedSoon(
198 RendererScheduler::UseCase::MAIN_THREAD_GESTURE, clock_->NowTicks(),
199 &prediction_valid_duration));
200 EXPECT_EQ(minimum_typical_scroll_duration_millis() - delay,
201 prediction_valid_duration);
202 }
203
204 TEST_F(UserModelTest,
205 TouchStartExpectedSoon_MAIN_THREAD_GESTURE_ShortlyAfterInput) {
206 user_model_->DidHandleInputEventOnCompositorThread(
207 blink::WebInputEvent::Type::TouchStart,
208 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
209 clock_->NowTicks());
210 // DidHandleInputEventOnMainThread is always a little bit delayed.
211 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
212 clock_->Advance(delay);
213 user_model_->DidHandleInputEventOnMainThread(clock_->NowTicks());
214
215 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
216 clock_->Advance(delta);
217
218 base::TimeDelta prediction_valid_duration;
219 EXPECT_FALSE(user_model_->TouchStartExpectedSoon(
220 RendererScheduler::UseCase::MAIN_THREAD_GESTURE, clock_->NowTicks(),
221 &prediction_valid_duration));
222 EXPECT_EQ(minimum_typical_scroll_duration_millis() - delta - delay,
223 prediction_valid_duration);
224 }
225
226 TEST_F(UserModelTest,
227 TouchStartExpectedSoon_MAIN_THREAD_GESTURE_LongAfterInput) {
228 user_model_->DidHandleInputEventOnCompositorThread(
229 blink::WebInputEvent::Type::TouchStart,
230 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR,
231 clock_->NowTicks());
232 // DidHandleInputEventOnMainThread is always a little bit delayed.
233 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
234 clock_->Advance(delay);
235 user_model_->DidHandleInputEventOnMainThread(clock_->NowTicks());
236
237 clock_->Advance(minimum_typical_scroll_duration_millis() * 2);
238
239 base::TimeDelta prediction_valid_duration;
240 // Note this isn't a bug, the UseCase will change to NONE eventually so it's
241 // OK for this to always be true after minimum_typical_scroll_duration_millis
242 EXPECT_TRUE(user_model_->TouchStartExpectedSoon(
243 RendererScheduler::UseCase::MAIN_THREAD_GESTURE, clock_->NowTicks(),
244 &prediction_valid_duration));
245 EXPECT_EQ(base::TimeDelta(), prediction_valid_duration);
246 }
247
248 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698