| Index: content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
|
| diff --git a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
|
| index 5b42d97ec787a080b1e198f42ac6db6ba7531ce8..1d8f9c3a03b0c423ad95f1f14af83e8809bb31db 100644
|
| --- a/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
|
| +++ b/content/renderer/scheduler/renderer_scheduler_impl_unittest.cc
|
| @@ -7,6 +7,8 @@
|
| #include "base/callback.h"
|
| #include "cc/output/begin_frame_args.h"
|
| #include "cc/test/ordered_simple_task_runner.h"
|
| +#include "content/renderer/scheduler/nestable_task_runner_for_test.h"
|
| +#include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -47,7 +49,22 @@ class RendererSchedulerImplTest : public testing::Test {
|
| RendererSchedulerImplTest()
|
| : clock_(cc::TestNowSource::Create(5000)),
|
| mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)),
|
| - scheduler_(new RendererSchedulerImpl(mock_task_runner_)),
|
| + nestable_task_runner_(
|
| + NestableTaskRunnerForTest::Create(mock_task_runner_)),
|
| + scheduler_(new RendererSchedulerImpl(nestable_task_runner_)),
|
| + default_task_runner_(scheduler_->DefaultTaskRunner()),
|
| + compositor_task_runner_(scheduler_->CompositorTaskRunner()),
|
| + loading_task_runner_(scheduler_->LoadingTaskRunner()),
|
| + idle_task_runner_(scheduler_->IdleTaskRunner()) {
|
| + scheduler_->SetTimeSourceForTesting(clock_);
|
| + }
|
| +
|
| + RendererSchedulerImplTest(base::MessageLoop* message_loop)
|
| + : clock_(cc::TestNowSource::Create(5000)),
|
| + message_loop_(message_loop),
|
| + nestable_task_runner_(
|
| + RendererSchedulerMessageLoopDelegate::Create(message_loop)),
|
| + scheduler_(new RendererSchedulerImpl(nestable_task_runner_)),
|
| default_task_runner_(scheduler_->DefaultTaskRunner()),
|
| compositor_task_runner_(scheduler_->CompositorTaskRunner()),
|
| loading_task_runner_(scheduler_->LoadingTaskRunner()),
|
| @@ -57,13 +74,25 @@ class RendererSchedulerImplTest : public testing::Test {
|
| ~RendererSchedulerImplTest() override {}
|
|
|
| void TearDown() override {
|
| - // Check that all tests stop posting tasks.
|
| - mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| - while (RunUntilIdle()) {
|
| + DCHECK(!mock_task_runner_.get() || !message_loop_.get());
|
| + if (mock_task_runner_.get()) {
|
| + // Check that all tests stop posting tasks.
|
| + mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| + while (mock_task_runner_->RunUntilIdle()) {
|
| + }
|
| + } else {
|
| + message_loop_->RunUntilIdle();
|
| }
|
| }
|
|
|
| - bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); }
|
| + void RunUntilIdle() {
|
| + // Only one of mock_task_runner_ or message_loop_ should be set.
|
| + DCHECK(!mock_task_runner_.get() || !message_loop_.get());
|
| + if (mock_task_runner_.get())
|
| + mock_task_runner_->RunUntilIdle();
|
| + else
|
| + message_loop_->RunUntilIdle();
|
| + }
|
|
|
| void DoMainFrame() {
|
| scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create(
|
| @@ -130,8 +159,11 @@ class RendererSchedulerImplTest : public testing::Test {
|
| }
|
|
|
| scoped_refptr<cc::TestNowSource> clock_;
|
| + // Only one of mock_task_runner_ or message_loop_ will be set.
|
| scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
|
| + scoped_ptr<base::MessageLoop> message_loop_;
|
|
|
| + scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_;
|
| scoped_ptr<RendererSchedulerImpl> scheduler_;
|
| scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
|
| scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
|
| @@ -867,7 +899,7 @@ TEST_F(RendererSchedulerImplTest, InputArrivesAfterBeginFrame) {
|
| class RendererSchedulerImplForTest : public RendererSchedulerImpl {
|
| public:
|
| RendererSchedulerImplForTest(
|
| - scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
|
| + scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner)
|
| : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {}
|
|
|
| void UpdatePolicyLocked() override {
|
| @@ -880,7 +912,7 @@ class RendererSchedulerImplForTest : public RendererSchedulerImpl {
|
|
|
| TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
|
| RendererSchedulerImplForTest* mock_scheduler =
|
| - new RendererSchedulerImplForTest(mock_task_runner_);
|
| + new RendererSchedulerImplForTest(nestable_task_runner_);
|
| scheduler_.reset(mock_scheduler);
|
|
|
| EnsureUrgentPolicyUpdatePostedOnMainThread();
|
| @@ -895,7 +927,7 @@ TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) {
|
|
|
| TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
|
| RendererSchedulerImplForTest* mock_scheduler =
|
| - new RendererSchedulerImplForTest(mock_task_runner_);
|
| + new RendererSchedulerImplForTest(nestable_task_runner_);
|
| scheduler_.reset(mock_scheduler);
|
| scheduler_->SetTimeSourceForTesting(clock_);
|
| mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| @@ -911,7 +943,7 @@ TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) {
|
|
|
| TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
|
| RendererSchedulerImplForTest* mock_scheduler =
|
| - new RendererSchedulerImplForTest(mock_task_runner_);
|
| + new RendererSchedulerImplForTest(nestable_task_runner_);
|
| scheduler_.reset(mock_scheduler);
|
| scheduler_->SetTimeSourceForTesting(clock_);
|
| mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| @@ -927,7 +959,7 @@ TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) {
|
|
|
| TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
|
| RendererSchedulerImplForTest* mock_scheduler =
|
| - new RendererSchedulerImplForTest(mock_task_runner_);
|
| + new RendererSchedulerImplForTest(nestable_task_runner_);
|
| scheduler_.reset(mock_scheduler);
|
| scheduler_->SetTimeSourceForTesting(clock_);
|
| mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| @@ -943,7 +975,7 @@ TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) {
|
|
|
| TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
|
| RendererSchedulerImplForTest* mock_scheduler =
|
| - new RendererSchedulerImplForTest(mock_task_runner_);
|
| + new RendererSchedulerImplForTest(nestable_task_runner_);
|
| scheduler_.reset(mock_scheduler);
|
| scheduler_->SetTimeSourceForTesting(clock_);
|
| mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| @@ -961,7 +993,7 @@ TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) {
|
|
|
| TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
|
| RendererSchedulerImplForTest* mock_scheduler =
|
| - new RendererSchedulerImplForTest(mock_task_runner_);
|
| + new RendererSchedulerImplForTest(nestable_task_runner_);
|
| scheduler_.reset(mock_scheduler);
|
| scheduler_->SetTimeSourceForTesting(clock_);
|
| mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
|
| @@ -994,4 +1026,64 @@ TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) {
|
| EXPECT_EQ(3, mock_scheduler->update_policy_count_);
|
| }
|
|
|
| +class RendererSchedulerImplWithMessageLoopTest
|
| + : public RendererSchedulerImplTest {
|
| + public:
|
| + RendererSchedulerImplWithMessageLoopTest()
|
| + : RendererSchedulerImplTest(new base::MessageLoop()) {}
|
| + ~RendererSchedulerImplWithMessageLoopTest() override {}
|
| +
|
| + void PostFromNestedRunloop(std::vector<
|
| + std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) {
|
| + base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get());
|
| + for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) {
|
| + if (pair.second) {
|
| + idle_task_runner_->PostIdleTask(FROM_HERE, pair.first);
|
| + } else {
|
| + idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first);
|
| + }
|
| + }
|
| + EnableIdleTasks();
|
| + message_loop_->RunUntilIdle();
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest);
|
| +};
|
| +
|
| +TEST_F(RendererSchedulerImplWithMessageLoopTest,
|
| + NonNestableIdleTaskDoesntExecuteInNestedLoop) {
|
| + std::vector<std::string> order;
|
| + idle_task_runner_->PostIdleTask(
|
| + FROM_HERE,
|
| + base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1")));
|
| + idle_task_runner_->PostIdleTask(
|
| + FROM_HERE,
|
| + base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2")));
|
| +
|
| + std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>
|
| + tasks_to_post_from_nested_loop;
|
| + tasks_to_post_from_nested_loop.push_back(std::make_pair(
|
| + base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")),
|
| + false));
|
| + tasks_to_post_from_nested_loop.push_back(std::make_pair(
|
| + base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true));
|
| + tasks_to_post_from_nested_loop.push_back(std::make_pair(
|
| + base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true));
|
| +
|
| + default_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop,
|
| + base::Unretained(this),
|
| + base::Unretained(&tasks_to_post_from_nested_loop)));
|
| +
|
| + EnableIdleTasks();
|
| + RunUntilIdle();
|
| + // Note we expect task 3 to run last because it's non-nestable.
|
| + EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"),
|
| + std::string("4"), std::string("5"),
|
| + std::string("3")));
|
| +}
|
| +
|
| } // namespace content
|
|
|