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