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