Index: third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc |
index c9f225cc904c38d4bf2192c5154843a6d512783a..2358c40f098143fa80ad12185dd7f5539849ca51 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc |
@@ -18,8 +18,20 @@ class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { |
public: |
Data() : time_(0.0) {} |
+ void PostTask(const base::Closure& task, base::TimeDelta delay) { |
+ task_queue_.push_back(std::make_pair(task, time_ + delay.InSecondsF())); |
+ } |
+ |
+ using QueueItem = std::pair<base::Closure, double>; |
+ std::deque<QueueItem>::iterator FindRunnableTask() { |
+ // TODO(tkent): This should return an item which has the minimum |second|. |
+ return std::find_if( |
+ task_queue_.begin(), task_queue_.end(), |
+ [&](const QueueItem& item) { return item.second <= time_; }); |
+ } |
+ |
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
- std::deque<base::Closure> task_queue_; |
+ std::deque<QueueItem> task_queue_; |
double time_; |
private: |
@@ -36,14 +48,14 @@ class FakeWebTaskRunner::BaseTaskRunner : public base::SingleThreadTaskRunner { |
bool PostDelayedTask(const tracked_objects::Location& from_here, |
const base::Closure& task, |
base::TimeDelta delay) override { |
- data_->task_queue_.push_back(task); |
+ data_->PostTask(task, delay); |
return true; |
} |
bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
const base::Closure& task, |
base::TimeDelta delay) override { |
- data_->task_queue_.push_back(task); |
+ data_->PostTask(task, delay); |
return true; |
} |
@@ -70,8 +82,8 @@ void FakeWebTaskRunner::setTime(double new_time) { |
void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, |
const base::Closure& closure, |
- double) { |
- data_->task_queue_.push_back(closure); |
+ double delay_ms) { |
+ data_->PostTask(closure, base::TimeDelta::FromMillisecondsD(delay_ms)); |
} |
bool FakeWebTaskRunner::runsTasksOnCurrentThread() { |
@@ -94,13 +106,24 @@ void FakeWebTaskRunner::runUntilIdle() { |
while (!data_->task_queue_.empty()) { |
// Move the task to run into a local variable in case it touches the |
// task queue by posting a new task. |
- base::Closure task = std::move(data_->task_queue_.front()); |
+ base::Closure task = std::move(data_->task_queue_.front()).first; |
data_->task_queue_.pop_front(); |
task.Run(); |
} |
} |
-std::deque<base::Closure> FakeWebTaskRunner::takePendingTasksForTesting() { |
+void FakeWebTaskRunner::advanceTimeAndRun(double delta_seconds) { |
+ data_->time_ += delta_seconds; |
+ for (auto it = data_->FindRunnableTask(); it != data_->task_queue_.end(); |
+ it = data_->FindRunnableTask()) { |
+ base::Closure task = std::move(*it).first; |
+ data_->task_queue_.erase(it); |
+ task.Run(); |
+ } |
+} |
+ |
+std::deque<std::pair<base::Closure, double>> |
+FakeWebTaskRunner::takePendingTasksForTesting() { |
return std::move(data_->task_queue_); |
} |