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 "content/renderer/scheduler/nestable_task_runner_for_test.h" | |
11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" | |
10 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
12 | 14 |
13 namespace content { | 15 namespace content { |
14 | 16 |
15 namespace { | 17 namespace { |
16 class FakeInputEvent : public blink::WebInputEvent { | 18 class FakeInputEvent : public blink::WebInputEvent { |
17 public: | 19 public: |
18 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) | 20 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) |
19 : WebInputEvent(sizeof(FakeInputEvent)) { | 21 : WebInputEvent(sizeof(FakeInputEvent)) { |
(...skipping 20 matching lines...) Expand all Loading... | |
40 | 42 |
41 }; // namespace | 43 }; // namespace |
42 | 44 |
43 class RendererSchedulerImplTest : public testing::Test { | 45 class RendererSchedulerImplTest : public testing::Test { |
44 public: | 46 public: |
45 using Policy = RendererSchedulerImpl::Policy; | 47 using Policy = RendererSchedulerImpl::Policy; |
46 | 48 |
47 RendererSchedulerImplTest() | 49 RendererSchedulerImplTest() |
48 : clock_(cc::TestNowSource::Create(5000)), | 50 : clock_(cc::TestNowSource::Create(5000)), |
49 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), | 51 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), |
50 scheduler_(new RendererSchedulerImpl(mock_task_runner_)), | 52 scheduler_(new RendererSchedulerImpl( |
53 NestableTaskRunnerForTest::Create(mock_task_runner_))), | |
51 default_task_runner_(scheduler_->DefaultTaskRunner()), | 54 default_task_runner_(scheduler_->DefaultTaskRunner()), |
52 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 55 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
53 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 56 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
57 idle_task_runner_(scheduler_->IdleTaskRunner()) { | |
58 scheduler_->SetTimeSourceForTesting(clock_); | |
59 } | |
60 | |
61 RendererSchedulerImplTest(base::MessageLoop* message_loop) | |
62 : clock_(cc::TestNowSource::Create(5000)), | |
63 message_loop_(message_loop), | |
64 scheduler_(new RendererSchedulerImpl( | |
65 RendererSchedulerMessageLoopDelegate::Create(message_loop))), | |
66 default_task_runner_(scheduler_->DefaultTaskRunner()), | |
67 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | |
68 loading_task_runner_(scheduler_->LoadingTaskRunner()), | |
54 idle_task_runner_(scheduler_->IdleTaskRunner()) { | 69 idle_task_runner_(scheduler_->IdleTaskRunner()) { |
55 scheduler_->SetTimeSourceForTesting(clock_); | 70 scheduler_->SetTimeSourceForTesting(clock_); |
56 } | 71 } |
57 ~RendererSchedulerImplTest() override {} | 72 ~RendererSchedulerImplTest() override {} |
58 | 73 |
59 void RunUntilIdle() { mock_task_runner_->RunUntilIdle(); } | 74 void RunUntilIdle() { |
75 // Only one of mock_task_runner_ or message_loop_ should be set. | |
76 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); | |
Sami
2015/03/12 18:53:11
Missed a golden opportunity to use ^ :)
rmcilroy
2015/03/13 10:56:53
Ahh the seldom used bitwise XOR operator. I think
| |
77 if (mock_task_runner_.get()) | |
78 mock_task_runner_->RunUntilIdle(); | |
79 else | |
80 message_loop_->RunUntilIdle(); | |
81 } | |
60 | 82 |
61 void DoMainFrame() { | 83 void DoMainFrame() { |
62 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 84 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
63 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 85 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
64 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 86 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); |
65 scheduler_->DidCommitFrameToCompositor(); | 87 scheduler_->DidCommitFrameToCompositor(); |
66 } | 88 } |
67 | 89 |
68 void EnableIdleTasks() { DoMainFrame(); } | 90 void EnableIdleTasks() { DoMainFrame(); } |
69 | 91 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
106 } | 128 } |
107 } | 129 } |
108 | 130 |
109 protected: | 131 protected: |
110 static base::TimeDelta priority_escalation_after_input_duration() { | 132 static base::TimeDelta priority_escalation_after_input_duration() { |
111 return base::TimeDelta::FromMilliseconds( | 133 return base::TimeDelta::FromMilliseconds( |
112 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); | 134 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); |
113 } | 135 } |
114 | 136 |
115 scoped_refptr<cc::TestNowSource> clock_; | 137 scoped_refptr<cc::TestNowSource> clock_; |
138 // Only one of mock_task_runner_ or message_loop_ will be set. | |
116 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; | 139 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; |
140 scoped_ptr<base::MessageLoop> message_loop_; | |
117 | 141 |
118 scoped_ptr<RendererSchedulerImpl> scheduler_; | 142 scoped_ptr<RendererSchedulerImpl> scheduler_; |
119 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; | 143 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; |
120 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; | 144 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; |
121 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_; | 145 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_; |
122 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; | 146 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; |
123 | 147 |
124 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); | 148 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); |
125 }; | 149 }; |
126 | 150 |
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
840 RunUntilIdle(); | 864 RunUntilIdle(); |
841 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); | 865 EXPECT_EQ(Policy::COMPOSITOR_PRIORITY, CurrentPolicy()); |
842 | 866 |
843 // Process the input event with a new BeginMainFrame. | 867 // Process the input event with a new BeginMainFrame. |
844 DoMainFrame(); | 868 DoMainFrame(); |
845 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); | 869 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); |
846 RunUntilIdle(); | 870 RunUntilIdle(); |
847 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); | 871 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); |
848 } | 872 } |
849 | 873 |
874 class RendererSchedulerImplWithMessageLoopTest | |
875 : public RendererSchedulerImplTest { | |
876 public: | |
877 RendererSchedulerImplWithMessageLoopTest() | |
878 : RendererSchedulerImplTest(new base::MessageLoop()) {} | |
879 ~RendererSchedulerImplWithMessageLoopTest() override {} | |
880 | |
881 void PostFromNestedRunloop(std::vector< | |
882 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) { | |
883 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get()); | |
884 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) { | |
885 if (pair.second) { | |
886 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first); | |
887 } else { | |
888 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first); | |
889 } | |
890 } | |
891 EnableIdleTasks(); | |
892 message_loop_->RunUntilIdle(); | |
893 } | |
894 | |
895 private: | |
896 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest); | |
897 }; | |
898 | |
899 TEST_F(RendererSchedulerImplWithMessageLoopTest, | |
900 NonNestableIdleTaskDoesntExecuteInNestedLoop) { | |
901 std::vector<std::string> order; | |
902 idle_task_runner_->PostIdleTask( | |
903 FROM_HERE, | |
904 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1"))); | |
905 idle_task_runner_->PostIdleTask( | |
906 FROM_HERE, | |
907 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2"))); | |
908 | |
909 std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>> | |
910 tasks_to_post_from_nested_loop; | |
911 tasks_to_post_from_nested_loop.push_back(std::make_pair( | |
912 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")), | |
913 false)); | |
914 tasks_to_post_from_nested_loop.push_back(std::make_pair( | |
915 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true)); | |
916 tasks_to_post_from_nested_loop.push_back(std::make_pair( | |
917 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true)); | |
918 | |
919 default_task_runner_->PostTask( | |
920 FROM_HERE, | |
921 base::Bind( | |
922 &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop, | |
923 base::Unretained(this), | |
924 base::Unretained(&tasks_to_post_from_nested_loop))); | |
925 | |
926 EnableIdleTasks(); | |
927 RunUntilIdle(); | |
928 // Note we expect task 3 to run last because it's non-nestable. | |
929 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), | |
930 std::string("4"), std::string("5"), | |
931 std::string("3"))); | |
932 } | |
933 | |
850 } // namespace content | 934 } // namespace content |
OLD | NEW |