Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc

Issue 2353913005: Add WebTaskRunner::postCancellableTask (Closed)
Patch Set: . Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698