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 36536c6d40370178f54fe69b0c0cd8a57d6a43f3..f891bb5b42ce9715815246e6c17c1bf3b436b01c 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 |
@@ -4,7 +4,11 @@ |
#include "platform/scheduler/test/fake_web_task_runner.h" |
+#include <deque> |
+ |
+#include "base/callback.h" |
#include "base/logging.h" |
+#include "base/single_thread_task_runner.h" |
#include "wtf/RefCounted.h" |
namespace blink { |
@@ -14,8 +18,8 @@ class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { |
public: |
Data() : time_(0.0) {} |
- std::unique_ptr<Task> task_; |
- base::Closure closure_; |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
+ std::deque<base::Closure> task_queue_; |
double time_; |
private: |
@@ -25,11 +29,37 @@ class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { |
DISALLOW_COPY_AND_ASSIGN(Data); |
}; |
-FakeWebTaskRunner::FakeWebTaskRunner() : data_(adoptRef(new Data)) {} |
+class FakeWebTaskRunner::BaseTaskRunner : public base::SingleThreadTaskRunner { |
+ public: |
+ explicit BaseTaskRunner(PassRefPtr<Data> data) : data_(std::move(data)) {} |
+ |
+ bool PostDelayedTask(const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) override { |
+ data_->task_queue_.push_back(task); |
+ return true; |
+ } |
-FakeWebTaskRunner::FakeWebTaskRunner(PassRefPtr<Data> data) |
- : data_(std::move(data)) { |
-} |
+ bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) override { |
+ data_->task_queue_.push_back(task); |
+ return true; |
+ } |
+ |
+ bool RunsTasksOnCurrentThread() const { return true; } |
+ |
+ private: |
+ RefPtr<Data> data_; |
+}; |
+ |
+FakeWebTaskRunner::FakeWebTaskRunner() |
+ : data_(adoptRef(new Data)), base_task_runner_(new BaseTaskRunner(data_)) {} |
+ |
+FakeWebTaskRunner::FakeWebTaskRunner( |
+ PassRefPtr<Data> data, |
+ scoped_refptr<BaseTaskRunner> base_task_runner) |
+ : data_(std::move(data)), base_task_runner_(std::move(base_task_runner)) {} |
FakeWebTaskRunner::~FakeWebTaskRunner() { |
} |
@@ -45,13 +75,14 @@ void FakeWebTaskRunner::postTask(const WebTraceLocation&, Task*) { |
void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, |
Task* task, |
double) { |
- data_->task_.reset(task); |
+ data_->task_queue_.push_back( |
+ base::Bind(&WebTaskRunner::Task::run, base::Owned(task))); |
} |
void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, |
const base::Closure& closure, |
double) { |
- data_->closure_ = closure; |
+ data_->task_queue_.push_back(closure); |
} |
bool FakeWebTaskRunner::runsTasksOnCurrentThread() { |
@@ -59,7 +90,7 @@ bool FakeWebTaskRunner::runsTasksOnCurrentThread() { |
} |
std::unique_ptr<WebTaskRunner> FakeWebTaskRunner::clone() { |
- return WTF::wrapUnique(new FakeWebTaskRunner(data_)); |
+ return WTF::wrapUnique(new FakeWebTaskRunner(data_, base_task_runner_)); |
} |
double FakeWebTaskRunner::virtualTimeSeconds() const { |
@@ -71,8 +102,17 @@ double FakeWebTaskRunner::monotonicallyIncreasingVirtualTimeSeconds() const { |
} |
SingleThreadTaskRunner* FakeWebTaskRunner::toSingleThreadTaskRunner() { |
- NOTREACHED(); |
- return nullptr; |
+ return base_task_runner_.get(); |
+} |
+ |
+void FakeWebTaskRunner::runUntilIdle() { |
+ while (!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()); |
+ data_->task_queue_.pop_front(); |
+ task.Run(); |
+ } |
} |
} // namespace scheduler |