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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 int run_count = 0; | 103 int run_count = 0; |
104 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 104 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
105 BLINK_FROM_HERE, | 105 BLINK_FROM_HERE, |
106 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | 106 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), |
107 1.0); | 107 1.0); |
108 | 108 |
109 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 109 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
110 EXPECT_EQ(1000, run_count); | 110 EXPECT_EQ(1000, run_count); |
111 } | 111 } |
112 | 112 |
113 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInBackground) { | 113 TEST_F(WebViewSchedulerImplTest, |
| 114 RepeatingTimer_PageInBackgroundThenForeground) { |
114 web_view_scheduler_->setPageVisible(false); | 115 web_view_scheduler_->setPageVisible(false); |
115 | 116 |
116 int run_count = 0; | 117 int run_count = 0; |
117 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 118 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
118 BLINK_FROM_HERE, | 119 BLINK_FROM_HERE, |
119 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | 120 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), |
120 1.0); | 121 1.0); |
121 | 122 |
122 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 123 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
| 124 EXPECT_EQ(1000, run_count); |
| 125 |
| 126 // The task queue isn't throttled at all until it's been in the background for |
| 127 // a 10 second grace period. |
| 128 clock_->Advance(base::TimeDelta::FromSeconds(10)); |
| 129 |
| 130 run_count = 0; |
| 131 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
123 EXPECT_EQ(1, run_count); | 132 EXPECT_EQ(1, run_count); |
| 133 |
| 134 // Make sure there's no delay in throttling being removed for pages that have |
| 135 // become visible. |
| 136 web_view_scheduler_->setPageVisible(true); |
| 137 |
| 138 run_count = 0; |
| 139 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
| 140 EXPECT_EQ(1001, run_count); // Note we end up running 1001 here because the |
| 141 // task was posted while throttled with a delay of 1ms so the first task was |
| 142 // due to run before the 1s period started. |
124 } | 143 } |
125 | 144 |
126 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { | 145 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { |
127 web_view_scheduler_->setPageVisible(false); | 146 web_view_scheduler_->setPageVisible(false); |
128 | 147 |
129 int run_count = 0; | 148 int run_count = 0; |
130 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | 149 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( |
131 BLINK_FROM_HERE, | 150 BLINK_FROM_HERE, |
132 makeRepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count), | 151 makeRepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count), |
133 1.0); | 152 1.0); |
134 | 153 |
135 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | 154 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); |
136 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled | 155 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled |
137 } | 156 } |
138 | 157 |
139 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { | 158 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { |
140 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( | 159 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( |
141 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false)); | 160 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false)); |
142 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = | 161 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = |
143 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr); | 162 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr); |
144 | 163 |
145 web_view_scheduler_->setPageVisible(true); | 164 web_view_scheduler_->setPageVisible(true); |
146 web_view_scheduler2->setPageVisible(false); | 165 web_view_scheduler2->setPageVisible(false); |
147 | 166 |
| 167 // Advance past the no-throttling grace period. |
| 168 clock_->Advance(base::TimeDelta::FromSeconds(10)); |
| 169 |
148 int run_count1 = 0; | 170 int run_count1 = 0; |
149 int run_count2 = 0; | 171 int run_count2 = 0; |
150 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 172 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
151 BLINK_FROM_HERE, | 173 BLINK_FROM_HERE, |
152 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1), | 174 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1), |
153 1.0); | 175 1.0); |
154 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( | 176 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( |
155 BLINK_FROM_HERE, | 177 BLINK_FROM_HERE, |
156 makeRepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), | 178 makeRepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), |
157 1.0); | 179 1.0); |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 nullptr, &web_view_scheduler_settings, scheduler_.get(), false)); | 600 nullptr, &web_view_scheduler_settings, scheduler_.get(), false)); |
579 web_frame_scheduler_ = | 601 web_frame_scheduler_ = |
580 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr); | 602 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr); |
581 web_view_scheduler_->setPageVisible(false); | 603 web_view_scheduler_->setPageVisible(false); |
582 | 604 |
583 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 605 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
584 base::TimeDelta::FromMilliseconds(2500)); | 606 base::TimeDelta::FromMilliseconds(2500)); |
585 | 607 |
586 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 608 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
587 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 609 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
588 0.1); | 610 1); |
589 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 611 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
590 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 612 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
591 0.1); | 613 1); |
592 | 614 |
593 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 615 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
594 base::TimeDelta::FromMilliseconds(3500)); | 616 base::TimeDelta::FromMilliseconds(3500)); |
595 | 617 |
596 // Check that these tasks are aligned, but are not subject to | 618 // Check that these tasks are initially unthrottled. |
597 // budget-based throttling. | |
598 EXPECT_THAT( | 619 EXPECT_THAT( |
599 run_times, | 620 run_times, |
600 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), | 621 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(2501), |
601 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3250))); | 622 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2751))); |
602 run_times.clear(); | 623 run_times.clear(); |
603 | 624 |
604 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 625 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
605 base::TimeDelta::FromMilliseconds(11500)); | 626 base::TimeDelta::FromMilliseconds(11500)); |
606 | 627 |
607 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 628 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
608 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 629 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
609 0.1); | 630 1); |
610 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | 631 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( |
611 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), | 632 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), |
612 0.1); | 633 1); |
613 | 634 |
614 mock_task_runner_->RunUntilIdle(); | 635 mock_task_runner_->RunUntilIdle(); |
615 | 636 |
616 // Check that tasks are aligned and throttled. | 637 // After the grace period has passed, tasks should be aligned and have budget |
| 638 // based throttling. |
617 EXPECT_THAT( | 639 EXPECT_THAT( |
618 run_times, | 640 run_times, |
619 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12), | 641 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12), |
620 base::TimeTicks() + base::TimeDelta::FromSeconds(29))); | 642 base::TimeTicks() + base::TimeDelta::FromSeconds(26))); |
621 } | 643 } |
622 | 644 |
623 } // namespace scheduler | 645 } // namespace scheduler |
624 } // namespace blink | 646 } // namespace blink |
OLD | NEW |