Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc |
| index 5f3ccdb104980425a414f30d826ec0892f2a896f..c2ce89ac215e1ae82b5b13bd0b3c5c362f94ae08 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc |
| @@ -685,5 +685,104 @@ TEST_F(WebViewSchedulerImplTest, BackgroundThrottlingGracePeriod) { |
| base::TimeTicks() + base::TimeDelta::FromSeconds(26))); |
| } |
| +TEST_F(WebViewSchedulerImplTest, WebSocketExemptsFromBudgetThrottling) { |
|
alex clarke (OOO till 29th)
2017/01/24 18:15:34
Maybe OpenWebSocketExemptsFromBudgetThrottling
altimin
2017/01/24 18:39:04
Done.
|
| + ScopedExpensiveBackgroundTimerThrottlingForTest |
| + budget_background_throttling_enabler(true); |
| + |
| + std::vector<base::TimeTicks> run_times; |
| + FakeWebViewSchedulerSettings web_view_scheduler_settings; |
| + std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler( |
| + new WebViewSchedulerImpl(nullptr, &web_view_scheduler_settings, |
| + scheduler_.get(), false)); |
| + |
| + std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler1 = |
| + web_view_scheduler->createWebFrameSchedulerImpl(nullptr); |
| + std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = |
| + web_view_scheduler->createWebFrameSchedulerImpl(nullptr); |
| + |
| + web_view_scheduler->setPageVisible(false); |
| + |
| + // Wait for 20s to avoid initial throttling delay. |
| + mock_task_runner_->RunUntilTime(base::TimeTicks() + |
| + base::TimeDelta::FromMilliseconds(20500)); |
| + |
| + for (size_t i = 0; i < 3; ++i) { |
| + web_frame_scheduler1->timerTaskRunner()->postDelayedTask( |
| + BLINK_FROM_HERE, |
| + base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); |
| + } |
| + |
| + mock_task_runner_->RunUntilTime(base::TimeTicks() + |
| + base::TimeDelta::FromMilliseconds(55500)); |
| + |
| + // Check that tasks are throttled. |
| + EXPECT_THAT( |
| + run_times, |
| + ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(21), |
| + base::TimeTicks() + base::TimeDelta::FromSeconds(26), |
| + base::TimeTicks() + base::TimeDelta::FromSeconds(51))); |
| + run_times.clear(); |
| + |
| + web_frame_scheduler1->didOpenWebSocket(); |
| + |
| + for (size_t i = 0; i < 3; ++i) { |
| + web_frame_scheduler1->timerTaskRunner()->postDelayedTask( |
| + BLINK_FROM_HERE, |
| + base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); |
| + } |
| + |
| + mock_task_runner_->RunUntilTime(base::TimeTicks() + |
| + base::TimeDelta::FromMilliseconds(58500)); |
| + |
| + // Check that the timer task queue from the first frame is aligned, |
| + // but not throttled. |
| + EXPECT_THAT( |
| + run_times, |
| + ElementsAre( |
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(56000), |
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(56250), |
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(56500))); |
| + run_times.clear(); |
| + |
| + for (size_t i = 0; i < 3; ++i) { |
| + web_frame_scheduler2->timerTaskRunner()->postDelayedTask( |
| + BLINK_FROM_HERE, |
| + base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); |
| + } |
| + |
| + mock_task_runner_->RunUntilTime(base::TimeTicks() + |
| + base::TimeDelta::FromMilliseconds(59500)); |
| + |
| + // Check that the second frame scheduler becomes unthrottled. |
| + EXPECT_THAT( |
| + run_times, |
| + ElementsAre( |
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(59000), |
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(59250), |
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(59500))); |
| + run_times.clear(); |
| + |
| + web_frame_scheduler1->didCloseWebSocket(); |
| + |
| + // Wait for 10s to enable throttling back. |
| + mock_task_runner_->RunUntilTime(base::TimeTicks() + |
| + base::TimeDelta::FromMilliseconds(70500)); |
| + |
| + for (size_t i = 0; i < 3; ++i) { |
| + web_frame_scheduler1->timerTaskRunner()->postDelayedTask( |
| + BLINK_FROM_HERE, |
| + base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 1); |
| + } |
| + |
| + mock_task_runner_->RunUntilIdle(); |
| + |
| + // WebSocket is closed, budget-based throttling now applies. |
| + EXPECT_THAT( |
| + run_times, |
| + ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(84), |
| + base::TimeTicks() + base::TimeDelta::FromSeconds(109), |
| + base::TimeTicks() + base::TimeDelta::FromSeconds(134))); |
| +} |
| + |
| } // namespace scheduler |
| } // namespace blink |