| 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 |