Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(633)

Unified Diff: components/scheduler/renderer/renderer_scheduler_impl_unittest.cc

Issue 1337993002: Revert of Optimize for TouchStart responsiveness (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 8dbc7901814a21ceafc84a04191716a3aec65cba..f34f2f01fb524c18ca836e10c31361a7b985785f 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -126,46 +126,15 @@
*should_yield_after = scheduler->ShouldYieldForHighPriorityWork();
}
-enum class SimulateInputType {
- None,
- TouchStart,
- TouchEnd,
- GestureScrollBegin,
- GestureScrollEnd
-};
-
void AnticipationTestTask(RendererSchedulerImpl* scheduler,
- SimulateInputType simulate_input,
+ bool simulate_input,
bool* is_anticipated_before,
bool* is_anticipated_after) {
*is_anticipated_before = scheduler->IsHighPriorityWorkAnticipated();
- 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;
-
- case SimulateInputType::GestureScrollBegin:
- scheduler->DidHandleInputEventOnCompositorThread(
- FakeInputEvent(blink::WebInputEvent::GestureScrollBegin),
- RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
- break;
-
- case SimulateInputType::GestureScrollEnd:
- scheduler->DidHandleInputEventOnCompositorThread(
- FakeInputEvent(blink::WebInputEvent::GestureScrollEnd),
- RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
- break;
+ if (simulate_input) {
+ scheduler->DidHandleInputEventOnCompositorThread(
+ FakeInputEvent(blink::WebInputEvent::GestureFlingStart),
+ RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
}
*is_anticipated_after = scheduler->IsHighPriorityWorkAnticipated();
}
@@ -176,6 +145,8 @@
public:
using RendererSchedulerImpl::OnIdlePeriodEnded;
using RendererSchedulerImpl::OnIdlePeriodStarted;
+ using RendererSchedulerImpl::Policy;
+ using RendererSchedulerImpl::PolicyToString;
RendererSchedulerImplForTest(
scoped_refptr<SchedulerTaskRunnerDelegate> main_task_runner)
@@ -184,14 +155,6 @@
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() {
@@ -206,22 +169,21 @@
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 RendererScheduler::UseCase& use_case) {
- return os << RendererScheduler::UseCaseToString(use_case);
+ const RendererSchedulerImplForTest::Policy& policy) {
+ return os << RendererSchedulerImplForTest::PolicyToString(policy);
}
class RendererSchedulerImplTest : public testing::Test {
public:
- using UseCase = RendererSchedulerImpl::UseCase;
+ using Policy = RendererSchedulerImpl::Policy;
RendererSchedulerImplTest() : clock_(new base::SimpleTestTickClock()) {
clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
@@ -287,47 +249,16 @@
}
void DoMainFrame() {
- cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
+ scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
- base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL);
- begin_frame_args.on_critical_path = false;
- scheduler_->WillBeginFrame(begin_frame_args);
+ base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL));
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(); }
- 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;
- }
-
- bool HaveSeenABeginMainframe() {
- return scheduler_->MainThreadOnly().have_seen_a_begin_main_frame;
- }
-
- bool LoadingTasksSeemExpensive() {
- return scheduler_->MainThreadOnly().loading_tasks_seem_expensive;
- }
-
- bool TimerTasksSeemExpensive() {
- return scheduler_->MainThreadOnly().timer_tasks_seem_expensive;
+ Policy CurrentPolicy() {
+ return scheduler_->MainThreadOnly().current_policy_;
}
// Helper for posting several tasks of specific types. |task_descriptor| is a
@@ -375,12 +306,7 @@
protected:
static base::TimeDelta priority_escalation_after_input_duration() {
return base::TimeDelta::FromMilliseconds(
- UserModel::kGestureEstimationLimitMillis);
- }
-
- static base::TimeDelta subsequent_input_expected_after_input_duration() {
- return base::TimeDelta::FromMilliseconds(
- UserModel::kExpectSubsequentGestureMillis);
+ RendererSchedulerImpl::kPriorityEscalationAfterInputMillis);
}
static base::TimeDelta maximum_idle_period_duration() {
@@ -413,11 +339,11 @@
}
}
- static void CheckAllUseCaseToString() {
- CallForEachEnumValue<RendererSchedulerImpl::UseCase>(
- RendererSchedulerImpl::UseCase::FIRST_USE_CASE,
- RendererSchedulerImpl::UseCase::USE_CASE_COUNT,
- &RendererSchedulerImpl::UseCaseToString);
+ static void CheckAllPolicyToString() {
+ CallForEachEnumValue<RendererSchedulerImpl::Policy>(
+ RendererSchedulerImpl::Policy::FIRST_POLICY,
+ RendererSchedulerImpl::Policy::POLICY_COUNT,
+ &RendererSchedulerImpl::PolicyToString);
}
scoped_ptr<base::SimpleTestTickClock> clock_;
@@ -651,7 +577,6 @@
testing::ElementsAre(std::string("L1"), std::string("D1"),
std::string("C1"), std::string("D2"),
std::string("C2"), std::string("I1")));
- EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase());
}
TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_CompositorHandlesInput) {
@@ -664,10 +589,9 @@
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")));
- EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
+ testing::ElementsAre(std::string("C1"), std::string("C2"),
+ std::string("L1"), std::string("D1"),
+ std::string("D2"), std::string("I1")));
}
TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_MainThreadHandlesInput) {
@@ -680,10 +604,9 @@
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")));
- EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
+ testing::ElementsAre(std::string("C1"), std::string("C2"),
+ std::string("L1"), std::string("D1"),
+ std::string("D2"), std::string("I1")));
scheduler_->DidHandleInputEventOnMainThread(
FakeInputEvent(blink::WebInputEvent::GestureFlingStart));
}
@@ -696,20 +619,15 @@
EnableIdleTasks();
RunUntilIdle();
EXPECT_THAT(run_order,
- testing::ElementsAre(std::string("D1"), std::string("C1"),
- std::string("D2"), std::string("C2"),
+ testing::ElementsAre(std::string("C1"), std::string("C2"),
+ std::string("D1"), std::string("D2"),
std::string("I1")));
- EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
}
TEST_F(
RendererSchedulerImplTest,
TestCompositorPolicy_ExpensiveTimersDontRunWhenMainThreadOnCriticalPath) {
std::vector<std::string> run_order;
-
- // RunUntilIdle won't actually run all of the SimpleTestTickClock::Advance
- // tasks unless we set AutoAdvanceNow to true :/
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
// Simulate a bunch of expensive timer tasks
for (int i = 0; i < 10; i++) {
@@ -718,66 +636,38 @@
base::Unretained(clock_.get()),
base::TimeDelta::FromMilliseconds(500)));
}
-
- RunUntilIdle();
-
- // Switch back to not auto-advancing because we want to be in control of when
- // time advances.
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(false);
-
- // Timers should now be disabled during main thread user user interactions.
+ RunUntilIdle();
+
+ // Timers should now be disabled during main thread user userinteractions.
PostTestTasks(&run_order, "C1 T1");
- // Trigger main_thread_gesture UseCase
scheduler_->DidAnimateForInputOnCompositorThread();
- cc::BeginFrameArgs begin_frame_args1 = cc::BeginFrameArgs::Create(
+ scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
- base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
- begin_frame_args1.on_critical_path = true;
- scheduler_->WillBeginFrame(begin_frame_args1);
- RunUntilIdle();
- EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+ base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL));
+ RunUntilIdle();
EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1")));
- clock_->Advance(subsequent_input_expected_after_input_duration() * 2);
+ clock_->Advance(priority_escalation_after_input_duration() * 2);
run_order.clear();
RunUntilIdle();
- EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase());
EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1")));
}
-TEST_F(RendererSchedulerImplTest, Navigation_ResetsTaskCostEstimations) {
- std::vector<std::string> run_order;
-
- // RunUntilIdle won't actually run all of the SimpleTestTickClock::Advance
- // tasks unless we set AutoAdvanceNow to true :/
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
-
- // Simulate a bunch of expensive timer tasks
- for (int i = 0; i < 10; i++) {
- timer_task_runner_->PostTask(
- FROM_HERE, base::Bind(&base::SimpleTestTickClock::Advance,
- base::Unretained(clock_.get()),
- base::TimeDelta::FromMilliseconds(500)));
- }
-
- RunUntilIdle();
-
- // Switch back to not auto-advancing because we want to be in control of when
- // time advances.
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(false);
-
- scheduler_->OnPageLoadStarted();
+TEST_F(RendererSchedulerImplTest,
+ TestCompositorPolicy_TimersAlwaysRunIfNoRecentIdlePeriod) {
+ std::vector<std::string> run_order;
PostTestTasks(&run_order, "C1 T1");
+ // Simulate no recent idle period.
+ clock_->Advance(idle_period_starvation_threshold() * 2);
+
scheduler_->DidAnimateForInputOnCompositorThread();
- cc::BeginFrameArgs begin_frame_args1 = cc::BeginFrameArgs::Create(
+ scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
- base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL);
- begin_frame_args1.on_critical_path = true;
- scheduler_->WillBeginFrame(begin_frame_args1);
- scheduler_->DidCommitFrameToCompositor(); // Starts Idle Period
+ base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL));
+
RunUntilIdle();
EXPECT_THAT(run_order,
@@ -906,38 +796,30 @@
std::string("T2")));
}
-// TODO(alexclarke): Reenable once we've reinstaed the Loading UseCase.
-TEST_F(RendererSchedulerImplTest, DISABLED_LoadingUseCase) {
- std::vector<std::string> run_order;
- PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2");
+TEST_F(RendererSchedulerImplTest, LoadingPriorityPolicy) {
+ std::vector<std::string> run_order;
+ PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2");
scheduler_->OnPageLoadStarted();
EnableIdleTasks();
RunUntilIdle();
-
- // In loading policy, loading tasks are prioritized other others.
- std::string loading_policy_expected[] = {
- std::string("D1"), std::string("L1"), std::string("D2"),
- std::string("L2"), std::string("C1"), std::string("T1"),
- 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 no
- // longer prioritized.
- clock_->Advance(base::TimeDelta::FromMilliseconds(150000));
+ // 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));
run_order.clear();
- PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2");
- EnableIdleTasks();
- RunUntilIdle();
-
- std::string default_order_expected[] = {
- std::string("D1"), std::string("C1"), std::string("T1"),
- std::string("L1"), std::string("D2"), std::string("C2"),
- std::string("T2"), std::string("L2"), std::string("I1")};
- EXPECT_THAT(run_order, testing::ElementsAreArray(default_order_expected));
- EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase());
+ PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2");
+ 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")));
}
TEST_F(RendererSchedulerImplTest,
@@ -945,14 +827,12 @@
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"),
@@ -964,18 +844,18 @@
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"),
std::string("I1")));
+ scheduler_->DidHandleInputEventOnMainThread(
+ FakeInputEvent(blink::WebInputEvent::MouseMove));
}
TEST_F(RendererSchedulerImplTest,
@@ -983,12 +863,11 @@
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,
@@ -1002,12 +881,11 @@
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,
@@ -1022,11 +900,10 @@
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,
@@ -1039,18 +916,18 @@
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")));
- EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+ scheduler_->DidHandleInputEventOnMainThread(
+ FakeInputEvent(blink::WebInputEvent::MouseWheel));
}
TEST_F(RendererSchedulerImplTest,
@@ -1058,18 +935,16 @@
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"),
std::string("I1")));
- EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase());
}
TEST_F(RendererSchedulerImplTest,
@@ -1077,28 +952,22 @@
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"),
std::string("I1")));
- EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase());
- // Note compositor tasks are not prioritized.
scheduler_->DidHandleInputEventOnMainThread(
FakeInputEvent(blink::WebInputEvent::KeyDown));
}
TEST_F(RendererSchedulerImplTest,
- TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) {
- ForceMainThreadScrollingUseCase();
- scheduler_->DidCommitFrameToCompositor(); // Enable Idle tasks.
-
+ TestCompositorPolicyDoesNotStarveDefaultTasks) {
std::vector<std::string> run_order;
PostTestTasks(&run_order, "D1 C1");
@@ -1120,28 +989,52 @@
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);
- EXPECT_EQ(UseCase::COMPOSITOR_GESTURE,
- ForceUpdatePolicyAndGetCurrentUseCase());
-
+ RunUntilIdle();
+ EXPECT_THAT(run_order,
+ testing::ElementsAre(std::string("C1"), std::string("C2"),
+ std::string("D1"), std::string("D2")));
+
+ run_order.clear();
clock_->Advance(base::TimeDelta::FromMilliseconds(1000));
- EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase());
+ 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")));
}
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));
- EXPECT_EQ(UseCase::COMPOSITOR_GESTURE,
- ForceUpdatePolicyAndGetCurrentUseCase());
-
+ RunUntilIdle();
+ EXPECT_THAT(run_order,
+ testing::ElementsAre(std::string("C1"), std::string("C2"),
+ std::string("D1"), std::string("D2")));
+
+ run_order.clear();
clock_->Advance(base::TimeDelta::FromMilliseconds(1000));
- EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase());
+ 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")));
}
TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) {
@@ -1205,33 +1098,22 @@
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(),
- SimulateInputType::None, &is_anticipated_before,
- &is_anticipated_after));
+ FROM_HERE,
+ base::Bind(&AnticipationTestTask, scheduler_.get(), simulate_input,
+ &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);
- default_task_runner_->PostTask(
- 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));
+ simulate_input = true;
default_task_runner_->PostTask(
FROM_HERE,
- base::Bind(&AnticipationTestTask, scheduler_.get(),
- SimulateInputType::GestureScrollBegin, &dummy, &dummy));
- default_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&AnticipationTestTask, scheduler_.get(),
- SimulateInputType::GestureScrollEnd, &dummy, &dummy));
-
+ base::Bind(&AnticipationTestTask, scheduler_.get(), simulate_input,
+ &is_anticipated_before, &is_anticipated_after));
RunUntilIdle();
// When input is received, the scheduler should indicate that high-priority
// work is anticipated.
@@ -1239,29 +1121,14 @@
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(),
- 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());
+ 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.
EXPECT_FALSE(is_anticipated_before);
EXPECT_FALSE(is_anticipated_after);
}
@@ -1269,8 +1136,6 @@
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(),
@@ -1286,7 +1151,7 @@
compositor_task_runner_, false,
&should_yield_before, &should_yield_after));
RunUntilIdle();
- // Posting while not mainthread scrolling shouldn't cause yielding.
+ // Posting while not in compositor priority shouldn't cause yielding.
EXPECT_FALSE(should_yield_before);
EXPECT_FALSE(should_yield_after);
@@ -1298,9 +1163,7 @@
// 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());
@@ -1312,14 +1175,14 @@
}
TEST_F(RendererSchedulerImplTest, SlowMainThreadInputEvent) {
- EXPECT_EQ(UseCase::NONE, CurrentUseCase());
+ EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
// 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(UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
+ EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy());
// Simulate the input event being queued for a very long time. The compositor
// task we post here represents the enqueued input task.
@@ -1330,12 +1193,12 @@
// Even though we exceeded the input priority escalation period, we should
// still be in compositor priority since the input remains queued.
- EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
+ EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy());
// After the escalation period ends we should go back into normal mode.
clock_->Advance(priority_escalation_after_input_duration() * 2);
RunUntilIdle();
- EXPECT_EQ(UseCase::NONE, CurrentUseCase());
+ EXPECT_EQ(Policy::NORMAL, CurrentPolicy());
}
class RendererSchedulerImplWithMockSchedulerTest
@@ -1513,7 +1376,7 @@
FakeInputEvent(blink::WebInputEvent::TouchStart),
RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
scheduler_->DidHandleInputEventOnCompositorThread(
- FakeInputEvent(blink::WebInputEvent::GestureScrollBegin),
+ FakeInputEvent(blink::WebInputEvent::TouchMove),
RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
// We expect the first call to IsHighPriorityWorkAnticipated to be called
@@ -1534,19 +1397,14 @@
scheduler_->DidHandleInputEventOnMainThread(
FakeInputEvent(blink::WebInputEvent::TouchStart));
scheduler_->DidHandleInputEventOnMainThread(
- FakeInputEvent(blink::WebInputEvent::GestureScrollBegin));
+ FakeInputEvent(blink::WebInputEvent::TouchMove));
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, a final update
- // transitions from 'not_scrolling scroll expected' to 'not_scrolling'.
- RunUntilIdle();
- EXPECT_THAT(mock_scheduler_->use_cases_,
- testing::ElementsAre(std::string("compositor_gesture"),
- std::string("compositor_gesture"),
- std::string("none scroll expected"),
- std::string("none")));
+ // earlier updated cause by IsHighPriorityWorkAnticipated.
+ EXPECT_EQ(3, mock_scheduler_->update_policy_count_);
}
class RendererSchedulerImplWithMessageLoopTest
@@ -1901,8 +1759,8 @@
testing::ElementsAre(std::string("T1"), std::string("T2")));
}
-TEST_F(RendererSchedulerImplTest, UseCaseToString) {
- CheckAllUseCaseToString();
+TEST_F(RendererSchedulerImplTest, PolicyToString) {
+ CheckAllPolicyToString();
}
TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) {
@@ -1976,48 +1834,4 @@
RunUntilIdle();
EXPECT_THAT(run_order, testing::ElementsAre(std::string("T6")));
}
-
-TEST_F(RendererSchedulerImplTest,
- ExpensiveLoadingTasksNotBlockedTillFirstBeginMainFrame) {
- std::vector<std::string> run_order;
-
- // RunUntilIdle won't actually run all of the SimpleTestTickClock::Advance
- // tasks unless we set AutoAdvanceNow to true :/
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
-
- // Simulate a bunch of expensive loading tasks
- for (int i = 0; i < 10; i++) {
- loading_task_runner_->PostTask(
- FROM_HERE, base::Bind(&base::SimpleTestTickClock::Advance,
- base::Unretained(clock_.get()),
- base::TimeDelta::FromMilliseconds(500)));
- }
-
- RunUntilIdle();
-
- PostTestTasks(&run_order, "L1 D1");
- RunUntilIdle();
-
- EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase());
- EXPECT_FALSE(HaveSeenABeginMainframe());
- EXPECT_TRUE(LoadingTasksSeemExpensive());
- EXPECT_FALSE(TimerTasksSeemExpensive());
- EXPECT_THAT(run_order,
- testing::ElementsAre(std::string("L1"), std::string("D1")));
-
- // Emit a BeginMainFrame, and the loading task should get blocked.
- DoMainFrame();
- run_order.clear();
-
- PostTestTasks(&run_order, "L1 D1");
- RunUntilIdle();
-
- EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase());
- EXPECT_TRUE(HaveSeenABeginMainframe());
- EXPECT_TRUE(LoadingTasksSeemExpensive());
- EXPECT_FALSE(TimerTasksSeemExpensive());
- EXPECT_THAT(run_order,
- testing::ElementsAre(std::string("L1"), std::string("D1")));
-}
-
} // namespace scheduler
« no previous file with comments | « components/scheduler/renderer/renderer_scheduler_impl.cc ('k') | components/scheduler/renderer/task_cost_estimator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698