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 4a97a0454749f11708d1fdb98d7f81e2202a5354..1b300a71dac8d70c307af30faa69576fe43d8451 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,20 @@ 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_)), |
+ scheduler_(new RendererSchedulerImpl( |
+ NestableTaskRunnerForTest::Create(mock_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), |
+ scheduler_(new RendererSchedulerImpl( |
+ RendererSchedulerMessageLoopDelegate::Create(message_loop))), |
default_task_runner_(scheduler_->DefaultTaskRunner()), |
compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
loading_task_runner_(scheduler_->LoadingTaskRunner()), |
@@ -56,7 +71,14 @@ class RendererSchedulerImplTest : public testing::Test { |
} |
~RendererSchedulerImplTest() override {} |
- void RunUntilIdle() { 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()); |
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
|
+ if (mock_task_runner_.get()) |
+ mock_task_runner_->RunUntilIdle(); |
+ else |
+ message_loop_->RunUntilIdle(); |
+ } |
void DoMainFrame() { |
scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
@@ -113,7 +135,9 @@ 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_ptr<RendererSchedulerImpl> scheduler_; |
scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; |
@@ -847,4 +871,64 @@ TEST_F(RendererSchedulerImplTest, InputArrivesAfterBeginFrame) { |
EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); |
} |
+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 |