Chromium Code Reviews| Index: components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
| diff --git a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
| index f34f2f01fb524c18ca836e10c31361a7b985785f..244fea9f2eca79fb02ca68f87fba987ab06784a9 100644 |
| --- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
| +++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
| @@ -126,15 +126,28 @@ void PostingYieldingTestTask(RendererSchedulerImpl* scheduler, |
| *should_yield_after = scheduler->ShouldYieldForHighPriorityWork(); |
| } |
| +enum class SimulateInputType { None, TouchStart, TouchEnd }; |
| + |
| void AnticipationTestTask(RendererSchedulerImpl* scheduler, |
| - bool simulate_input, |
| + SimulateInputType simulate_input, |
| bool* is_anticipated_before, |
| bool* is_anticipated_after) { |
| *is_anticipated_before = scheduler->IsHighPriorityWorkAnticipated(); |
| - if (simulate_input) { |
| - scheduler->DidHandleInputEventOnCompositorThread( |
| - FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| - RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| + switch (simulate_input) { |
| + case SimulateInputType::None: |
| + break; |
| + |
| + case SimulateInputType::TouchStart: |
| + scheduler->DidHandleInputEventOnCompositorThread( |
| + FakeInputEvent(blink::WebInputEvent::TouchStart), |
| + RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| + break; |
| + |
| + case SimulateInputType::TouchEnd: |
| + scheduler->DidHandleInputEventOnCompositorThread( |
| + FakeInputEvent(blink::WebInputEvent::TouchEnd), |
| + RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| + break; |
| } |
| *is_anticipated_after = scheduler->IsHighPriorityWorkAnticipated(); |
| } |
| @@ -145,8 +158,6 @@ class RendererSchedulerImplForTest : public RendererSchedulerImpl { |
| public: |
| using RendererSchedulerImpl::OnIdlePeriodEnded; |
| using RendererSchedulerImpl::OnIdlePeriodStarted; |
| - using RendererSchedulerImpl::Policy; |
| - using RendererSchedulerImpl::PolicyToString; |
| RendererSchedulerImplForTest( |
| scoped_refptr<SchedulerTaskRunnerDelegate> main_task_runner) |
| @@ -155,6 +166,14 @@ class RendererSchedulerImplForTest : public RendererSchedulerImpl { |
| void UpdatePolicyLocked(UpdateType update_type) override { |
| update_policy_count_++; |
| RendererSchedulerImpl::UpdatePolicyLocked(update_type); |
| + |
| + std::string use_case = |
| + RendererScheduler::UseCaseToString(MainThreadOnly().current_use_case); |
| + if (MainThreadOnly().touchstart_expected_soon) { |
| + use_cases_.push_back(use_case + " scroll expected"); |
| + } else { |
| + use_cases_.push_back(use_case); |
| + } |
| } |
| void EnsureUrgentPolicyUpdatePostedOnMainThread() { |
| @@ -169,21 +188,22 @@ class RendererSchedulerImplForTest : public RendererSchedulerImpl { |
| bool BeginMainFrameOnCriticalPath() { |
| base::AutoLock lock(any_thread_lock_); |
| - return AnyThread().begin_main_frame_on_critical_path_; |
| + return AnyThread().begin_main_frame_on_critical_path; |
| } |
| int update_policy_count_; |
| + std::vector<std::string> use_cases_; |
| }; |
| // Lets gtest print human readable Policy values. |
| ::std::ostream& operator<<(::std::ostream& os, |
| - const RendererSchedulerImplForTest::Policy& policy) { |
| - return os << RendererSchedulerImplForTest::PolicyToString(policy); |
| + const RendererScheduler::UseCase& use_case) { |
| + return os << RendererScheduler::UseCaseToString(use_case); |
| } |
| class RendererSchedulerImplTest : public testing::Test { |
| public: |
| - using Policy = RendererSchedulerImpl::Policy; |
| + using UseCase = RendererSchedulerImpl::UseCase; |
| RendererSchedulerImplTest() : clock_(new base::SimpleTestTickClock()) { |
| clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
| @@ -249,16 +269,35 @@ class RendererSchedulerImplTest : public testing::Test { |
| } |
| void DoMainFrame() { |
| - scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
| + cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| - base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); |
| + base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL); |
| + begin_frame_args.on_critical_path = false; |
| + scheduler_->WillBeginFrame(begin_frame_args); |
| scheduler_->DidCommitFrameToCompositor(); |
| } |
| + void ForceMainThreadScrollingUseCase() { |
| + cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| + BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| + base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL); |
| + begin_frame_args.on_critical_path = true; |
| + scheduler_->WillBeginFrame(begin_frame_args); |
| + } |
| + |
| void EnableIdleTasks() { DoMainFrame(); } |
| - Policy CurrentPolicy() { |
| - return scheduler_->MainThreadOnly().current_policy_; |
| + UseCase CurrentUseCase() { |
| + return scheduler_->MainThreadOnly().current_use_case; |
| + } |
| + |
| + UseCase ForceUpdatePolicyAndGetCurrentUseCase() { |
| + scheduler_->ForceUpdatePolicy(); |
| + return scheduler_->MainThreadOnly().current_use_case; |
| + } |
| + |
| + bool TouchStartExpectedSoon() { |
| + return scheduler_->MainThreadOnly().touchstart_expected_soon; |
| } |
| // Helper for posting several tasks of specific types. |task_descriptor| is a |
| @@ -306,7 +345,12 @@ class RendererSchedulerImplTest : public testing::Test { |
| protected: |
| static base::TimeDelta priority_escalation_after_input_duration() { |
| return base::TimeDelta::FromMilliseconds( |
| - RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); |
| + UserModel::kGestureEstimationLimitMillis); |
| + } |
| + |
| + static base::TimeDelta subsequent_input_expected_after_input_duration() { |
| + return base::TimeDelta::FromMilliseconds( |
| + UserModel::kExpectSubsequentGestureMillis); |
| } |
| static base::TimeDelta maximum_idle_period_duration() { |
| @@ -339,11 +383,11 @@ class RendererSchedulerImplTest : public testing::Test { |
| } |
| } |
| - static void CheckAllPolicyToString() { |
| - CallForEachEnumValue<RendererSchedulerImpl::Policy>( |
| - RendererSchedulerImpl::Policy::FIRST_POLICY, |
| - RendererSchedulerImpl::Policy::POLICY_COUNT, |
| - &RendererSchedulerImpl::PolicyToString); |
| + static void CheckAllUseCaseToString() { |
| + CallForEachEnumValue<RendererSchedulerImpl::UseCase>( |
| + RendererSchedulerImpl::UseCase::FIRST_USE_CASE, |
| + RendererSchedulerImpl::UseCase::USE_CASE_COUNT, |
| + &RendererSchedulerImpl::UseCaseToString); |
| } |
| scoped_ptr<base::SimpleTestTickClock> clock_; |
| @@ -575,8 +619,9 @@ TEST_F(RendererSchedulerImplTest, TestDefaultPolicy) { |
| RunUntilIdle(); |
| EXPECT_THAT(run_order, |
| testing::ElementsAre(std::string("L1"), std::string("D1"), |
| - std::string("C1"), std::string("D2"), |
| + std::string("D2"), std::string("C1"), |
| std::string("C2"), std::string("I1"))); |
| + EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_CompositorHandlesInput) { |
| @@ -589,9 +634,10 @@ TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_CompositorHandlesInput) { |
| EnableIdleTasks(); |
| RunUntilIdle(); |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("C1"), std::string("C2"), |
| - std::string("L1"), std::string("D1"), |
| - std::string("D2"), std::string("I1"))); |
| + testing::ElementsAre(std::string("L1"), std::string("D1"), |
| + std::string("C1"), std::string("D2"), |
| + std::string("C2"), std::string("I1"))); |
| + EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput) { |
| @@ -604,9 +650,10 @@ TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput) { |
| EnableIdleTasks(); |
| RunUntilIdle(); |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("C1"), std::string("C2"), |
| - std::string("L1"), std::string("D1"), |
| - std::string("D2"), std::string("I1"))); |
| + testing::ElementsAre(std::string("L1"), std::string("D1"), |
| + std::string("C1"), std::string("D2"), |
| + std::string("C2"), std::string("I1"))); |
| + EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); |
| scheduler_->DidHandleInputEventOnMainThread( |
| FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| } |
| @@ -619,9 +666,10 @@ TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { |
| EnableIdleTasks(); |
| RunUntilIdle(); |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("C1"), std::string("C2"), |
| - std::string("D1"), std::string("D2"), |
| + testing::ElementsAre(std::string("D1"), std::string("C1"), |
| + std::string("D2"), std::string("C2"), |
| std::string("I1"))); |
| + EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); |
| } |
| TEST_F( |
| @@ -642,9 +690,12 @@ TEST_F( |
| PostTestTasks(&run_order, "C1 T1"); |
| scheduler_->DidAnimateForInputOnCompositorThread(); |
| - scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
| + cc::BeginFrameArgs begin_frame_args1 = cc::BeginFrameArgs::Create( |
| BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| - base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL)); |
| + base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL); |
| + begin_frame_args1.on_critical_path = true; |
| + scheduler_->WillBeginFrame(begin_frame_args1); |
| + scheduler_->DidCommitFrameToCompositor(); // Starts Idle Period |
| RunUntilIdle(); |
| EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1"))); |
| @@ -798,28 +849,35 @@ TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_MainThread) { |
| TEST_F(RendererSchedulerImplTest, LoadingPriorityPolicy) { |
| std::vector<std::string> run_order; |
| - PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| + PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); |
| scheduler_->OnPageLoadStarted(); |
| EnableIdleTasks(); |
| RunUntilIdle(); |
| - // In loading policy compositor tasks are best effort and should be run last. |
| - EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("L1"), std::string("D1"), |
| - std::string("D2"), std::string("I1"), |
| - std::string("C1"), std::string("C2"))); |
| - // Advance 1.5s and try again, the loading policy should have ended and the |
| - // task order should return to normal. |
| - clock_->Advance(base::TimeDelta::FromMilliseconds(1500)); |
| + // In loading policy, loading tasks are prioritized other others. |
| + std::string loading_policy_expected[] = { |
| + std::string("L1"), std::string("L2"), std::string("D1"), |
| + std::string("C1"), std::string("T1"), std::string("D2"), |
| + std::string("C2"), std::string("T2"), std::string("I1")}; |
| + EXPECT_THAT(run_order, testing::ElementsAreArray(loading_policy_expected)); |
| + EXPECT_EQ(RendererScheduler::UseCase::LOADING, CurrentUseCase()); |
| + |
| + // Advance 15s and try again, the loading policy should have ended and the |
| + // task order should return to the NONE use case where loading tasks |
| + // are prioritized. |
| + clock_->Advance(base::TimeDelta::FromMilliseconds(150000)); |
| run_order.clear(); |
| - PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| + PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); |
| EnableIdleTasks(); |
| RunUntilIdle(); |
| - EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("L1"), std::string("D1"), |
| - std::string("C1"), std::string("D2"), |
| - std::string("C2"), std::string("I1"))); |
| + // Loading tasks are actually still priprized byd efault. |
| + std::string default_order_expected[] = { |
| + std::string("L1"), std::string("L2"), std::string("D1"), |
| + std::string("C1"), std::string("T1"), std::string("D2"), |
| + std::string("C2"), std::string("T2"), std::string("I1")}; |
| + EXPECT_THAT(run_order, testing::ElementsAreArray(default_order_expected)); |
| + EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, |
| @@ -827,15 +885,17 @@ TEST_F(RendererSchedulerImplTest, |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::MouseMove), |
| RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are not prioritized. |
| + EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("D1"), std::string("C1"), |
| - std::string("D2"), std::string("C2"), |
| + testing::ElementsAre(std::string("D1"), std::string("D2"), |
| + std::string("C1"), std::string("C2"), |
| std::string("I1"))); |
| } |
| @@ -844,18 +904,18 @@ TEST_F(RendererSchedulerImplTest, |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::MouseMove), |
| RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are not prioritized. |
| + EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("D1"), std::string("C1"), |
| - std::string("D2"), std::string("C2"), |
| + testing::ElementsAre(std::string("D1"), std::string("D2"), |
| + std::string("C1"), std::string("C2"), |
| std::string("I1"))); |
| - scheduler_->DidHandleInputEventOnMainThread( |
| - FakeInputEvent(blink::WebInputEvent::MouseMove)); |
| } |
| TEST_F(RendererSchedulerImplTest, |
| @@ -863,11 +923,12 @@ TEST_F(RendererSchedulerImplTest, |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::MouseMove, |
| blink::WebInputEvent::LeftButtonDown), |
| RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are prioritized. |
| EXPECT_THAT(run_order, |
| @@ -881,11 +942,12 @@ TEST_F(RendererSchedulerImplTest, |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::MouseMove, |
| blink::WebInputEvent::LeftButtonDown), |
| RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are prioritized. |
| EXPECT_THAT(run_order, |
| @@ -900,10 +962,11 @@ TEST_F(RendererSchedulerImplTest, EventConsumedOnCompositorThread_MouseWheel) { |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::MouseWheel), |
| RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are prioritized. |
| EXPECT_THAT(run_order, |
| @@ -916,18 +979,18 @@ TEST_F(RendererSchedulerImplTest, EventForwardedToMainThread_MouseWheel) { |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::MouseWheel), |
| RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are prioritized. |
| EXPECT_THAT(run_order, |
| testing::ElementsAre(std::string("C1"), std::string("C2"), |
| std::string("D1"), std::string("D2"), |
| std::string("I1"))); |
| - scheduler_->DidHandleInputEventOnMainThread( |
| - FakeInputEvent(blink::WebInputEvent::MouseWheel)); |
| + EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, |
| @@ -935,16 +998,18 @@ TEST_F(RendererSchedulerImplTest, |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::KeyDown), |
| RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are not prioritized. |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("D1"), std::string("C1"), |
| - std::string("D2"), std::string("C2"), |
| + testing::ElementsAre(std::string("D1"), std::string("D2"), |
|
Sami
2015/09/07 16:57:57
This should change back now that we're no longer p
alex clarke (OOO till 29th)
2015/09/07 17:14:29
It did. I think you're looking at the wrong patch
|
| + std::string("C1"), std::string("C2"), |
| std::string("I1"))); |
| + EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, |
| @@ -952,22 +1017,28 @@ TEST_F(RendererSchedulerImplTest, |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::KeyDown), |
| RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| - EnableIdleTasks(); |
| RunUntilIdle(); |
| // Note compositor tasks are not prioritized. |
| EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("D1"), std::string("C1"), |
| - std::string("D2"), std::string("C2"), |
| + testing::ElementsAre(std::string("D1"), std::string("D2"), |
| + std::string("C1"), std::string("C2"), |
| std::string("I1"))); |
| + EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| + // Note compositor tasks are not prioritized. |
| scheduler_->DidHandleInputEventOnMainThread( |
| FakeInputEvent(blink::WebInputEvent::KeyDown)); |
| } |
| TEST_F(RendererSchedulerImplTest, |
| - TestCompositorPolicyDoesNotStarveDefaultTasks) { |
| + TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) { |
| + ForceMainThreadScrollingUseCase(); |
| + scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks. |
| + |
| std::vector<std::string> run_order; |
| PostTestTasks(&run_order, "D1 C1"); |
| @@ -989,52 +1060,28 @@ TEST_F(RendererSchedulerImplTest, |
| TEST_F(RendererSchedulerImplTest, |
| TestCompositorPolicyEnds_CompositorHandlesInput) { |
| - std::vector<std::string> run_order; |
| - PostTestTasks(&run_order, "D1 C1 D2 C2"); |
| - |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| - RunUntilIdle(); |
| - EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("C1"), std::string("C2"), |
| - std::string("D1"), std::string("D2"))); |
| + EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
| + ForceUpdatePolicyAndGetCurrentUseCase()); |
| - run_order.clear(); |
| clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); |
| - PostTestTasks(&run_order, "D1 C1 D2 C2"); |
| - |
| - // Compositor policy mode should have ended now that the clock has advanced. |
| - RunUntilIdle(); |
| - EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("D1"), std::string("C1"), |
| - std::string("D2"), std::string("C2"))); |
| + EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, |
| TestCompositorPolicyEnds_MainThreadHandlesInput) { |
| - std::vector<std::string> run_order; |
| - PostTestTasks(&run_order, "D1 C1 D2 C2"); |
| - |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| scheduler_->DidHandleInputEventOnMainThread( |
| FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| - RunUntilIdle(); |
| - EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("C1"), std::string("C2"), |
| - std::string("D1"), std::string("D2"))); |
| + EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
| + ForceUpdatePolicyAndGetCurrentUseCase()); |
| - run_order.clear(); |
| clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); |
| - PostTestTasks(&run_order, "D1 C1 D2 C2"); |
| - |
| - // Compositor policy mode should have ended now that the clock has advanced. |
| - RunUntilIdle(); |
| - EXPECT_THAT(run_order, |
| - testing::ElementsAre(std::string("D1"), std::string("C1"), |
| - std::string("D2"), std::string("C2"))); |
| + EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| } |
| TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { |
| @@ -1098,22 +1145,25 @@ TEST_F(RendererSchedulerImplTest, TestIsHighPriorityWorkAnticipated) { |
| bool is_anticipated_before = false; |
| bool is_anticipated_after = false; |
| - bool simulate_input = false; |
| default_task_runner_->PostTask( |
| - FROM_HERE, |
| - base::Bind(&AnticipationTestTask, scheduler_.get(), simulate_input, |
| - &is_anticipated_before, &is_anticipated_after)); |
| + FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), |
| + SimulateInputType::None, &is_anticipated_before, |
| + &is_anticipated_after)); |
| RunUntilIdle(); |
| // In its default state, without input receipt, the scheduler should indicate |
| // that no high-priority is anticipated. |
| EXPECT_FALSE(is_anticipated_before); |
| EXPECT_FALSE(is_anticipated_after); |
| - simulate_input = true; |
| default_task_runner_->PostTask( |
| - FROM_HERE, |
| - base::Bind(&AnticipationTestTask, scheduler_.get(), simulate_input, |
| - &is_anticipated_before, &is_anticipated_after)); |
| + FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), |
| + SimulateInputType::TouchStart, |
| + &is_anticipated_before, &is_anticipated_after)); |
| + bool dummy; |
| + default_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), |
| + SimulateInputType::TouchEnd, &dummy, &dummy)); |
| + |
| RunUntilIdle(); |
| // When input is received, the scheduler should indicate that high-priority |
| // work is anticipated. |
| @@ -1121,14 +1171,29 @@ TEST_F(RendererSchedulerImplTest, TestIsHighPriorityWorkAnticipated) { |
| EXPECT_TRUE(is_anticipated_after); |
| clock_->Advance(priority_escalation_after_input_duration() * 2); |
| - simulate_input = false; |
| default_task_runner_->PostTask( |
| - FROM_HERE, |
| - base::Bind(&AnticipationTestTask, scheduler_.get(), simulate_input, |
| - &is_anticipated_before, &is_anticipated_after)); |
| - RunUntilIdle(); |
| - // Without additional input, the scheduler should indicate that high-priority |
| - // work is no longer anticipated. |
| + FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), |
| + SimulateInputType::None, &is_anticipated_before, |
| + &is_anticipated_after)); |
| + RunUntilIdle(); |
| + // Without additional input, the scheduler should go into NONE |
| + // use case but with scrolling expected where high-priority work is still |
| + // anticipated. |
| + EXPECT_EQ(UseCase::NONE, CurrentUseCase()); |
| + EXPECT_TRUE(TouchStartExpectedSoon()); |
| + EXPECT_TRUE(is_anticipated_before); |
| + EXPECT_TRUE(is_anticipated_after); |
| + |
| + clock_->Advance(subsequent_input_expected_after_input_duration() * 2); |
| + default_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), |
| + SimulateInputType::None, &is_anticipated_before, |
| + &is_anticipated_after)); |
| + RunUntilIdle(); |
| + // Eventually the scheduler should go into the default use case where |
| + // high-priority work is no longer anticipated. |
| + EXPECT_EQ(UseCase::NONE, CurrentUseCase()); |
| + EXPECT_FALSE(TouchStartExpectedSoon()); |
| EXPECT_FALSE(is_anticipated_before); |
| EXPECT_FALSE(is_anticipated_after); |
| } |
| @@ -1137,6 +1202,8 @@ TEST_F(RendererSchedulerImplTest, TestShouldYield) { |
| bool should_yield_before = false; |
| bool should_yield_after = false; |
| + ForceMainThreadScrollingUseCase(); |
| + |
| default_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), |
| default_task_runner_, false, &should_yield_before, |
| @@ -1151,7 +1218,7 @@ TEST_F(RendererSchedulerImplTest, TestShouldYield) { |
| compositor_task_runner_, false, |
| &should_yield_before, &should_yield_after)); |
| RunUntilIdle(); |
| - // Posting while not in compositor priority shouldn't cause yielding. |
| + // Posting while not mainthread scrolling shouldn't cause yielding. |
| EXPECT_FALSE(should_yield_before); |
| EXPECT_FALSE(should_yield_after); |
| @@ -1163,7 +1230,9 @@ TEST_F(RendererSchedulerImplTest, TestShouldYield) { |
| // We should be able to switch to compositor priority mid-task. |
| EXPECT_FALSE(should_yield_before); |
| EXPECT_TRUE(should_yield_after); |
| +} |
| +TEST_F(RendererSchedulerImplTest, TestShouldYield_TouchStart) { |
| // Receiving a touchstart should immediately trigger yielding, even if |
| // there's no immediately pending work in the compositor queue. |
| EXPECT_FALSE(scheduler_->ShouldYieldForHighPriorityWork()); |
| @@ -1175,14 +1244,14 @@ TEST_F(RendererSchedulerImplTest, TestShouldYield) { |
| } |
| TEST_F(RendererSchedulerImplTest, SlowMainThreadInputEvent) { |
| - EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); |
| + EXPECT_EQ(UseCase::NONE, CurrentUseCase()); |
| // An input event should bump us into input priority. |
| scheduler_->DidHandleInputEventOnCompositorThread( |
| FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| RunUntilIdle(); |
| - EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); |
| + EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); |
| // Simulate the input event being queued for a very long time. The compositor |
| // task we post here represents the enqueued input task. |
| @@ -1193,12 +1262,12 @@ TEST_F(RendererSchedulerImplTest, SlowMainThreadInputEvent) { |
| // Even though we exceeded the input priority escalation period, we should |
| // still be in compositor priority since the input remains queued. |
| - EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); |
| + EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); |
| // After the escalation period ends we should go back into normal mode. |
| clock_->Advance(priority_escalation_after_input_duration() * 2); |
| RunUntilIdle(); |
| - EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); |
| + EXPECT_EQ(UseCase::NONE, CurrentUseCase()); |
| } |
| class RendererSchedulerImplWithMockSchedulerTest |
| @@ -1401,10 +1470,14 @@ TEST_F(RendererSchedulerImplWithMockSchedulerTest, |
| EXPECT_EQ(1, mock_scheduler_->update_policy_count_); |
| - RunUntilIdle(); |
| // We expect both the urgent and the delayed updates to run in addition to the |
| - // earlier updated cause by IsHighPriorityWorkAnticipated. |
| - EXPECT_EQ(3, mock_scheduler_->update_policy_count_); |
| + // earlier updated cause by IsHighPriorityWorkAnticipated, a final update |
| + // transitions from 'not_scrolling scroll expected' to 'not_scrolling'. |
| + RunUntilIdle(); |
| + EXPECT_THAT(mock_scheduler_->use_cases_, |
| + testing::ElementsAre( |
| + std::string("touchstart"), std::string("touchstart"), |
| + std::string("none scroll expected"), std::string("none"))); |
| } |
| class RendererSchedulerImplWithMessageLoopTest |
| @@ -1759,8 +1832,8 @@ TEST_F(RendererSchedulerImplTest, MultipleSuspendsNeedMultipleResumes) { |
| testing::ElementsAre(std::string("T1"), std::string("T2"))); |
| } |
| -TEST_F(RendererSchedulerImplTest, PolicyToString) { |
| - CheckAllPolicyToString(); |
| +TEST_F(RendererSchedulerImplTest, UseCaseToString) { |
| + CheckAllUseCaseToString(); |
| } |
| TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { |