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