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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 PostTestTasks(&run_order, "D1 C1"); | 591 PostTestTasks(&run_order, "D1 C1"); |
592 RunUntilIdle(); | 592 RunUntilIdle(); |
593 EXPECT_THAT(run_order, testing::Contains("D1")); | 593 EXPECT_THAT(run_order, testing::Contains("D1")); |
594 EXPECT_THAT(run_order, testing::Contains("C1")); | 594 EXPECT_THAT(run_order, testing::Contains("C1")); |
595 } | 595 } |
596 | 596 |
597 TEST_F(RendererSchedulerImplTest, TestRentrantTask) { | 597 TEST_F(RendererSchedulerImplTest, TestRentrantTask) { |
598 int count = 0; | 598 int count = 0; |
599 std::vector<int> run_order; | 599 std::vector<int> run_order; |
600 default_task_runner_->PostTask( | 600 default_task_runner_->PostTask( |
601 FROM_HERE, base::Bind(AppendToVectorReentrantTask, default_task_runner_, | 601 FROM_HERE, base::Bind(AppendToVectorReentrantTask, |
602 &run_order, &count, 5)); | 602 base::RetainedRef(default_task_runner_), &run_order, |
| 603 &count, 5)); |
603 RunUntilIdle(); | 604 RunUntilIdle(); |
604 | 605 |
605 EXPECT_THAT(run_order, testing::ElementsAre(0, 1, 2, 3, 4)); | 606 EXPECT_THAT(run_order, testing::ElementsAre(0, 1, 2, 3, 4)); |
606 } | 607 } |
607 | 608 |
608 TEST_F(RendererSchedulerImplTest, TestPostIdleTask) { | 609 TEST_F(RendererSchedulerImplTest, TestPostIdleTask) { |
609 int run_count = 0; | 610 int run_count = 0; |
610 base::TimeTicks expected_deadline = | 611 base::TimeTicks expected_deadline = |
611 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(2300); | 612 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(2300); |
612 base::TimeTicks deadline_in_task; | 613 base::TimeTicks deadline_in_task; |
(...skipping 24 matching lines...) Expand all Loading... |
637 RunUntilIdle(); | 638 RunUntilIdle(); |
638 EXPECT_EQ(1, run_count); | 639 EXPECT_EQ(1, run_count); |
639 EXPECT_EQ(expected_deadline, deadline_in_task); | 640 EXPECT_EQ(expected_deadline, deadline_in_task); |
640 } | 641 } |
641 | 642 |
642 TEST_F(RendererSchedulerImplTest, TestRepostingIdleTask) { | 643 TEST_F(RendererSchedulerImplTest, TestRepostingIdleTask) { |
643 int run_count = 0; | 644 int run_count = 0; |
644 | 645 |
645 max_idle_task_reposts = 2; | 646 max_idle_task_reposts = 2; |
646 idle_task_runner_->PostIdleTask( | 647 idle_task_runner_->PostIdleTask( |
647 FROM_HERE, | 648 FROM_HERE, base::Bind(&RepostingIdleTestTask, |
648 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); | 649 base::RetainedRef(idle_task_runner_), &run_count)); |
649 EnableIdleTasks(); | 650 EnableIdleTasks(); |
650 RunUntilIdle(); | 651 RunUntilIdle(); |
651 EXPECT_EQ(1, run_count); | 652 EXPECT_EQ(1, run_count); |
652 | 653 |
653 // Reposted tasks shouldn't run until next idle period. | 654 // Reposted tasks shouldn't run until next idle period. |
654 RunUntilIdle(); | 655 RunUntilIdle(); |
655 EXPECT_EQ(1, run_count); | 656 EXPECT_EQ(1, run_count); |
656 | 657 |
657 EnableIdleTasks(); | 658 EnableIdleTasks(); |
658 RunUntilIdle(); | 659 RunUntilIdle(); |
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1420 EXPECT_FALSE(is_anticipated_before); | 1421 EXPECT_FALSE(is_anticipated_before); |
1421 EXPECT_FALSE(is_anticipated_after); | 1422 EXPECT_FALSE(is_anticipated_after); |
1422 } | 1423 } |
1423 | 1424 |
1424 TEST_F(RendererSchedulerImplTest, TestShouldYield) { | 1425 TEST_F(RendererSchedulerImplTest, TestShouldYield) { |
1425 bool should_yield_before = false; | 1426 bool should_yield_before = false; |
1426 bool should_yield_after = false; | 1427 bool should_yield_after = false; |
1427 | 1428 |
1428 default_task_runner_->PostTask( | 1429 default_task_runner_->PostTask( |
1429 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), | 1430 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), |
1430 default_task_runner_, false, &should_yield_before, | 1431 base::RetainedRef(default_task_runner_), false, |
1431 &should_yield_after)); | 1432 &should_yield_before, &should_yield_after)); |
1432 RunUntilIdle(); | 1433 RunUntilIdle(); |
1433 // Posting to default runner shouldn't cause yielding. | 1434 // Posting to default runner shouldn't cause yielding. |
1434 EXPECT_FALSE(should_yield_before); | 1435 EXPECT_FALSE(should_yield_before); |
1435 EXPECT_FALSE(should_yield_after); | 1436 EXPECT_FALSE(should_yield_after); |
1436 | 1437 |
1437 default_task_runner_->PostTask( | 1438 default_task_runner_->PostTask( |
1438 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), | 1439 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), |
1439 compositor_task_runner_, false, | 1440 base::RetainedRef(compositor_task_runner_), false, |
1440 &should_yield_before, &should_yield_after)); | 1441 &should_yield_before, &should_yield_after)); |
1441 RunUntilIdle(); | 1442 RunUntilIdle(); |
1442 // Posting while not mainthread scrolling shouldn't cause yielding. | 1443 // Posting while not mainthread scrolling shouldn't cause yielding. |
1443 EXPECT_FALSE(should_yield_before); | 1444 EXPECT_FALSE(should_yield_before); |
1444 EXPECT_FALSE(should_yield_after); | 1445 EXPECT_FALSE(should_yield_after); |
1445 | 1446 |
1446 default_task_runner_->PostTask( | 1447 default_task_runner_->PostTask( |
1447 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), | 1448 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), |
1448 compositor_task_runner_, true, &should_yield_before, | 1449 base::RetainedRef(compositor_task_runner_), true, |
1449 &should_yield_after)); | 1450 &should_yield_before, &should_yield_after)); |
1450 RunUntilIdle(); | 1451 RunUntilIdle(); |
1451 // We should be able to switch to compositor priority mid-task. | 1452 // We should be able to switch to compositor priority mid-task. |
1452 EXPECT_FALSE(should_yield_before); | 1453 EXPECT_FALSE(should_yield_before); |
1453 EXPECT_TRUE(should_yield_after); | 1454 EXPECT_TRUE(should_yield_after); |
1454 } | 1455 } |
1455 | 1456 |
1456 TEST_F(RendererSchedulerImplTest, TestShouldYield_TouchStart) { | 1457 TEST_F(RendererSchedulerImplTest, TestShouldYield_TouchStart) { |
1457 // Receiving a touchstart should immediately trigger yielding, even if | 1458 // Receiving a touchstart should immediately trigger yielding, even if |
1458 // there's no immediately pending work in the compositor queue. | 1459 // there's no immediately pending work in the compositor queue. |
1459 EXPECT_FALSE(scheduler_->ShouldYieldForHighPriorityWork()); | 1460 EXPECT_FALSE(scheduler_->ShouldYieldForHighPriorityWork()); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 | 1825 |
1825 TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodRepeating) { | 1826 TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodRepeating) { |
1826 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1827 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
1827 std::vector<base::TimeTicks> actual_deadlines; | 1828 std::vector<base::TimeTicks> actual_deadlines; |
1828 int run_count = 0; | 1829 int run_count = 0; |
1829 | 1830 |
1830 max_idle_task_reposts = 3; | 1831 max_idle_task_reposts = 3; |
1831 base::TimeTicks clock_before(clock_->NowTicks()); | 1832 base::TimeTicks clock_before(clock_->NowTicks()); |
1832 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); | 1833 base::TimeDelta idle_task_runtime(base::TimeDelta::FromMilliseconds(10)); |
1833 idle_task_runner_->PostIdleTask( | 1834 idle_task_runner_->PostIdleTask( |
1834 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, | 1835 FROM_HERE, |
1835 idle_task_runner_, &run_count, clock_.get(), | 1836 base::Bind(&RepostingUpdateClockIdleTestTask, |
1836 idle_task_runtime, &actual_deadlines)); | 1837 base::RetainedRef(idle_task_runner_), &run_count, clock_.get(), |
| 1838 idle_task_runtime, &actual_deadlines)); |
1837 scheduler_->BeginFrameNotExpectedSoon(); | 1839 scheduler_->BeginFrameNotExpectedSoon(); |
1838 RunUntilIdle(); | 1840 RunUntilIdle(); |
1839 EXPECT_EQ(3, run_count); | 1841 EXPECT_EQ(3, run_count); |
1840 EXPECT_THAT( | 1842 EXPECT_THAT( |
1841 actual_deadlines, | 1843 actual_deadlines, |
1842 testing::ElementsAre( | 1844 testing::ElementsAre( |
1843 clock_before + maximum_idle_period_duration(), | 1845 clock_before + maximum_idle_period_duration(), |
1844 clock_before + idle_task_runtime + maximum_idle_period_duration(), | 1846 clock_before + idle_task_runtime + maximum_idle_period_duration(), |
1845 clock_before + (2 * idle_task_runtime) + | 1847 clock_before + (2 * idle_task_runtime) + |
1846 maximum_idle_period_duration())); | 1848 maximum_idle_period_duration())); |
1847 | 1849 |
1848 // Check that idle tasks don't run after the idle period ends with a | 1850 // Check that idle tasks don't run after the idle period ends with a |
1849 // new BeginMainFrame. | 1851 // new BeginMainFrame. |
1850 max_idle_task_reposts = 5; | 1852 max_idle_task_reposts = 5; |
1851 idle_task_runner_->PostIdleTask( | 1853 idle_task_runner_->PostIdleTask( |
1852 FROM_HERE, base::Bind(&RepostingUpdateClockIdleTestTask, | 1854 FROM_HERE, |
1853 idle_task_runner_, &run_count, clock_.get(), | 1855 base::Bind(&RepostingUpdateClockIdleTestTask, |
1854 idle_task_runtime, &actual_deadlines)); | 1856 base::RetainedRef(idle_task_runner_), &run_count, clock_.get(), |
| 1857 idle_task_runtime, &actual_deadlines)); |
1855 idle_task_runner_->PostIdleTask( | 1858 idle_task_runner_->PostIdleTask( |
1856 FROM_HERE, base::Bind(&WillBeginFrameIdleTask, | 1859 FROM_HERE, base::Bind(&WillBeginFrameIdleTask, |
1857 base::Unretained(scheduler_.get()), clock_.get())); | 1860 base::Unretained(scheduler_.get()), clock_.get())); |
1858 RunUntilIdle(); | 1861 RunUntilIdle(); |
1859 EXPECT_EQ(4, run_count); | 1862 EXPECT_EQ(4, run_count); |
1860 } | 1863 } |
1861 | 1864 |
1862 TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodDoesNotWakeScheduler) { | 1865 TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodDoesNotWakeScheduler) { |
1863 base::TimeTicks deadline_in_task; | 1866 base::TimeTicks deadline_in_task; |
1864 int run_count = 0; | 1867 int run_count = 0; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1973 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 1976 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
1974 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 1977 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); |
1975 EXPECT_FALSE(scheduler_->CanExceedIdleDeadlineIfRequired()); | 1978 EXPECT_FALSE(scheduler_->CanExceedIdleDeadlineIfRequired()); |
1976 } | 1979 } |
1977 | 1980 |
1978 TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { | 1981 TEST_F(RendererSchedulerImplTest, TestRendererHiddenIdlePeriod) { |
1979 int run_count = 0; | 1982 int run_count = 0; |
1980 | 1983 |
1981 max_idle_task_reposts = 2; | 1984 max_idle_task_reposts = 2; |
1982 idle_task_runner_->PostIdleTask( | 1985 idle_task_runner_->PostIdleTask( |
1983 FROM_HERE, | 1986 FROM_HERE, base::Bind(&RepostingIdleTestTask, |
1984 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); | 1987 base::RetainedRef(idle_task_runner_), &run_count)); |
1985 | 1988 |
1986 // Renderer should start in visible state. | 1989 // Renderer should start in visible state. |
1987 RunUntilIdle(); | 1990 RunUntilIdle(); |
1988 EXPECT_EQ(0, run_count); | 1991 EXPECT_EQ(0, run_count); |
1989 | 1992 |
1990 // When we hide the renderer it should start a max deadline idle period, which | 1993 // When we hide the renderer it should start a max deadline idle period, which |
1991 // will run an idle task and then immediately start a new idle period, which | 1994 // will run an idle task and then immediately start a new idle period, which |
1992 // runs the second idle task. | 1995 // runs the second idle task. |
1993 scheduler_->SetAllRenderWidgetsHidden(true); | 1996 scheduler_->SetAllRenderWidgetsHidden(true); |
1994 RunUntilIdle(); | 1997 RunUntilIdle(); |
1995 EXPECT_EQ(2, run_count); | 1998 EXPECT_EQ(2, run_count); |
1996 | 1999 |
1997 // Advance time by amount of time by the maximum amount of time we execute | 2000 // Advance time by amount of time by the maximum amount of time we execute |
1998 // idle tasks when hidden (plus some slack) - idle period should have ended. | 2001 // idle tasks when hidden (plus some slack) - idle period should have ended. |
1999 max_idle_task_reposts = 3; | 2002 max_idle_task_reposts = 3; |
2000 idle_task_runner_->PostIdleTask( | 2003 idle_task_runner_->PostIdleTask( |
2001 FROM_HERE, | 2004 FROM_HERE, base::Bind(&RepostingIdleTestTask, |
2002 base::Bind(&RepostingIdleTestTask, idle_task_runner_, &run_count)); | 2005 base::RetainedRef(idle_task_runner_), &run_count)); |
2003 clock_->Advance(end_idle_when_hidden_delay() + | 2006 clock_->Advance(end_idle_when_hidden_delay() + |
2004 base::TimeDelta::FromMilliseconds(10)); | 2007 base::TimeDelta::FromMilliseconds(10)); |
2005 RunUntilIdle(); | 2008 RunUntilIdle(); |
2006 EXPECT_EQ(2, run_count); | 2009 EXPECT_EQ(2, run_count); |
2007 } | 2010 } |
2008 | 2011 |
2009 TEST_F(RendererSchedulerImplTest, TimerQueueEnabledByDefault) { | 2012 TEST_F(RendererSchedulerImplTest, TimerQueueEnabledByDefault) { |
2010 std::vector<std::string> run_order; | 2013 std::vector<std::string> run_order; |
2011 PostTestTasks(&run_order, "T1 T2"); | 2014 PostTestTasks(&run_order, "T1 T2"); |
2012 RunUntilIdle(); | 2015 RunUntilIdle(); |
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2797 | 2800 |
2798 // Make sure TouchStart causes a policy change. | 2801 // Make sure TouchStart causes a policy change. |
2799 scheduler_->DidHandleInputEventOnCompositorThread( | 2802 scheduler_->DidHandleInputEventOnCompositorThread( |
2800 FakeInputEvent(blink::WebInputEvent::TouchStart), | 2803 FakeInputEvent(blink::WebInputEvent::TouchStart), |
2801 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 2804 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
2802 EXPECT_EQ(RendererScheduler::UseCase::TOUCHSTART, | 2805 EXPECT_EQ(RendererScheduler::UseCase::TOUCHSTART, |
2803 ForceUpdatePolicyAndGetCurrentUseCase()); | 2806 ForceUpdatePolicyAndGetCurrentUseCase()); |
2804 } | 2807 } |
2805 | 2808 |
2806 } // namespace scheduler | 2809 } // namespace scheduler |
OLD | NEW |