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 "platform/scheduler/renderer/web_view_scheduler_impl.h" | 5 #include "platform/scheduler/renderer/web_view_scheduler_impl.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 return WTF::Bind(&RunRepeatingTask, WTF::Passed(std::move(task_runner)), | 88 return WTF::Bind(&RunRepeatingTask, WTF::Passed(std::move(task_runner)), |
89 WTF::Unretained(run_count)); | 89 WTF::Unretained(run_count)); |
90 } | 90 } |
91 | 91 |
92 void RunRepeatingTask(RefPtr<blink::WebTaskRunner> task_runner, | 92 void RunRepeatingTask(RefPtr<blink::WebTaskRunner> task_runner, |
93 int* run_count) { | 93 int* run_count) { |
94 ++*run_count; | 94 ++*run_count; |
95 blink::WebTaskRunner* task_runner_ptr = task_runner.Get(); | 95 blink::WebTaskRunner* task_runner_ptr = task_runner.Get(); |
96 task_runner_ptr->PostDelayedTask( | 96 task_runner_ptr->PostDelayedTask( |
97 BLINK_FROM_HERE, MakeRepeatingTask(std::move(task_runner), run_count), | 97 BLINK_FROM_HERE, MakeRepeatingTask(std::move(task_runner), run_count), |
98 1.0); | 98 TimeDelta::FromMilliseconds(1)); |
99 } | 99 } |
100 | 100 |
101 } // namespace | 101 } // namespace |
102 | 102 |
103 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInForeground) { | 103 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInForeground) { |
104 web_view_scheduler_->SetPageVisible(true); | 104 web_view_scheduler_->SetPageVisible(true); |
105 | 105 |
106 int run_count = 0; | 106 int run_count = 0; |
107 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 107 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
108 BLINK_FROM_HERE, | 108 BLINK_FROM_HERE, |
109 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), | 109 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), |
110 1.0); | 110 TimeDelta::FromMilliseconds(1)); |
111 | 111 |
112 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 112 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
113 EXPECT_EQ(1000, run_count); | 113 EXPECT_EQ(1000, run_count); |
114 } | 114 } |
115 | 115 |
116 TEST_F(WebViewSchedulerImplTest, | 116 TEST_F(WebViewSchedulerImplTest, |
117 RepeatingTimer_PageInBackgroundThenForeground) { | 117 RepeatingTimer_PageInBackgroundThenForeground) { |
118 web_view_scheduler_->SetPageVisible(false); | 118 web_view_scheduler_->SetPageVisible(false); |
119 | 119 |
120 int run_count = 0; | 120 int run_count = 0; |
121 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 121 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
122 BLINK_FROM_HERE, | 122 BLINK_FROM_HERE, |
123 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), | 123 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), |
124 1.0); | 124 TimeDelta::FromMilliseconds(1)); |
125 | 125 |
126 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 126 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
127 EXPECT_EQ(1000, run_count); | 127 EXPECT_EQ(1000, run_count); |
128 | 128 |
129 // The task queue isn't throttled at all until it's been in the background for | 129 // The task queue isn't throttled at all until it's been in the background for |
130 // a 10 second grace period. | 130 // a 10 second grace period. |
131 clock_->Advance(base::TimeDelta::FromSeconds(10)); | 131 clock_->Advance(base::TimeDelta::FromSeconds(10)); |
132 | 132 |
133 run_count = 0; | 133 run_count = 0; |
134 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 134 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
(...skipping 15 matching lines...) Expand all Loading... |
150 | 150 |
151 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = | 151 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = |
152 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); | 152 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); |
153 blink::WebTaskRunner* timer_task_runner = | 153 blink::WebTaskRunner* timer_task_runner = |
154 web_frame_scheduler->TimerTaskRunner().Get(); | 154 web_frame_scheduler->TimerTaskRunner().Get(); |
155 | 155 |
156 int run_count = 0; | 156 int run_count = 0; |
157 timer_task_runner->PostDelayedTask( | 157 timer_task_runner->PostDelayedTask( |
158 BLINK_FROM_HERE, | 158 BLINK_FROM_HERE, |
159 MakeRepeatingTask(web_frame_scheduler->TimerTaskRunner(), &run_count), | 159 MakeRepeatingTask(web_frame_scheduler->TimerTaskRunner(), &run_count), |
160 1.0); | 160 TimeDelta::FromMilliseconds(1)); |
161 | 161 |
162 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 162 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
163 EXPECT_EQ(1000, run_count); | 163 EXPECT_EQ(1000, run_count); |
164 | 164 |
165 // The task queue isn't throttled at all until it's been in the background for | 165 // The task queue isn't throttled at all until it's been in the background for |
166 // a 10 second grace period. | 166 // a 10 second grace period. |
167 clock_->Advance(base::TimeDelta::FromSeconds(10)); | 167 clock_->Advance(base::TimeDelta::FromSeconds(10)); |
168 | 168 |
169 run_count = 0; | 169 run_count = 0; |
170 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 170 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
(...skipping 10 matching lines...) Expand all Loading... |
181 // due to run before the 1s period started. | 181 // due to run before the 1s period started. |
182 } | 182 } |
183 | 183 |
184 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { | 184 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { |
185 web_view_scheduler_->SetPageVisible(false); | 185 web_view_scheduler_->SetPageVisible(false); |
186 | 186 |
187 int run_count = 0; | 187 int run_count = 0; |
188 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( | 188 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( |
189 BLINK_FROM_HERE, | 189 BLINK_FROM_HERE, |
190 MakeRepeatingTask(web_frame_scheduler_->LoadingTaskRunner(), &run_count), | 190 MakeRepeatingTask(web_frame_scheduler_->LoadingTaskRunner(), &run_count), |
191 1.0); | 191 TimeDelta::FromMilliseconds(1)); |
192 | 192 |
193 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 193 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
194 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled | 194 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled |
195 } | 195 } |
196 | 196 |
197 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { | 197 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { |
198 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( | 198 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( |
199 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false)); | 199 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false)); |
200 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = | 200 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = |
201 web_view_scheduler2->CreateWebFrameSchedulerImpl(nullptr); | 201 web_view_scheduler2->CreateWebFrameSchedulerImpl(nullptr); |
202 | 202 |
203 web_view_scheduler_->SetPageVisible(true); | 203 web_view_scheduler_->SetPageVisible(true); |
204 web_view_scheduler2->SetPageVisible(false); | 204 web_view_scheduler2->SetPageVisible(false); |
205 | 205 |
206 // Advance past the no-throttling grace period. | 206 // Advance past the no-throttling grace period. |
207 clock_->Advance(base::TimeDelta::FromSeconds(10)); | 207 clock_->Advance(base::TimeDelta::FromSeconds(10)); |
208 | 208 |
209 int run_count1 = 0; | 209 int run_count1 = 0; |
210 int run_count2 = 0; | 210 int run_count2 = 0; |
211 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 211 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
212 BLINK_FROM_HERE, | 212 BLINK_FROM_HERE, |
213 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count1), | 213 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count1), |
214 1.0); | 214 TimeDelta::FromMilliseconds(1)); |
215 web_frame_scheduler2->TimerTaskRunner()->PostDelayedTask( | 215 web_frame_scheduler2->TimerTaskRunner()->PostDelayedTask( |
216 BLINK_FROM_HERE, | 216 BLINK_FROM_HERE, |
217 MakeRepeatingTask(web_frame_scheduler2->TimerTaskRunner(), &run_count2), | 217 MakeRepeatingTask(web_frame_scheduler2->TimerTaskRunner(), &run_count2), |
218 1.0); | 218 TimeDelta::FromMilliseconds(1)); |
219 | 219 |
220 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 220 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
221 EXPECT_EQ(1000, run_count1); | 221 EXPECT_EQ(1000, run_count1); |
222 EXPECT_EQ(1, run_count2); | 222 EXPECT_EQ(1, run_count2); |
223 } | 223 } |
224 | 224 |
225 namespace { | 225 namespace { |
226 | 226 |
227 void RunVirtualTimeRecorderTask(base::SimpleTestTickClock* clock, | 227 void RunVirtualTimeRecorderTask(base::SimpleTestTickClock* clock, |
228 RefPtr<blink::WebTaskRunner> web_task_runner, | 228 RefPtr<blink::WebTaskRunner> web_task_runner, |
(...skipping 25 matching lines...) Expand all Loading... |
254 ->MonotonicallyIncreasingVirtualTimeSeconds() * | 254 ->MonotonicallyIncreasingVirtualTimeSeconds() * |
255 1000.0; | 255 1000.0; |
256 | 256 |
257 web_view_scheduler_->EnableVirtualTime(); | 257 web_view_scheduler_->EnableVirtualTime(); |
258 | 258 |
259 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 259 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
260 BLINK_FROM_HERE, | 260 BLINK_FROM_HERE, |
261 MakeVirtualTimeRecorderTask(clock_.get(), | 261 MakeVirtualTimeRecorderTask(clock_.get(), |
262 web_frame_scheduler_->TimerTaskRunner(), | 262 web_frame_scheduler_->TimerTaskRunner(), |
263 &real_times, &virtual_times_ms), | 263 &real_times, &virtual_times_ms), |
264 2.0); | 264 TimeDelta::FromMilliseconds(2)); |
265 | 265 |
266 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 266 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
267 BLINK_FROM_HERE, | 267 BLINK_FROM_HERE, |
268 MakeVirtualTimeRecorderTask(clock_.get(), | 268 MakeVirtualTimeRecorderTask(clock_.get(), |
269 web_frame_scheduler_->TimerTaskRunner(), | 269 web_frame_scheduler_->TimerTaskRunner(), |
270 &real_times, &virtual_times_ms), | 270 &real_times, &virtual_times_ms), |
271 20.0); | 271 TimeDelta::FromMilliseconds(20)); |
272 | 272 |
273 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 273 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
274 BLINK_FROM_HERE, | 274 BLINK_FROM_HERE, |
275 MakeVirtualTimeRecorderTask(clock_.get(), | 275 MakeVirtualTimeRecorderTask(clock_.get(), |
276 web_frame_scheduler_->TimerTaskRunner(), | 276 web_frame_scheduler_->TimerTaskRunner(), |
277 &real_times, &virtual_times_ms), | 277 &real_times, &virtual_times_ms), |
278 200.0); | 278 TimeDelta::FromMilliseconds(200)); |
279 | 279 |
280 mock_task_runner_->RunUntilIdle(); | 280 mock_task_runner_->RunUntilIdle(); |
281 | 281 |
282 EXPECT_THAT(real_times, ElementsAre(initial_real_time, initial_real_time, | 282 EXPECT_THAT(real_times, ElementsAre(initial_real_time, initial_real_time, |
283 initial_real_time)); | 283 initial_real_time)); |
284 EXPECT_THAT(virtual_times_ms, ElementsAre(initial_virtual_time_ms + 2, | 284 EXPECT_THAT(virtual_times_ms, ElementsAre(initial_virtual_time_ms + 2, |
285 initial_virtual_time_ms + 20, | 285 initial_virtual_time_ms + 20, |
286 initial_virtual_time_ms + 200)); | 286 initial_virtual_time_ms + 200)); |
287 } | 287 } |
288 | 288 |
289 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) { | 289 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) { |
290 std::vector<base::TimeTicks> real_times; | 290 std::vector<base::TimeTicks> real_times; |
291 std::vector<size_t> virtual_times_ms; | 291 std::vector<size_t> virtual_times_ms; |
292 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | 292 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
293 size_t initial_virtual_time_ms = | 293 size_t initial_virtual_time_ms = |
294 web_frame_scheduler_->TimerTaskRunner() | 294 web_frame_scheduler_->TimerTaskRunner() |
295 ->MonotonicallyIncreasingVirtualTimeSeconds() * | 295 ->MonotonicallyIncreasingVirtualTimeSeconds() * |
296 1000.0; | 296 1000.0; |
297 | 297 |
298 web_view_scheduler_->EnableVirtualTime(); | 298 web_view_scheduler_->EnableVirtualTime(); |
299 | 299 |
300 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( | 300 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( |
301 BLINK_FROM_HERE, | 301 BLINK_FROM_HERE, |
302 MakeVirtualTimeRecorderTask(clock_.get(), | 302 MakeVirtualTimeRecorderTask(clock_.get(), |
303 web_frame_scheduler_->LoadingTaskRunner(), | 303 web_frame_scheduler_->LoadingTaskRunner(), |
304 &real_times, &virtual_times_ms), | 304 &real_times, &virtual_times_ms), |
305 2.0); | 305 TimeDelta::FromMilliseconds(2)); |
306 | 306 |
307 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( | 307 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( |
308 BLINK_FROM_HERE, | 308 BLINK_FROM_HERE, |
309 MakeVirtualTimeRecorderTask(clock_.get(), | 309 MakeVirtualTimeRecorderTask(clock_.get(), |
310 web_frame_scheduler_->LoadingTaskRunner(), | 310 web_frame_scheduler_->LoadingTaskRunner(), |
311 &real_times, &virtual_times_ms), | 311 &real_times, &virtual_times_ms), |
312 20.0); | 312 TimeDelta::FromMilliseconds(20)); |
313 | 313 |
314 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( | 314 web_frame_scheduler_->LoadingTaskRunner()->PostDelayedTask( |
315 BLINK_FROM_HERE, | 315 BLINK_FROM_HERE, |
316 MakeVirtualTimeRecorderTask(clock_.get(), | 316 MakeVirtualTimeRecorderTask(clock_.get(), |
317 web_frame_scheduler_->LoadingTaskRunner(), | 317 web_frame_scheduler_->LoadingTaskRunner(), |
318 &real_times, &virtual_times_ms), | 318 &real_times, &virtual_times_ms), |
319 200.0); | 319 TimeDelta::FromMilliseconds(200)); |
320 | 320 |
321 mock_task_runner_->RunUntilIdle(); | 321 mock_task_runner_->RunUntilIdle(); |
322 | 322 |
323 EXPECT_THAT(real_times, ElementsAre(initial_real_time, initial_real_time, | 323 EXPECT_THAT(real_times, ElementsAre(initial_real_time, initial_real_time, |
324 initial_real_time)); | 324 initial_real_time)); |
325 EXPECT_THAT(virtual_times_ms, ElementsAre(initial_virtual_time_ms + 2, | 325 EXPECT_THAT(virtual_times_ms, ElementsAre(initial_virtual_time_ms + 2, |
326 initial_virtual_time_ms + 20, | 326 initial_virtual_time_ms + 20, |
327 initial_virtual_time_ms + 200)); | 327 initial_virtual_time_ms + 200)); |
328 } | 328 } |
329 | 329 |
330 TEST_F(WebViewSchedulerImplTest, | 330 TEST_F(WebViewSchedulerImplTest, |
331 RepeatingTimer_PageInBackground_MeansNothingForVirtualTime) { | 331 RepeatingTimer_PageInBackground_MeansNothingForVirtualTime) { |
332 web_view_scheduler_->EnableVirtualTime(); | 332 web_view_scheduler_->EnableVirtualTime(); |
333 web_view_scheduler_->SetPageVisible(false); | 333 web_view_scheduler_->SetPageVisible(false); |
334 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | 334 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
335 | 335 |
336 int run_count = 0; | 336 int run_count = 0; |
337 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 337 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
338 BLINK_FROM_HERE, | 338 BLINK_FROM_HERE, |
339 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), | 339 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), |
340 1.0); | 340 TimeDelta::FromMilliseconds(1)); |
341 | 341 |
342 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000)); | 342 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000)); |
343 // Virtual time means page visibility is ignored. | 343 // Virtual time means page visibility is ignored. |
344 EXPECT_EQ(1999, run_count); | 344 EXPECT_EQ(1999, run_count); |
345 | 345 |
346 // The global tick clock has not moved, yet we ran a large number of "delayed" | 346 // The global tick clock has not moved, yet we ran a large number of "delayed" |
347 // tasks despite calling setPageVisible(false). | 347 // tasks despite calling setPageVisible(false). |
348 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks()); | 348 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks()); |
349 } | 349 } |
350 | 350 |
(...skipping 21 matching lines...) Expand all Loading... |
372 | 372 |
373 web_frame_scheduler_->TimerTaskRunner()->PostTask( | 373 web_frame_scheduler_->TimerTaskRunner()->PostTask( |
374 BLINK_FROM_HERE, | 374 BLINK_FROM_HERE, |
375 WTF::Bind(&RunOrderTask, 0, WTF::Unretained(&run_order))); | 375 WTF::Bind(&RunOrderTask, 0, WTF::Unretained(&run_order))); |
376 | 376 |
377 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 377 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
378 BLINK_FROM_HERE, | 378 BLINK_FROM_HERE, |
379 WTF::Bind(&DelayedRunOrderTask, 1, | 379 WTF::Bind(&DelayedRunOrderTask, 1, |
380 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), | 380 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), |
381 WTF::Unretained(&run_order)), | 381 WTF::Unretained(&run_order)), |
382 2.0); | 382 TimeDelta::FromMilliseconds(2)); |
383 | 383 |
384 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 384 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
385 BLINK_FROM_HERE, | 385 BLINK_FROM_HERE, |
386 WTF::Bind(&DelayedRunOrderTask, 3, | 386 WTF::Bind(&DelayedRunOrderTask, 3, |
387 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), | 387 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), |
388 WTF::Unretained(&run_order)), | 388 WTF::Unretained(&run_order)), |
389 4.0); | 389 TimeDelta::FromMilliseconds(4)); |
390 | 390 |
391 mock_task_runner_->RunUntilIdle(); | 391 mock_task_runner_->RunUntilIdle(); |
392 | 392 |
393 // No timer tasks are allowed to run. | 393 // No timer tasks are allowed to run. |
394 EXPECT_THAT(run_order, ElementsAre()); | 394 EXPECT_THAT(run_order, ElementsAre()); |
395 } | 395 } |
396 | 396 |
397 TEST_F(WebViewSchedulerImplTest, VirtualTime_AllowedToAdvance) { | 397 TEST_F(WebViewSchedulerImplTest, VirtualTime_AllowedToAdvance) { |
398 std::vector<int> run_order; | 398 std::vector<int> run_order; |
399 | 399 |
400 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::ADVANCE); | 400 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::ADVANCE); |
401 web_view_scheduler_->EnableVirtualTime(); | 401 web_view_scheduler_->EnableVirtualTime(); |
402 | 402 |
403 web_frame_scheduler_->TimerTaskRunner()->PostTask( | 403 web_frame_scheduler_->TimerTaskRunner()->PostTask( |
404 BLINK_FROM_HERE, | 404 BLINK_FROM_HERE, |
405 WTF::Bind(&RunOrderTask, 0, WTF::Unretained(&run_order))); | 405 WTF::Bind(&RunOrderTask, 0, WTF::Unretained(&run_order))); |
406 | 406 |
407 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 407 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
408 BLINK_FROM_HERE, | 408 BLINK_FROM_HERE, |
409 WTF::Bind(&DelayedRunOrderTask, 1, | 409 WTF::Bind(&DelayedRunOrderTask, 1, |
410 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), | 410 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), |
411 WTF::Unretained(&run_order)), | 411 WTF::Unretained(&run_order)), |
412 2.0); | 412 TimeDelta::FromMilliseconds(2)); |
413 | 413 |
414 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 414 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
415 BLINK_FROM_HERE, | 415 BLINK_FROM_HERE, |
416 WTF::Bind(&DelayedRunOrderTask, 3, | 416 WTF::Bind(&DelayedRunOrderTask, 3, |
417 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), | 417 WTF::Passed(web_frame_scheduler_->TimerTaskRunner()), |
418 WTF::Unretained(&run_order)), | 418 WTF::Unretained(&run_order)), |
419 4.0); | 419 TimeDelta::FromMilliseconds(4)); |
420 | 420 |
421 mock_task_runner_->RunUntilIdle(); | 421 mock_task_runner_->RunUntilIdle(); |
422 | 422 |
423 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4)); | 423 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4)); |
424 } | 424 } |
425 | 425 |
426 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling | 426 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling |
427 : public WebViewSchedulerImplTest { | 427 : public WebViewSchedulerImplTest { |
428 public: | 428 public: |
429 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {} | 429 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {} |
430 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {} | 430 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {} |
431 | 431 |
432 bool DisableBackgroundTimerThrottling() const override { return true; } | 432 bool DisableBackgroundTimerThrottling() const override { return true; } |
433 }; | 433 }; |
434 | 434 |
435 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling, | 435 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling, |
436 RepeatingTimer_PageInBackground) { | 436 RepeatingTimer_PageInBackground) { |
437 web_view_scheduler_->SetPageVisible(false); | 437 web_view_scheduler_->SetPageVisible(false); |
438 | 438 |
439 int run_count = 0; | 439 int run_count = 0; |
440 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 440 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
441 BLINK_FROM_HERE, | 441 BLINK_FROM_HERE, |
442 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), | 442 MakeRepeatingTask(web_frame_scheduler_->TimerTaskRunner(), &run_count), |
443 1.0); | 443 TimeDelta::FromMilliseconds(1)); |
444 | 444 |
445 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 445 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
446 EXPECT_EQ(1000, run_count); | 446 EXPECT_EQ(1000, run_count); |
447 } | 447 } |
448 | 448 |
449 TEST_F(WebViewSchedulerImplTest, VirtualTimeSettings_NewWebFrameScheduler) { | 449 TEST_F(WebViewSchedulerImplTest, VirtualTimeSettings_NewWebFrameScheduler) { |
450 std::vector<int> run_order; | 450 std::vector<int> run_order; |
451 | 451 |
452 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::PAUSE); | 452 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::PAUSE); |
453 web_view_scheduler_->EnableVirtualTime(); | 453 web_view_scheduler_->EnableVirtualTime(); |
454 | 454 |
455 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = | 455 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = |
456 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); | 456 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); |
457 | 457 |
458 web_frame_scheduler->TimerTaskRunner()->PostDelayedTask( | 458 web_frame_scheduler->TimerTaskRunner()->PostDelayedTask( |
459 BLINK_FROM_HERE, WTF::Bind(&RunOrderTask, 1, WTF::Unretained(&run_order)), | 459 BLINK_FROM_HERE, WTF::Bind(&RunOrderTask, 1, WTF::Unretained(&run_order)), |
460 1); | 460 TimeDelta::FromMilliseconds(1)); |
461 | 461 |
462 mock_task_runner_->RunUntilIdle(); | 462 mock_task_runner_->RunUntilIdle(); |
463 EXPECT_TRUE(run_order.empty()); | 463 EXPECT_TRUE(run_order.empty()); |
464 | 464 |
465 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::ADVANCE); | 465 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::ADVANCE); |
466 mock_task_runner_->RunUntilIdle(); | 466 mock_task_runner_->RunUntilIdle(); |
467 | 467 |
468 EXPECT_THAT(run_order, ElementsAre(1)); | 468 EXPECT_THAT(run_order, ElementsAre(1)); |
469 } | 469 } |
470 | 470 |
471 namespace { | 471 namespace { |
472 | 472 |
473 template <typename T> | 473 template <typename T> |
474 std::unique_ptr<WTF::Closure> MakeDeletionTask(T* obj) { | 474 std::unique_ptr<WTF::Closure> MakeDeletionTask(T* obj) { |
475 return WTF::Bind([](T* obj) { delete obj; }, WTF::Unretained(obj)); | 475 return WTF::Bind([](T* obj) { delete obj; }, WTF::Unretained(obj)); |
476 } | 476 } |
477 | 477 |
478 } // namespace | 478 } // namespace |
479 | 479 |
480 TEST_F(WebViewSchedulerImplTest, DeleteWebFrameSchedulers_InTask) { | 480 TEST_F(WebViewSchedulerImplTest, DeleteWebFrameSchedulers_InTask) { |
481 for (int i = 0; i < 10; i++) { | 481 for (int i = 0; i < 10; i++) { |
482 WebFrameSchedulerImpl* web_frame_scheduler = | 482 WebFrameSchedulerImpl* web_frame_scheduler = |
483 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr).release(); | 483 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr).release(); |
484 web_frame_scheduler->TimerTaskRunner()->PostDelayedTask( | 484 web_frame_scheduler->TimerTaskRunner()->PostDelayedTask( |
485 BLINK_FROM_HERE, MakeDeletionTask(web_frame_scheduler), 1); | 485 BLINK_FROM_HERE, MakeDeletionTask(web_frame_scheduler), |
| 486 TimeDelta::FromMilliseconds(1)); |
486 } | 487 } |
487 mock_task_runner_->RunUntilIdle(); | 488 mock_task_runner_->RunUntilIdle(); |
488 } | 489 } |
489 | 490 |
490 TEST_F(WebViewSchedulerImplTest, DeleteWebViewScheduler_InTask) { | 491 TEST_F(WebViewSchedulerImplTest, DeleteWebViewScheduler_InTask) { |
491 web_frame_scheduler_->TimerTaskRunner()->PostTask( | 492 web_frame_scheduler_->TimerTaskRunner()->PostTask( |
492 BLINK_FROM_HERE, MakeDeletionTask(web_view_scheduler_.release())); | 493 BLINK_FROM_HERE, MakeDeletionTask(web_view_scheduler_.release())); |
493 mock_task_runner_->RunUntilIdle(); | 494 mock_task_runner_->RunUntilIdle(); |
494 } | 495 } |
495 | 496 |
496 TEST_F(WebViewSchedulerImplTest, DeleteThrottledQueue_InTask) { | 497 TEST_F(WebViewSchedulerImplTest, DeleteThrottledQueue_InTask) { |
497 web_view_scheduler_->SetPageVisible(false); | 498 web_view_scheduler_->SetPageVisible(false); |
498 | 499 |
499 // The task queue isn't throttled at all until it's been in the background for | 500 // The task queue isn't throttled at all until it's been in the background for |
500 // a 10 second grace period. | 501 // a 10 second grace period. |
501 clock_->Advance(base::TimeDelta::FromSeconds(10)); | 502 clock_->Advance(base::TimeDelta::FromSeconds(10)); |
502 | 503 |
503 WebFrameSchedulerImpl* web_frame_scheduler = | 504 WebFrameSchedulerImpl* web_frame_scheduler = |
504 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr).release(); | 505 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr).release(); |
505 RefPtr<blink::WebTaskRunner> timer_task_runner = | 506 RefPtr<blink::WebTaskRunner> timer_task_runner = |
506 web_frame_scheduler->TimerTaskRunner(); | 507 web_frame_scheduler->TimerTaskRunner(); |
507 | 508 |
508 int run_count = 0; | 509 int run_count = 0; |
509 timer_task_runner->PostDelayedTask( | 510 timer_task_runner->PostDelayedTask( |
510 BLINK_FROM_HERE, MakeRepeatingTask(timer_task_runner, &run_count), 1.0); | 511 BLINK_FROM_HERE, MakeRepeatingTask(timer_task_runner, &run_count), |
| 512 TimeDelta::FromMilliseconds(1)); |
511 | 513 |
512 // Note this will run at time t = 10s since we start at time t = 5000us, and | 514 // Note this will run at time t = 10s since we start at time t = 5000us, and |
513 // it will prevent further tasks from running (i.e. the RepeatingTask) by | 515 // it will prevent further tasks from running (i.e. the RepeatingTask) by |
514 // deleting the WebFrameScheduler. | 516 // deleting the WebFrameScheduler. |
515 timer_task_runner->PostDelayedTask( | 517 timer_task_runner->PostDelayedTask(BLINK_FROM_HERE, |
516 BLINK_FROM_HERE, MakeDeletionTask(web_frame_scheduler), 9990.0); | 518 MakeDeletionTask(web_frame_scheduler), |
| 519 TimeDelta::FromMilliseconds(9990)); |
517 | 520 |
518 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(100)); | 521 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(100)); |
519 EXPECT_EQ(10, run_count); | 522 EXPECT_EQ(10, run_count); |
520 } | 523 } |
521 | 524 |
522 TEST_F(WebViewSchedulerImplTest, VirtualTimePolicy_DETERMINISTIC_LOADING) { | 525 TEST_F(WebViewSchedulerImplTest, VirtualTimePolicy_DETERMINISTIC_LOADING) { |
523 web_view_scheduler_->SetVirtualTimePolicy( | 526 web_view_scheduler_->SetVirtualTimePolicy( |
524 VirtualTimePolicy::DETERMINISTIC_LOADING); | 527 VirtualTimePolicy::DETERMINISTIC_LOADING); |
525 // Initially virtual time is not allowed to advance until we have seen at | 528 // Initially virtual time is not allowed to advance until we have seen at |
526 // least one load. | 529 // least one load. |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 EXPECT_TRUE(web_view_scheduler_->VirtualTimeAllowedToAdvance()); | 609 EXPECT_TRUE(web_view_scheduler_->VirtualTimeAllowedToAdvance()); |
607 } | 610 } |
608 | 611 |
609 TEST_F(WebViewSchedulerImplTest, SuspendTimersWhileVirtualTimeIsPaused) { | 612 TEST_F(WebViewSchedulerImplTest, SuspendTimersWhileVirtualTimeIsPaused) { |
610 std::vector<int> run_order; | 613 std::vector<int> run_order; |
611 | 614 |
612 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = | 615 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = |
613 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); | 616 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); |
614 web_frame_scheduler->TimerTaskRunner()->PostDelayedTask( | 617 web_frame_scheduler->TimerTaskRunner()->PostDelayedTask( |
615 BLINK_FROM_HERE, WTF::Bind(&RunOrderTask, 1, WTF::Unretained(&run_order)), | 618 BLINK_FROM_HERE, WTF::Bind(&RunOrderTask, 1, WTF::Unretained(&run_order)), |
616 0); | 619 TimeDelta()); |
617 | 620 |
618 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::PAUSE); | 621 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::PAUSE); |
619 web_view_scheduler_->EnableVirtualTime(); | 622 web_view_scheduler_->EnableVirtualTime(); |
620 | 623 |
621 mock_task_runner_->RunUntilIdle(); | 624 mock_task_runner_->RunUntilIdle(); |
622 EXPECT_TRUE(run_order.empty()); | 625 EXPECT_TRUE(run_order.empty()); |
623 | 626 |
624 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::ADVANCE); | 627 web_view_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::ADVANCE); |
625 mock_task_runner_->RunUntilIdle(); | 628 mock_task_runner_->RunUntilIdle(); |
626 | 629 |
627 EXPECT_THAT(run_order, ElementsAre(1)); | 630 EXPECT_THAT(run_order, ElementsAre(1)); |
628 } | 631 } |
629 | 632 |
630 TEST_F(WebViewSchedulerImplTest, VirtualTimeBudgetExhaustedCallback) { | 633 TEST_F(WebViewSchedulerImplTest, VirtualTimeBudgetExhaustedCallback) { |
631 std::vector<base::TimeTicks> real_times; | 634 std::vector<base::TimeTicks> real_times; |
632 std::vector<size_t> virtual_times_ms; | 635 std::vector<size_t> virtual_times_ms; |
633 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | 636 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); |
634 size_t initial_virtual_time_ms = | 637 size_t initial_virtual_time_ms = |
635 web_frame_scheduler_->TimerTaskRunner() | 638 web_frame_scheduler_->TimerTaskRunner() |
636 ->MonotonicallyIncreasingVirtualTimeSeconds() * | 639 ->MonotonicallyIncreasingVirtualTimeSeconds() * |
637 1000.0; | 640 1000.0; |
638 | 641 |
639 web_view_scheduler_->EnableVirtualTime(); | 642 web_view_scheduler_->EnableVirtualTime(); |
640 | 643 |
641 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 644 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
642 BLINK_FROM_HERE, | 645 BLINK_FROM_HERE, |
643 MakeVirtualTimeRecorderTask(clock_.get(), | 646 MakeVirtualTimeRecorderTask(clock_.get(), |
644 web_frame_scheduler_->TimerTaskRunner(), | 647 web_frame_scheduler_->TimerTaskRunner(), |
645 &real_times, &virtual_times_ms), | 648 &real_times, &virtual_times_ms), |
646 1.0); | 649 TimeDelta::FromMilliseconds(1)); |
647 | 650 |
648 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 651 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
649 BLINK_FROM_HERE, | 652 BLINK_FROM_HERE, |
650 MakeVirtualTimeRecorderTask(clock_.get(), | 653 MakeVirtualTimeRecorderTask(clock_.get(), |
651 web_frame_scheduler_->TimerTaskRunner(), | 654 web_frame_scheduler_->TimerTaskRunner(), |
652 &real_times, &virtual_times_ms), | 655 &real_times, &virtual_times_ms), |
653 2.0); | 656 TimeDelta::FromMilliseconds(2)); |
654 | 657 |
655 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 658 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
656 BLINK_FROM_HERE, | 659 BLINK_FROM_HERE, |
657 MakeVirtualTimeRecorderTask(clock_.get(), | 660 MakeVirtualTimeRecorderTask(clock_.get(), |
658 web_frame_scheduler_->TimerTaskRunner(), | 661 web_frame_scheduler_->TimerTaskRunner(), |
659 &real_times, &virtual_times_ms), | 662 &real_times, &virtual_times_ms), |
660 5.0); | 663 TimeDelta::FromMilliseconds(5)); |
661 | 664 |
662 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 665 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( |
663 BLINK_FROM_HERE, | 666 BLINK_FROM_HERE, |
664 MakeVirtualTimeRecorderTask(clock_.get(), | 667 MakeVirtualTimeRecorderTask(clock_.get(), |
665 web_frame_scheduler_->TimerTaskRunner(), | 668 web_frame_scheduler_->TimerTaskRunner(), |
666 &real_times, &virtual_times_ms), | 669 &real_times, &virtual_times_ms), |
667 7.0); | 670 TimeDelta::FromMilliseconds(7)); |
668 | 671 |
669 web_view_scheduler_->GrantVirtualTimeBudget( | 672 web_view_scheduler_->GrantVirtualTimeBudget( |
670 base::TimeDelta::FromMilliseconds(5), | 673 base::TimeDelta::FromMilliseconds(5), |
671 WTF::Bind( | 674 WTF::Bind( |
672 [](WebViewScheduler* scheduler) { | 675 [](WebViewScheduler* scheduler) { |
673 scheduler->SetVirtualTimePolicy(VirtualTimePolicy::PAUSE); | 676 scheduler->SetVirtualTimePolicy(VirtualTimePolicy::PAUSE); |
674 }, | 677 }, |
675 WTF::Unretained(web_view_scheduler_.get()))); | 678 WTF::Unretained(web_view_scheduler_.get()))); |
676 | 679 |
677 mock_task_runner_->RunUntilIdle(); | 680 mock_task_runner_->RunUntilIdle(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 FakeWebViewSchedulerSettings web_view_scheduler_settings; | 721 FakeWebViewSchedulerSettings web_view_scheduler_settings; |
719 web_view_scheduler_.reset(new WebViewSchedulerImpl( | 722 web_view_scheduler_.reset(new WebViewSchedulerImpl( |
720 nullptr, &web_view_scheduler_settings, scheduler_.get(), false)); | 723 nullptr, &web_view_scheduler_settings, scheduler_.get(), false)); |
721 web_frame_scheduler_ = | 724 web_frame_scheduler_ = |
722 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); | 725 web_view_scheduler_->CreateWebFrameSchedulerImpl(nullptr); |
723 web_view_scheduler_->SetPageVisible(false); | 726 web_view_scheduler_->SetPageVisible(false); |
724 | 727 |
725 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 728 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
726 base::TimeDelta::FromMilliseconds(2500)); | 729 base::TimeDelta::FromMilliseconds(2500)); |
727 | 730 |
728 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 731 web_frame_scheduler_->TimerTaskRunner() |
729 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 732 ->ToSingleThreadTaskRunner() |
730 1); | 733 ->PostDelayedTask( |
731 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 734 BLINK_FROM_HERE, |
732 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 735 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
733 1); | 736 TimeDelta::FromMilliseconds(1)); |
| 737 web_frame_scheduler_->TimerTaskRunner() |
| 738 ->ToSingleThreadTaskRunner() |
| 739 ->PostDelayedTask( |
| 740 BLINK_FROM_HERE, |
| 741 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
| 742 TimeDelta::FromMilliseconds(1)); |
734 | 743 |
735 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 744 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
736 base::TimeDelta::FromMilliseconds(3500)); | 745 base::TimeDelta::FromMilliseconds(3500)); |
737 | 746 |
738 // Check that these tasks are initially unthrottled. | 747 // Check that these tasks are initially unthrottled. |
739 EXPECT_THAT( | 748 EXPECT_THAT( |
740 run_times, | 749 run_times, |
741 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(2501), | 750 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(2501), |
742 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2751))); | 751 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2751))); |
743 run_times.clear(); | 752 run_times.clear(); |
744 | 753 |
745 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 754 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
746 base::TimeDelta::FromMilliseconds(11500)); | 755 base::TimeDelta::FromMilliseconds(11500)); |
747 | 756 |
748 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 757 web_frame_scheduler_->TimerTaskRunner() |
749 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 758 ->ToSingleThreadTaskRunner() |
750 1); | 759 ->PostDelayedTask( |
751 web_frame_scheduler_->TimerTaskRunner()->PostDelayedTask( | 760 BLINK_FROM_HERE, |
752 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 761 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
753 1); | 762 TimeDelta::FromMilliseconds(1)); |
| 763 web_frame_scheduler_->TimerTaskRunner() |
| 764 ->ToSingleThreadTaskRunner() |
| 765 ->PostDelayedTask( |
| 766 BLINK_FROM_HERE, |
| 767 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
| 768 TimeDelta::FromMilliseconds(1)); |
754 | 769 |
755 mock_task_runner_->RunUntilIdle(); | 770 mock_task_runner_->RunUntilIdle(); |
756 | 771 |
757 // After the grace period has passed, tasks should be aligned and have budget | 772 // After the grace period has passed, tasks should be aligned and have budget |
758 // based throttling. | 773 // based throttling. |
759 EXPECT_THAT( | 774 EXPECT_THAT( |
760 run_times, | 775 run_times, |
761 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12), | 776 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12), |
762 base::TimeTicks() + base::TimeDelta::FromSeconds(26))); | 777 base::TimeTicks() + base::TimeDelta::FromSeconds(26))); |
763 } | 778 } |
(...skipping 13 matching lines...) Expand all Loading... |
777 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = | 792 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = |
778 web_view_scheduler->CreateWebFrameSchedulerImpl(nullptr); | 793 web_view_scheduler->CreateWebFrameSchedulerImpl(nullptr); |
779 | 794 |
780 web_view_scheduler->SetPageVisible(false); | 795 web_view_scheduler->SetPageVisible(false); |
781 | 796 |
782 // Wait for 20s to avoid initial throttling delay. | 797 // Wait for 20s to avoid initial throttling delay. |
783 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 798 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
784 base::TimeDelta::FromMilliseconds(20500)); | 799 base::TimeDelta::FromMilliseconds(20500)); |
785 | 800 |
786 for (size_t i = 0; i < 3; ++i) { | 801 for (size_t i = 0; i < 3; ++i) { |
787 web_frame_scheduler1->TimerTaskRunner()->PostDelayedTask( | 802 web_frame_scheduler1->TimerTaskRunner() |
788 BLINK_FROM_HERE, | 803 ->ToSingleThreadTaskRunner() |
789 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); | 804 ->PostDelayedTask( |
| 805 BLINK_FROM_HERE, |
| 806 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
| 807 TimeDelta::FromMilliseconds(1)); |
790 } | 808 } |
791 | 809 |
792 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 810 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
793 base::TimeDelta::FromMilliseconds(55500)); | 811 base::TimeDelta::FromMilliseconds(55500)); |
794 | 812 |
795 // Check that tasks are throttled. | 813 // Check that tasks are throttled. |
796 EXPECT_THAT( | 814 EXPECT_THAT( |
797 run_times, | 815 run_times, |
798 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(21), | 816 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(21), |
799 base::TimeTicks() + base::TimeDelta::FromSeconds(26), | 817 base::TimeTicks() + base::TimeDelta::FromSeconds(26), |
800 base::TimeTicks() + base::TimeDelta::FromSeconds(51))); | 818 base::TimeTicks() + base::TimeDelta::FromSeconds(51))); |
801 run_times.clear(); | 819 run_times.clear(); |
802 | 820 |
803 std::unique_ptr<WebFrameScheduler::ActiveConnectionHandle> | 821 std::unique_ptr<WebFrameScheduler::ActiveConnectionHandle> |
804 websocket_connection = web_frame_scheduler1->OnActiveConnectionCreated(); | 822 websocket_connection = web_frame_scheduler1->OnActiveConnectionCreated(); |
805 | 823 |
806 for (size_t i = 0; i < 3; ++i) { | 824 for (size_t i = 0; i < 3; ++i) { |
807 web_frame_scheduler1->TimerTaskRunner()->PostDelayedTask( | 825 web_frame_scheduler1->TimerTaskRunner() |
808 BLINK_FROM_HERE, | 826 ->ToSingleThreadTaskRunner() |
809 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); | 827 ->PostDelayedTask( |
| 828 BLINK_FROM_HERE, |
| 829 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
| 830 TimeDelta::FromMilliseconds(1)); |
810 } | 831 } |
811 | 832 |
812 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 833 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
813 base::TimeDelta::FromMilliseconds(58500)); | 834 base::TimeDelta::FromMilliseconds(58500)); |
814 | 835 |
815 // Check that the timer task queue from the first frame is aligned, | 836 // Check that the timer task queue from the first frame is aligned, |
816 // but not throttled. | 837 // but not throttled. |
817 EXPECT_THAT( | 838 EXPECT_THAT( |
818 run_times, | 839 run_times, |
819 ElementsAre( | 840 ElementsAre( |
820 base::TimeTicks() + base::TimeDelta::FromMilliseconds(56000), | 841 base::TimeTicks() + base::TimeDelta::FromMilliseconds(56000), |
821 base::TimeTicks() + base::TimeDelta::FromMilliseconds(56250), | 842 base::TimeTicks() + base::TimeDelta::FromMilliseconds(56250), |
822 base::TimeTicks() + base::TimeDelta::FromMilliseconds(56500))); | 843 base::TimeTicks() + base::TimeDelta::FromMilliseconds(56500))); |
823 run_times.clear(); | 844 run_times.clear(); |
824 | 845 |
825 for (size_t i = 0; i < 3; ++i) { | 846 for (size_t i = 0; i < 3; ++i) { |
826 web_frame_scheduler2->TimerTaskRunner()->PostDelayedTask( | 847 web_frame_scheduler2->TimerTaskRunner() |
827 BLINK_FROM_HERE, | 848 ->ToSingleThreadTaskRunner() |
828 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); | 849 ->PostDelayedTask( |
| 850 BLINK_FROM_HERE, |
| 851 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
| 852 TimeDelta::FromMilliseconds(1)); |
829 } | 853 } |
830 | 854 |
831 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 855 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
832 base::TimeDelta::FromMilliseconds(59500)); | 856 base::TimeDelta::FromMilliseconds(59500)); |
833 | 857 |
834 // Check that the second frame scheduler becomes unthrottled. | 858 // Check that the second frame scheduler becomes unthrottled. |
835 EXPECT_THAT( | 859 EXPECT_THAT( |
836 run_times, | 860 run_times, |
837 ElementsAre( | 861 ElementsAre( |
838 base::TimeTicks() + base::TimeDelta::FromMilliseconds(59000), | 862 base::TimeTicks() + base::TimeDelta::FromMilliseconds(59000), |
839 base::TimeTicks() + base::TimeDelta::FromMilliseconds(59250), | 863 base::TimeTicks() + base::TimeDelta::FromMilliseconds(59250), |
840 base::TimeTicks() + base::TimeDelta::FromMilliseconds(59500))); | 864 base::TimeTicks() + base::TimeDelta::FromMilliseconds(59500))); |
841 run_times.clear(); | 865 run_times.clear(); |
842 | 866 |
843 websocket_connection.reset(); | 867 websocket_connection.reset(); |
844 | 868 |
845 // Wait for 10s to enable throttling back. | 869 // Wait for 10s to enable throttling back. |
846 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 870 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
847 base::TimeDelta::FromMilliseconds(70500)); | 871 base::TimeDelta::FromMilliseconds(70500)); |
848 | 872 |
849 for (size_t i = 0; i < 3; ++i) { | 873 for (size_t i = 0; i < 3; ++i) { |
850 web_frame_scheduler1->TimerTaskRunner()->PostDelayedTask( | 874 web_frame_scheduler1->TimerTaskRunner() |
851 BLINK_FROM_HERE, | 875 ->ToSingleThreadTaskRunner() |
852 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); | 876 ->PostDelayedTask( |
| 877 BLINK_FROM_HERE, |
| 878 base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
| 879 TimeDelta::FromMilliseconds(1)); |
853 } | 880 } |
854 | 881 |
855 mock_task_runner_->RunUntilIdle(); | 882 mock_task_runner_->RunUntilIdle(); |
856 | 883 |
857 // WebSocket is closed, budget-based throttling now applies. | 884 // WebSocket is closed, budget-based throttling now applies. |
858 EXPECT_THAT( | 885 EXPECT_THAT( |
859 run_times, | 886 run_times, |
860 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(84), | 887 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(84), |
861 base::TimeTicks() + base::TimeDelta::FromSeconds(109), | 888 base::TimeTicks() + base::TimeDelta::FromSeconds(109), |
862 base::TimeTicks() + base::TimeDelta::FromSeconds(134))); | 889 base::TimeTicks() + base::TimeDelta::FromSeconds(134))); |
863 } | 890 } |
864 | 891 |
865 } // namespace scheduler | 892 } // namespace scheduler |
866 } // namespace blink | 893 } // namespace blink |
OLD | NEW |