Index: components/scheduler/child/task_queue_manager_unittest.cc |
diff --git a/components/scheduler/child/task_queue_manager_unittest.cc b/components/scheduler/child/task_queue_manager_unittest.cc |
index f7d4b263e41af74505abfcbff15698a83d165b8d..7a52a0311c537a57d012183719d63e46c3130c4e 100644 |
--- a/components/scheduler/child/task_queue_manager_unittest.cc |
+++ b/components/scheduler/child/task_queue_manager_unittest.cc |
@@ -181,6 +181,53 @@ TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) { |
EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); |
} |
+void RepostOnceTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
+ int value, std::vector<int>* out_result) { |
+ out_result->push_back(value); |
+ runner->PostTask(FROM_HERE, base::Bind(&NullTask)); |
+} |
+ |
+void PostFromNestedRunloopWithAfterWakeupQueue( |
+ base::MessageLoop* message_loop, |
+ base::SingleThreadTaskRunner* after_wakeup_runner, |
+ base::SingleThreadTaskRunner* wakeup_runner, |
+ std::vector<std::pair<base::Closure, bool>>* tasks) { |
+ base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); |
+ for (std::pair<base::Closure, bool>& pair : *tasks) { |
+ if (pair.second) { |
+ after_wakeup_runner->PostTask(FROM_HERE, pair.first); |
+ } else { |
+ after_wakeup_runner->PostNonNestableTask(FROM_HERE, pair.first); |
+ } |
+ } |
+ // Post a task to wake up the after wakeup queue. |
+ wakeup_runner->PostTask(FROM_HERE, base::Bind(&NullTask)); |
+ message_loop->RunUntilIdle(); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, NonNestableTaskUsesPreviousTaskForUpdateQueues) { |
+ InitializeWithRealMessageLoop(2u); |
+ runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::AFTER_WAKEUP); |
+ |
+ std::vector<int> run_order; |
+ std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
+ // This task posts a task, so that there is something in the incoming queue |
+ // of the after wakeup task queue when the non-nestable task runs. |
+ tasks_to_post_from_nested_loop.push_back(std::make_pair( |
+ base::Bind(&RepostOnceTestTask, runners_[0], 1, &run_order), true)); |
+ tasks_to_post_from_nested_loop.push_back( |
+ std::make_pair(base::Bind(&TestTask, 2, &run_order), false)); |
+ |
+ runners_[1]->PostTask( |
+ FROM_HERE, |
+ base::Bind(&PostFromNestedRunloopWithAfterWakeupQueue, |
+ message_loop_.get(), runners_[0], runners_[1], |
+ base::Unretained(&tasks_to_post_from_nested_loop))); |
+ |
+ message_loop_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(1, 2)); |
+} |
+ |
TEST_F(TaskQueueManagerTest, QueuePolling) { |
Initialize(1u); |