OLD | NEW |
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/web_view_scheduler_impl.h" | 5 #include "components/scheduler/renderer/web_view_scheduler_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "cc/test/ordered_simple_task_runner.h" | 10 #include "cc/test/ordered_simple_task_runner.h" |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 1.0); | 151 1.0); |
152 | 152 |
153 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 153 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
154 EXPECT_EQ(1000, run_count1); | 154 EXPECT_EQ(1000, run_count1); |
155 EXPECT_EQ(1, run_count2); | 155 EXPECT_EQ(1, run_count2); |
156 } | 156 } |
157 | 157 |
158 namespace { | 158 namespace { |
159 class VirtualTimeRecorderTask : public blink::WebTaskRunner::Task { | 159 class VirtualTimeRecorderTask : public blink::WebTaskRunner::Task { |
160 public: | 160 public: |
161 VirtualTimeRecorderTask(base::SimpleTestTickClock* clock, | 161 VirtualTimeRecorderTask(RendererSchedulerImpl* scheduler, |
162 blink::WebTaskRunner* web_task_runner, | |
163 std::vector<base::TimeTicks>* out_real_times, | 162 std::vector<base::TimeTicks>* out_real_times, |
164 std::vector<size_t>* out_virtual_times_ms) | 163 std::vector<size_t>* out_virtual_times_ms) |
165 : clock_(clock), | 164 : scheduler_(scheduler), |
166 web_task_runner_(web_task_runner), | |
167 out_real_times_(out_real_times), | 165 out_real_times_(out_real_times), |
168 out_virtual_times_ms_(out_virtual_times_ms) {} | 166 out_virtual_times_ms_(out_virtual_times_ms) {} |
169 | 167 |
170 ~VirtualTimeRecorderTask() override {} | 168 ~VirtualTimeRecorderTask() override {} |
171 | 169 |
172 void run() override { | 170 void run() override { |
173 out_real_times_->push_back(clock_->NowTicks()); | 171 out_real_times_->push_back(scheduler_->tick_clock()->NowTicks()); |
174 out_virtual_times_ms_->push_back( | 172 out_virtual_times_ms_->push_back( |
175 web_task_runner_->monotonicallyIncreasingVirtualTimeSeconds() * 1000.0); | 173 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0); |
176 } | 174 } |
177 | 175 |
178 private: | 176 private: |
179 base::SimpleTestTickClock* clock_; // NOT OWNED | 177 RendererSchedulerImpl* scheduler_; // NOT OWNED |
180 blink::WebTaskRunner* web_task_runner_; // NOT OWNED | |
181 std::vector<base::TimeTicks>* out_real_times_; // NOT OWNED | 178 std::vector<base::TimeTicks>* out_real_times_; // NOT OWNED |
182 std::vector<size_t>* out_virtual_times_ms_; // NOT OWNED | 179 std::vector<size_t>* out_virtual_times_ms_; // NOT OWNED |
183 }; | 180 }; |
184 } | 181 } |
185 | 182 |
186 TEST_F(WebViewSchedulerImplTest, VirtualTime_TimerFastForwarding) { | 183 TEST_F(WebViewSchedulerImplTest, VirtualTime_TimerFastForwarding) { |
187 std::vector<base::TimeTicks> real_times; | 184 std::vector<base::TimeTicks> real_times; |
188 std::vector<size_t> virtual_times_ms; | 185 std::vector<size_t> virtual_times_ms; |
189 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | 186 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
190 size_t initial_virtual_time_ms = | 187 size_t initial_virtual_time_ms = |
191 web_frame_scheduler_->timerTaskRunner() | 188 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0; |
192 ->monotonicallyIncreasingVirtualTimeSeconds() * | |
193 1000.0; | |
194 | 189 |
195 web_view_scheduler_->enableVirtualTime(); | 190 web_view_scheduler_->enableVirtualTime(); |
196 | 191 |
197 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 192 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
198 BLINK_FROM_HERE, | 193 BLINK_FROM_HERE, |
199 new VirtualTimeRecorderTask(clock_.get(), | 194 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
200 web_frame_scheduler_->timerTaskRunner(), | 195 &virtual_times_ms), |
201 &real_times, &virtual_times_ms), | |
202 2.0); | 196 2.0); |
203 | 197 |
204 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 198 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
205 BLINK_FROM_HERE, | 199 BLINK_FROM_HERE, |
206 new VirtualTimeRecorderTask(clock_.get(), | 200 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
207 web_frame_scheduler_->timerTaskRunner(), | 201 &virtual_times_ms), |
208 &real_times, &virtual_times_ms), | |
209 20.0); | 202 20.0); |
210 | 203 |
211 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 204 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
212 BLINK_FROM_HERE, | 205 BLINK_FROM_HERE, |
213 new VirtualTimeRecorderTask(clock_.get(), | 206 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
214 web_frame_scheduler_->timerTaskRunner(), | 207 &virtual_times_ms), |
215 &real_times, &virtual_times_ms), | |
216 200.0); | 208 200.0); |
217 | 209 |
218 mock_task_runner_->RunUntilIdle(); | 210 mock_task_runner_->RunUntilIdle(); |
219 | 211 |
220 EXPECT_THAT(real_times, ElementsAre(initial_real_time, | 212 EXPECT_THAT(real_times, ElementsAre(initial_real_time, |
221 initial_real_time, initial_real_time)); | 213 initial_real_time, initial_real_time)); |
222 EXPECT_THAT(virtual_times_ms, | 214 EXPECT_THAT(virtual_times_ms, |
223 ElementsAre(initial_virtual_time_ms + 2, | 215 ElementsAre(initial_virtual_time_ms + 2, |
224 initial_virtual_time_ms + 20, | 216 initial_virtual_time_ms + 20, |
225 initial_virtual_time_ms + 200)); | 217 initial_virtual_time_ms + 200)); |
226 } | 218 } |
227 | 219 |
228 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) { | 220 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) { |
229 std::vector<base::TimeTicks> real_times; | 221 std::vector<base::TimeTicks> real_times; |
230 std::vector<size_t> virtual_times_ms; | 222 std::vector<size_t> virtual_times_ms; |
231 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | 223 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
232 size_t initial_virtual_time_ms = | 224 size_t initial_virtual_time_ms = |
233 web_frame_scheduler_->timerTaskRunner() | 225 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0; |
234 ->monotonicallyIncreasingVirtualTimeSeconds() * | |
235 1000.0; | |
236 | 226 |
237 web_view_scheduler_->enableVirtualTime(); | 227 web_view_scheduler_->enableVirtualTime(); |
238 | 228 |
239 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | 229 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
240 BLINK_FROM_HERE, | 230 BLINK_FROM_HERE, |
241 new VirtualTimeRecorderTask(clock_.get(), | 231 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
242 web_frame_scheduler_->loadingTaskRunner(), | 232 &virtual_times_ms), |
243 &real_times, &virtual_times_ms), | |
244 2.0); | 233 2.0); |
245 | 234 |
246 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | 235 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
247 BLINK_FROM_HERE, | 236 BLINK_FROM_HERE, |
248 new VirtualTimeRecorderTask(clock_.get(), | 237 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
249 web_frame_scheduler_->loadingTaskRunner(), | 238 &virtual_times_ms), |
250 &real_times, &virtual_times_ms), | |
251 20.0); | 239 20.0); |
252 | 240 |
253 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | 241 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
254 BLINK_FROM_HERE, | 242 BLINK_FROM_HERE, |
255 new VirtualTimeRecorderTask(clock_.get(), | 243 new VirtualTimeRecorderTask(scheduler_.get(), &real_times, |
256 web_frame_scheduler_->loadingTaskRunner(), | 244 &virtual_times_ms), |
257 &real_times, &virtual_times_ms), | |
258 200.0); | 245 200.0); |
259 | 246 |
260 mock_task_runner_->RunUntilIdle(); | 247 mock_task_runner_->RunUntilIdle(); |
261 | 248 |
262 EXPECT_THAT(real_times, ElementsAre(initial_real_time, | 249 EXPECT_THAT(real_times, ElementsAre(initial_real_time, |
263 initial_real_time, initial_real_time)); | 250 initial_real_time, initial_real_time)); |
264 EXPECT_THAT(virtual_times_ms, | 251 EXPECT_THAT(virtual_times_ms, |
265 ElementsAre(initial_virtual_time_ms + 2, | 252 ElementsAre(initial_virtual_time_ms + 2, |
266 initial_virtual_time_ms + 20, | 253 initial_virtual_time_ms + 20, |
267 initial_virtual_time_ms + 200)); | 254 initial_virtual_time_ms + 200)); |
268 } | 255 } |
269 | 256 |
270 TEST_F(WebViewSchedulerImplTest, | 257 TEST_F(WebViewSchedulerImplTest, |
271 RepeatingTimer_PageInBackground_MeansNothingForVirtualTime) { | 258 RepeatingTimer_PageInBackground_MeansNothingForFirtualTime) { |
272 web_view_scheduler_->enableVirtualTime(); | 259 web_view_scheduler_->enableVirtualTime(); |
273 web_view_scheduler_->setPageVisible(false); | 260 web_view_scheduler_->setPageVisible(false); |
274 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | 261 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
275 | 262 |
276 int run_count = 0; | 263 int run_count = 0; |
277 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 264 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
278 BLINK_FROM_HERE, | 265 BLINK_FROM_HERE, |
279 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | 266 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), |
280 1.0); | 267 1.0); |
281 | 268 |
282 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000)); | 269 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000)); |
283 // Virtual time means page visibility is ignored. | |
284 EXPECT_EQ(1999, run_count); | 270 EXPECT_EQ(1999, run_count); |
285 | 271 |
286 // The global tick clock has not moved, yet we ran a large number of "delayed" | 272 // The global tick clock has not moved, yet we ran a large number of "delayed" |
287 // tasks despite calling setPageVisible(false). | 273 // tasks despite calling setPageVisible(false). |
288 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks()); | 274 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks()); |
289 } | 275 } |
290 | 276 |
291 namespace { | 277 namespace { |
292 class RunOrderTask : public blink::WebTaskRunner::Task { | 278 class RunOrderTask : public blink::WebTaskRunner::Task { |
293 public: | 279 public: |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 // it will prevent further tasks from running (i.e. the RepeatingTask) by | 478 // it will prevent further tasks from running (i.e. the RepeatingTask) by |
493 // deleting the WebFrameScheduler. | 479 // deleting the WebFrameScheduler. |
494 timer_task_runner->postDelayedTask(BLINK_FROM_HERE, delete_frame_task, | 480 timer_task_runner->postDelayedTask(BLINK_FROM_HERE, delete_frame_task, |
495 9990.0); | 481 9990.0); |
496 | 482 |
497 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(100)); | 483 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(100)); |
498 EXPECT_EQ(10, run_count); | 484 EXPECT_EQ(10, run_count); |
499 } | 485 } |
500 | 486 |
501 } // namespace scheduler | 487 } // namespace scheduler |
OLD | NEW |