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