Chromium Code Reviews| 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 |