OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/renderer_scheduler_impl.h" | 5 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "cc/output/begin_frame_args.h" | 8 #include "cc/output/begin_frame_args.h" |
9 #include "cc/test/ordered_simple_task_runner.h" | 9 #include "cc/test/ordered_simple_task_runner.h" |
10 #include "cc/test/test_now_source.h" | 10 #include "cc/test/test_now_source.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 deadlines->push_back(deadline); | 94 deadlines->push_back(deadline); |
95 (*run_count)++; | 95 (*run_count)++; |
96 clock->AdvanceNow(advance_time); | 96 clock->AdvanceNow(advance_time); |
97 } | 97 } |
98 | 98 |
99 void WillBeginFrameIdleTask(RendererScheduler* scheduler, | 99 void WillBeginFrameIdleTask(RendererScheduler* scheduler, |
100 scoped_refptr<cc::TestNowSource> clock, | 100 scoped_refptr<cc::TestNowSource> clock, |
101 base::TimeTicks deadline) { | 101 base::TimeTicks deadline) { |
102 scheduler->WillBeginFrame(cc::BeginFrameArgs::Create( | 102 scheduler->WillBeginFrame(cc::BeginFrameArgs::Create( |
103 BEGINFRAME_FROM_HERE, clock->Now(), base::TimeTicks(), | 103 BEGINFRAME_FROM_HERE, clock->Now(), base::TimeTicks(), |
104 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 104 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 105 true)); |
105 } | 106 } |
106 | 107 |
107 void UpdateClockToDeadlineIdleTestTask( | 108 void UpdateClockToDeadlineIdleTestTask( |
108 cc::TestNowSource* clock, | 109 cc::TestNowSource* clock, |
109 int* run_count, | 110 int* run_count, |
110 base::TimeTicks deadline) { | 111 base::TimeTicks deadline) { |
111 clock->SetNow(deadline); | 112 clock->SetNow(deadline); |
112 (*run_count)++; | 113 (*run_count)++; |
113 } | 114 } |
114 | 115 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); | 200 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
200 if (mock_task_runner_.get()) | 201 if (mock_task_runner_.get()) |
201 mock_task_runner_->RunUntilIdle(); | 202 mock_task_runner_->RunUntilIdle(); |
202 else | 203 else |
203 message_loop_->RunUntilIdle(); | 204 message_loop_->RunUntilIdle(); |
204 } | 205 } |
205 | 206 |
206 void DoMainFrame() { | 207 void DoMainFrame() { |
207 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 208 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
208 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 209 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
209 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 210 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 211 true)); |
210 scheduler_->DidCommitFrameToCompositor(); | 212 scheduler_->DidCommitFrameToCompositor(); |
211 } | 213 } |
212 | 214 |
213 void EnableIdleTasks() { DoMainFrame(); } | 215 void EnableIdleTasks() { DoMainFrame(); } |
214 | 216 |
215 Policy CurrentPolicy() { return scheduler_->current_policy_; } | 217 Policy CurrentPolicy() { return scheduler_->current_policy_; } |
216 | 218 |
| 219 bool BeginMainFrameOnCriticalPath() { |
| 220 return scheduler_->begin_main_frame_on_critical_path_; |
| 221 } |
| 222 |
217 // Helper for posting several tasks of specific types. |task_descriptor| is a | 223 // Helper for posting several tasks of specific types. |task_descriptor| is a |
218 // string with space delimited task identifiers. The first letter of each | 224 // string with space delimited task identifiers. The first letter of each |
219 // task identifier specifies the task type: | 225 // task identifier specifies the task type: |
220 // - 'D': Default task | 226 // - 'D': Default task |
221 // - 'C': Compositor task | 227 // - 'C': Compositor task |
222 // - 'L': Loading task | 228 // - 'L': Loading task |
223 // - 'I': Idle task | 229 // - 'I': Idle task |
224 // - 'T': Timer task | 230 // - 'T': Timer task |
225 void PostTestTasks(std::vector<std::string>* run_order, | 231 void PostTestTasks(std::vector<std::string>* run_order, |
226 const std::string& task_descriptor) { | 232 const std::string& task_descriptor) { |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 | 387 |
382 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); | 388 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(100)); |
383 idle_task_runner_->PostIdleTask( | 389 idle_task_runner_->PostIdleTask( |
384 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 390 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
385 | 391 |
386 RunUntilIdle(); | 392 RunUntilIdle(); |
387 EXPECT_EQ(0, run_count); // Shouldn't run yet as no WillBeginFrame. | 393 EXPECT_EQ(0, run_count); // Shouldn't run yet as no WillBeginFrame. |
388 | 394 |
389 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 395 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
390 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 396 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
391 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 397 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 398 true)); |
392 RunUntilIdle(); | 399 RunUntilIdle(); |
393 EXPECT_EQ(0, run_count); // Shouldn't run as no DidCommitFrameToCompositor. | 400 EXPECT_EQ(0, run_count); // Shouldn't run as no DidCommitFrameToCompositor. |
394 | 401 |
395 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(1200)); | 402 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(1200)); |
396 scheduler_->DidCommitFrameToCompositor(); | 403 scheduler_->DidCommitFrameToCompositor(); |
397 RunUntilIdle(); | 404 RunUntilIdle(); |
398 EXPECT_EQ(0, run_count); // We missed the deadline. | 405 EXPECT_EQ(0, run_count); // We missed the deadline. |
399 | 406 |
400 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 407 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
401 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 408 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
402 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 409 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 410 true)); |
403 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(800)); | 411 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(800)); |
404 scheduler_->DidCommitFrameToCompositor(); | 412 scheduler_->DidCommitFrameToCompositor(); |
405 RunUntilIdle(); | 413 RunUntilIdle(); |
406 EXPECT_EQ(1, run_count); | 414 EXPECT_EQ(1, run_count); |
407 EXPECT_EQ(expected_deadline, deadline_in_task); | 415 EXPECT_EQ(expected_deadline, deadline_in_task); |
408 } | 416 } |
409 | 417 |
410 TEST_F(RendererSchedulerImplTest, TestRepostingIdleTask) { | 418 TEST_F(RendererSchedulerImplTest, TestRepostingIdleTask) { |
411 int run_count = 0; | 419 int run_count = 0; |
412 | 420 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 TEST_F(RendererSchedulerImplTest, TestDelayedEndIdlePeriodCanceled) { | 523 TEST_F(RendererSchedulerImplTest, TestDelayedEndIdlePeriodCanceled) { |
516 int run_count = 0; | 524 int run_count = 0; |
517 | 525 |
518 base::TimeTicks deadline_in_task; | 526 base::TimeTicks deadline_in_task; |
519 idle_task_runner_->PostIdleTask( | 527 idle_task_runner_->PostIdleTask( |
520 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 528 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
521 | 529 |
522 // Trigger the beginning of an idle period for 1000ms. | 530 // Trigger the beginning of an idle period for 1000ms. |
523 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 531 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
524 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 532 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
525 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 533 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 534 true)); |
526 DoMainFrame(); | 535 DoMainFrame(); |
527 | 536 |
528 // End the idle period early (after 500ms), and send a WillBeginFrame which | 537 // End the idle period early (after 500ms), and send a WillBeginFrame which |
529 // specifies that the next idle period should end 1000ms from now. | 538 // specifies that the next idle period should end 1000ms from now. |
530 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(500)); | 539 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(500)); |
531 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 540 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
532 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 541 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
533 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 542 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 543 true)); |
534 | 544 |
535 RunUntilIdle(); | 545 RunUntilIdle(); |
536 EXPECT_EQ(0, run_count); // Not currently in an idle period. | 546 EXPECT_EQ(0, run_count); // Not currently in an idle period. |
537 | 547 |
538 // Trigger the start of the idle period before the task to end the previous | 548 // Trigger the start of the idle period before the task to end the previous |
539 // idle period has been triggered. | 549 // idle period has been triggered. |
540 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(400)); | 550 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(400)); |
541 scheduler_->DidCommitFrameToCompositor(); | 551 scheduler_->DidCommitFrameToCompositor(); |
542 | 552 |
543 // Post a task which simulates running until after the previous end idle | 553 // Post a task which simulates running until after the previous end idle |
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1537 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, scheduler_.get(), | 1547 base::Bind(&TestCanExceedIdleDeadlineIfRequiredTask, scheduler_.get(), |
1538 &can_exceed_idle_deadline, &run_count)); | 1548 &can_exceed_idle_deadline, &run_count)); |
1539 RunUntilIdle(); | 1549 RunUntilIdle(); |
1540 EXPECT_EQ(3, run_count); | 1550 EXPECT_EQ(3, run_count); |
1541 EXPECT_TRUE(can_exceed_idle_deadline); | 1551 EXPECT_TRUE(can_exceed_idle_deadline); |
1542 | 1552 |
1543 // Next long idle period will be for the maximum time, so | 1553 // Next long idle period will be for the maximum time, so |
1544 // CanExceedIdleDeadlineIfRequired should return true. | 1554 // CanExceedIdleDeadlineIfRequired should return true. |
1545 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 1555 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
1546 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 1556 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
1547 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 1557 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 1558 true)); |
1548 EXPECT_FALSE(scheduler_->CanExceedIdleDeadlineIfRequired()); | 1559 EXPECT_FALSE(scheduler_->CanExceedIdleDeadlineIfRequired()); |
1549 } | 1560 } |
1550 | 1561 |
1551 TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { | 1562 TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { |
1552 int run_count = 0; | 1563 int run_count = 0; |
1553 | 1564 |
1554 max_idle_task_reposts = 2; | 1565 max_idle_task_reposts = 2; |
1555 idle_task_runner_->PostIdleTask( | 1566 idle_task_runner_->PostIdleTask( |
1556 FROM_HERE, | 1567 FROM_HERE, |
1557 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); | 1568 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1635 | 1646 |
1636 TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { | 1647 TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { |
1637 // This should not DCHECK because there was no corresponding compositor side | 1648 // This should not DCHECK because there was no corresponding compositor side |
1638 // call to DidHandleInputEventOnCompositorThread with | 1649 // call to DidHandleInputEventOnCompositorThread with |
1639 // INPUT_EVENT_ACK_STATE_NOT_CONSUMED. There are legitimate reasons for the | 1650 // INPUT_EVENT_ACK_STATE_NOT_CONSUMED. There are legitimate reasons for the |
1640 // compositor to not be there and we don't want to make debugging impossible. | 1651 // compositor to not be there and we don't want to make debugging impossible. |
1641 scheduler_->DidHandleInputEventOnMainThread( | 1652 scheduler_->DidHandleInputEventOnMainThread( |
1642 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); | 1653 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
1643 } | 1654 } |
1644 | 1655 |
| 1656 TEST_F(RendererSchedulerImplTest, BeginMainFrameOnCriticalPath) { |
| 1657 ASSERT_FALSE(BeginMainFrameOnCriticalPath()); |
| 1658 |
| 1659 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
| 1660 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
| 1661 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 1662 true)); |
| 1663 ASSERT_TRUE(BeginMainFrameOnCriticalPath()); |
| 1664 |
| 1665 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
| 1666 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
| 1667 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL, |
| 1668 false)); |
| 1669 ASSERT_FALSE(BeginMainFrameOnCriticalPath()); |
| 1670 } |
| 1671 |
1645 } // namespace scheduler | 1672 } // namespace scheduler |
OLD | NEW |