| 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_->SetTimeSourceForTesting( |
| 142 make_scoped_ptr(new TestTimeSource(clock_))); |
| 140 } | 143 } |
| 141 | 144 |
| 142 RendererSchedulerImplTest(base::MessageLoop* message_loop) | 145 RendererSchedulerImplTest(base::MessageLoop* message_loop) |
| 143 : clock_(cc::TestNowSource::Create(5000)), | 146 : clock_(cc::TestNowSource::Create(5000)), |
| 144 message_loop_(message_loop), | 147 message_loop_(message_loop), |
| 145 nestable_task_runner_( | 148 nestable_task_runner_( |
| 146 SchedulerMessageLoopDelegate::Create(message_loop)), | 149 SchedulerMessageLoopDelegate::Create(message_loop)), |
| 147 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), | 150 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
| 148 default_task_runner_(scheduler_->DefaultTaskRunner()), | 151 default_task_runner_(scheduler_->DefaultTaskRunner()), |
| 149 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 152 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
| 150 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 153 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
| 151 idle_task_runner_(scheduler_->IdleTaskRunner()), | 154 idle_task_runner_(scheduler_->IdleTaskRunner()), |
| 152 timer_task_runner_(scheduler_->TimerTaskRunner()) { | 155 timer_task_runner_(scheduler_->TimerTaskRunner()) { |
| 153 scheduler_->SetTimeSourceForTesting(clock_); | 156 scheduler_->SetTimeSourceForTesting( |
| 157 make_scoped_ptr(new TestTimeSource(clock_))); |
| 154 } | 158 } |
| 155 ~RendererSchedulerImplTest() override {} | 159 ~RendererSchedulerImplTest() override {} |
| 156 | 160 |
| 157 void TearDown() override { | 161 void TearDown() override { |
| 158 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); | 162 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
| 159 if (mock_task_runner_.get()) { | 163 if (mock_task_runner_.get()) { |
| 160 // Check that all tests stop posting tasks. | 164 // Check that all tests stop posting tasks. |
| 161 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 165 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 162 while (mock_task_runner_->RunUntilIdle()) { | 166 while (mock_task_runner_->RunUntilIdle()) { |
| 163 } | 167 } |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 | 951 |
| 948 RunUntilIdle(); | 952 RunUntilIdle(); |
| 949 | 953 |
| 950 EXPECT_EQ(1, mock_scheduler->update_policy_count_); | 954 EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
| 951 } | 955 } |
| 952 | 956 |
| 953 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { | 957 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { |
| 954 RendererSchedulerImplForTest* mock_scheduler = | 958 RendererSchedulerImplForTest* mock_scheduler = |
| 955 new RendererSchedulerImplForTest(nestable_task_runner_); | 959 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 956 scheduler_.reset(mock_scheduler); | 960 scheduler_.reset(mock_scheduler); |
| 957 scheduler_->SetTimeSourceForTesting(clock_); | 961 scheduler_->SetTimeSourceForTesting( |
| 962 make_scoped_ptr(new TestTimeSource(clock_))); |
| 958 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 963 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 959 | 964 |
| 960 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 965 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
| 961 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 966 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
| 962 | 967 |
| 963 RunUntilIdle(); | 968 RunUntilIdle(); |
| 964 | 969 |
| 965 // We expect both the urgent and the delayed updates to run. | 970 // We expect both the urgent and the delayed updates to run. |
| 966 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 971 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 967 } | 972 } |
| 968 | 973 |
| 969 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { | 974 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { |
| 970 RendererSchedulerImplForTest* mock_scheduler = | 975 RendererSchedulerImplForTest* mock_scheduler = |
| 971 new RendererSchedulerImplForTest(nestable_task_runner_); | 976 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 972 scheduler_.reset(mock_scheduler); | 977 scheduler_.reset(mock_scheduler); |
| 973 scheduler_->SetTimeSourceForTesting(clock_); | 978 scheduler_->SetTimeSourceForTesting( |
| 979 make_scoped_ptr(new TestTimeSource(clock_))); |
| 974 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 980 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 975 | 981 |
| 976 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 982 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
| 977 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 983 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
| 978 | 984 |
| 979 RunUntilIdle(); | 985 RunUntilIdle(); |
| 980 | 986 |
| 981 // We expect both the urgent and the delayed updates to run. | 987 // We expect both the urgent and the delayed updates to run. |
| 982 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 988 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 983 } | 989 } |
| 984 | 990 |
| 985 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { | 991 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { |
| 986 RendererSchedulerImplForTest* mock_scheduler = | 992 RendererSchedulerImplForTest* mock_scheduler = |
| 987 new RendererSchedulerImplForTest(nestable_task_runner_); | 993 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 988 scheduler_.reset(mock_scheduler); | 994 scheduler_.reset(mock_scheduler); |
| 989 scheduler_->SetTimeSourceForTesting(clock_); | 995 scheduler_->SetTimeSourceForTesting( |
| 996 make_scoped_ptr(new TestTimeSource(clock_))); |
| 990 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 997 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 991 | 998 |
| 992 scheduler_->DidReceiveInputEventOnCompositorThread( | 999 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 993 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1000 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 994 | 1001 |
| 995 RunUntilIdle(); | 1002 RunUntilIdle(); |
| 996 | 1003 |
| 997 // We expect an urgent policy update followed by a delayed one 100ms later. | 1004 // We expect an urgent policy update followed by a delayed one 100ms later. |
| 998 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1005 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 999 } | 1006 } |
| 1000 | 1007 |
| 1001 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { | 1008 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { |
| 1002 RendererSchedulerImplForTest* mock_scheduler = | 1009 RendererSchedulerImplForTest* mock_scheduler = |
| 1003 new RendererSchedulerImplForTest(nestable_task_runner_); | 1010 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 1004 scheduler_.reset(mock_scheduler); | 1011 scheduler_.reset(mock_scheduler); |
| 1005 scheduler_->SetTimeSourceForTesting(clock_); | 1012 scheduler_->SetTimeSourceForTesting( |
| 1013 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1006 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1014 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 1007 | 1015 |
| 1008 scheduler_->DidReceiveInputEventOnCompositorThread( | 1016 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1009 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1017 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 1010 scheduler_->DidReceiveInputEventOnCompositorThread( | 1018 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1011 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1019 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 1012 | 1020 |
| 1013 RunUntilIdle(); | 1021 RunUntilIdle(); |
| 1014 | 1022 |
| 1015 // We expect an urgent policy update followed by a delayed one 100ms later. | 1023 // We expect an urgent policy update followed by a delayed one 100ms later. |
| 1016 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 1024 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
| 1017 } | 1025 } |
| 1018 | 1026 |
| 1019 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { | 1027 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { |
| 1020 RendererSchedulerImplForTest* mock_scheduler = | 1028 RendererSchedulerImplForTest* mock_scheduler = |
| 1021 new RendererSchedulerImplForTest(nestable_task_runner_); | 1029 new RendererSchedulerImplForTest(nestable_task_runner_); |
| 1022 scheduler_.reset(mock_scheduler); | 1030 scheduler_.reset(mock_scheduler); |
| 1023 scheduler_->SetTimeSourceForTesting(clock_); | 1031 scheduler_->SetTimeSourceForTesting( |
| 1032 make_scoped_ptr(new TestTimeSource(clock_))); |
| 1024 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1033 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 1025 | 1034 |
| 1026 scheduler_->DidReceiveInputEventOnCompositorThread( | 1035 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1027 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1036 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 1028 scheduler_->DidReceiveInputEventOnCompositorThread( | 1037 scheduler_->DidReceiveInputEventOnCompositorThread( |
| 1029 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1038 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 1030 | 1039 |
| 1031 // We expect the first call to IsHighPriorityWorkAnticipated to be called | 1040 // We expect the first call to IsHighPriorityWorkAnticipated to be called |
| 1032 // after recieving an input event (but before the UpdateTask was processed) to | 1041 // after recieving an input event (but before the UpdateTask was processed) to |
| 1033 // call UpdatePolicy. | 1042 // call UpdatePolicy. |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1388 RunUntilIdle(); | 1397 RunUntilIdle(); |
| 1389 EXPECT_TRUE(run_order.empty()); | 1398 EXPECT_TRUE(run_order.empty()); |
| 1390 | 1399 |
| 1391 scheduler_->ResumeTimerQueue(); | 1400 scheduler_->ResumeTimerQueue(); |
| 1392 RunUntilIdle(); | 1401 RunUntilIdle(); |
| 1393 EXPECT_THAT(run_order, | 1402 EXPECT_THAT(run_order, |
| 1394 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 1403 testing::ElementsAre(std::string("T1"), std::string("T2"))); |
| 1395 } | 1404 } |
| 1396 | 1405 |
| 1397 } // namespace content | 1406 } // namespace content |
| OLD | NEW |