| 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 "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "cc/output/begin_frame_args.h" | 8 #include "cc/output/begin_frame_args.h" |
| 9 #include "cc/test/ordered_simple_task_runner.h" | 9 #include "cc/test/ordered_simple_task_runner.h" |
| 10 #include "cc/test/test_now_source.h" |
| 10 #include "content/child/scheduler/nestable_task_runner_for_test.h" | 11 #include "content/child/scheduler/nestable_task_runner_for_test.h" |
| 11 #include "content/child/scheduler/scheduler_message_loop_delegate.h" | 12 #include "content/child/scheduler/scheduler_message_loop_delegate.h" |
| 13 #include "content/test/test_time_source.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 16 |
| 15 namespace content { | 17 namespace content { |
| 16 | 18 |
| 17 namespace { | 19 namespace { |
| 18 class FakeInputEvent : public blink::WebInputEvent { | 20 class FakeInputEvent : public blink::WebInputEvent { |
| 19 public: | 21 public: |
| 20 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) | 22 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) |
| 21 : WebInputEvent(sizeof(FakeInputEvent)) { | 23 : WebInputEvent(sizeof(FakeInputEvent)) { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 : clock_(cc::TestNowSource::Create(5000)), | 131 : clock_(cc::TestNowSource::Create(5000)), |
| 130 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), | 132 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), |
| 131 nestable_task_runner_( | 133 nestable_task_runner_( |
| 132 NestableTaskRunnerForTest::Create(mock_task_runner_)), | 134 NestableTaskRunnerForTest::Create(mock_task_runner_)), |
| 133 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), | 135 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
| 134 default_task_runner_(scheduler_->DefaultTaskRunner()), | 136 default_task_runner_(scheduler_->DefaultTaskRunner()), |
| 135 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 137 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
| 136 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 138 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
| 137 idle_task_runner_(scheduler_->IdleTaskRunner()), | 139 idle_task_runner_(scheduler_->IdleTaskRunner()), |
| 138 timer_task_runner_(scheduler_->TimerTaskRunner()) { | 140 timer_task_runner_(scheduler_->TimerTaskRunner()) { |
| 139 scheduler_->SetTimeSourceForTesting(clock_); | 141 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 142 make_scoped_ptr(new TestTimeSource(clock_))); |
| 143 scheduler_->GetSchedulerHelperForTesting() |
| 144 ->GetTaskQueueManagerForTesting() |
| 145 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 140 } | 146 } |
| 141 | 147 |
| 142 RendererSchedulerImplTest(base::MessageLoop* message_loop) | 148 RendererSchedulerImplTest(base::MessageLoop* message_loop) |
| 143 : clock_(cc::TestNowSource::Create(5000)), | 149 : clock_(cc::TestNowSource::Create(5000)), |
| 144 message_loop_(message_loop), | 150 message_loop_(message_loop), |
| 145 nestable_task_runner_( | 151 nestable_task_runner_( |
| 146 SchedulerMessageLoopDelegate::Create(message_loop)), | 152 SchedulerMessageLoopDelegate::Create(message_loop)), |
| 147 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), | 153 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
| 148 default_task_runner_(scheduler_->DefaultTaskRunner()), | 154 default_task_runner_(scheduler_->DefaultTaskRunner()), |
| 149 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 155 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
| 150 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 156 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
| 151 idle_task_runner_(scheduler_->IdleTaskRunner()), | 157 idle_task_runner_(scheduler_->IdleTaskRunner()), |
| 152 timer_task_runner_(scheduler_->TimerTaskRunner()) { | 158 timer_task_runner_(scheduler_->TimerTaskRunner()) { |
| 153 scheduler_->SetTimeSourceForTesting(clock_); | 159 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 160 make_scoped_ptr(new TestTimeSource(clock_))); |
| 161 scheduler_->GetSchedulerHelperForTesting() |
| 162 ->GetTaskQueueManagerForTesting() |
| 163 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 154 } | 164 } |
| 155 ~RendererSchedulerImplTest() override {} | 165 ~RendererSchedulerImplTest() override {} |
| 156 | 166 |
| 157 void TearDown() override { | 167 void TearDown() override { |
| 158 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); | 168 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
| 159 if (mock_task_runner_.get()) { | 169 if (mock_task_runner_.get()) { |
| 160 // Check that all tests stop posting tasks. | 170 // Check that all tests stop posting tasks. |
| 161 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 171 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 162 while (mock_task_runner_->RunUntilIdle()) { | 172 while (mock_task_runner_->RunUntilIdle()) { |
| 163 } | 173 } |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 | 957 |
| 948 RunUntilIdle(); | 958 RunUntilIdle(); |
| 949 | 959 |
| 950 EXPECT_EQ(1, mock_scheduler->update_policy_count_); | 960 EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
| 951 } | 961 } |
| 952 | 962 |
| 953 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { | 963 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { |
| 954 RendererSchedulerImplForTest* mock_scheduler = | 964 RendererSchedulerImplForTest* mock_scheduler = |
| 955 new RendererSchedulerImplForTest(nestable_task_runner_); | 965 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 956 scheduler_.reset(mock_scheduler); | 966 scheduler_.reset(mock_scheduler); |
| 957 scheduler_->SetTimeSourceForTesting(clock_); | 967 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 968 make_scoped_ptr(new TestTimeSource(clock_))); |
| 969 scheduler_->GetSchedulerHelperForTesting() |
| 970 ->GetTaskQueueManagerForTesting() |
| 971 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 958 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 972 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 959 | 973 |
| 960 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 974 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
| 961 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 975 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
| 962 | 976 |
| 963 RunUntilIdle(); | 977 RunUntilIdle(); |
| 964 | 978 |
| 965 // We expect both the urgent and the delayed updates to run. | 979 // We expect both the urgent and the delayed updates to run. |
| 966 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 980 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 967 } | 981 } |
| 968 | 982 |
| 969 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { | 983 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { |
| 970 RendererSchedulerImplForTest* mock_scheduler = | 984 RendererSchedulerImplForTest* mock_scheduler = |
| 971 new RendererSchedulerImplForTest(nestable_task_runner_); | 985 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 972 scheduler_.reset(mock_scheduler); | 986 scheduler_.reset(mock_scheduler); |
| 973 scheduler_->SetTimeSourceForTesting(clock_); | 987 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 988 make_scoped_ptr(new TestTimeSource(clock_))); |
| 989 scheduler_->GetSchedulerHelperForTesting() |
| 990 ->GetTaskQueueManagerForTesting() |
| 991 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 974 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 992 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 975 | 993 |
| 976 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 994 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
| 977 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 995 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
| 978 | 996 |
| 979 RunUntilIdle(); | 997 RunUntilIdle(); |
| 980 | 998 |
| 981 // We expect both the urgent and the delayed updates to run. | 999 // We expect both the urgent and the delayed updates to run. |
| 982 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1000 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 983 } | 1001 } |
| 984 | 1002 |
| 985 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { | 1003 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { |
| 986 RendererSchedulerImplForTest* mock_scheduler = | 1004 RendererSchedulerImplForTest* mock_scheduler = |
| 987 new RendererSchedulerImplForTest(nestable_task_runner_); | 1005 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 988 scheduler_.reset(mock_scheduler); | 1006 scheduler_.reset(mock_scheduler); |
| 989 scheduler_->SetTimeSourceForTesting(clock_); | 1007 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 1008 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1009 scheduler_->GetSchedulerHelperForTesting() |
| 1010 ->GetTaskQueueManagerForTesting() |
| 1011 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 990 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1012 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 991 | 1013 |
| 992 scheduler_->DidReceiveInputEventOnCompositorThread( | 1014 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 993 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1015 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 994 | 1016 |
| 995 RunUntilIdle(); | 1017 RunUntilIdle(); |
| 996 | 1018 |
| 997 // We expect an urgent policy update followed by a delayed one 100ms later. | 1019 // We expect an urgent policy update followed by a delayed one 100ms later. |
| 998 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1020 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 999 } | 1021 } |
| 1000 | 1022 |
| 1001 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { | 1023 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { |
| 1002 RendererSchedulerImplForTest* mock_scheduler = | 1024 RendererSchedulerImplForTest* mock_scheduler = |
| 1003 new RendererSchedulerImplForTest(nestable_task_runner_); | 1025 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 1004 scheduler_.reset(mock_scheduler); | 1026 scheduler_.reset(mock_scheduler); |
| 1005 scheduler_->SetTimeSourceForTesting(clock_); | 1027 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 1028 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1029 scheduler_->GetSchedulerHelperForTesting() |
| 1030 ->GetTaskQueueManagerForTesting() |
| 1031 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 1006 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1032 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 1007 | 1033 |
| 1008 scheduler_->DidReceiveInputEventOnCompositorThread( | 1034 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1009 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1035 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 1010 scheduler_->DidReceiveInputEventOnCompositorThread( | 1036 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1011 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1037 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 1012 | 1038 |
| 1013 RunUntilIdle(); | 1039 RunUntilIdle(); |
| 1014 | 1040 |
| 1015 // We expect an urgent policy update followed by a delayed one 100ms later. | 1041 // We expect an urgent policy update followed by a delayed one 100ms later. |
| 1016 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1042 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 1017 } | 1043 } |
| 1018 | 1044 |
| 1019 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { | 1045 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { |
| 1020 RendererSchedulerImplForTest* mock_scheduler = | 1046 RendererSchedulerImplForTest* mock_scheduler = |
| 1021 new RendererSchedulerImplForTest(nestable_task_runner_); | 1047 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 1022 scheduler_.reset(mock_scheduler); | 1048 scheduler_.reset(mock_scheduler); |
| 1023 scheduler_->SetTimeSourceForTesting(clock_); | 1049 scheduler_->GetSchedulerHelperForTesting()->SetTimeSourceForTesting( |
| 1050 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1051 scheduler_->GetSchedulerHelperForTesting() |
| 1052 ->GetTaskQueueManagerForTesting() |
| 1053 ->SetTimeSourceForTesting(make_scoped_ptr(new TestTimeSource(clock_))); |
| 1024 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1054 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 1025 | 1055 |
| 1026 scheduler_->DidReceiveInputEventOnCompositorThread( | 1056 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1027 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1057 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 1028 scheduler_->DidReceiveInputEventOnCompositorThread( | 1058 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1029 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1059 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 1030 | 1060 |
| 1031 // We expect the first call to IsHighPriorityWorkAnticipated to be called | 1061 // We expect the first call to IsHighPriorityWorkAnticipated to be called |
| 1032 // after recieving an input event (but before the UpdateTask was processed) to | 1062 // after recieving an input event (but before the UpdateTask was processed) to |
| 1033 // call UpdatePolicy. | 1063 // call UpdatePolicy. |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1388 RunUntilIdle(); | 1418 RunUntilIdle(); |
| 1389 EXPECT_TRUE(run_order.empty()); | 1419 EXPECT_TRUE(run_order.empty()); |
| 1390 | 1420 |
| 1391 scheduler_->ResumeTimerQueue(); | 1421 scheduler_->ResumeTimerQueue(); |
| 1392 RunUntilIdle(); | 1422 RunUntilIdle(); |
| 1393 EXPECT_THAT(run_order, | 1423 EXPECT_THAT(run_order, |
| 1394 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 1424 testing::ElementsAre(std::string("T1"), std::string("T2"))); |
| 1395 } | 1425 } |
| 1396 | 1426 |
| 1397 } // namespace content | 1427 } // namespace content |
| OLD | NEW |