Migrate base::TaskRunner from Closure to OnceClosure

After this CL, TaskRunner::PostTask and its family can take OnceClosure
in addition to Closure.

Most of the changes are mechanical replacement of Closure with OnceClosure
on TaskRunner family. Others are:
 - Limit CriticalClosure from Closure to OnceClosure as no caller call
   the resulting callback more than once
 - Add several PostTaskAndReplyWithResult overloads for old Callback
   version, for compatibility. (in base/task_scheduler/post_task.h)
 - Update SequencedWorkerPool implementation for OnceClosure.
 - Update task handling code in app_state.mm for OnceClosure, which is
   needed to bring OnceClosure into a ObjC block.

BUG=704027
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel

Review-Url: https://codereview.chromium.org/2637843002
Cr-Commit-Position: refs/heads/master@{#462023}
diff --git a/base/critical_closure.h b/base/critical_closure.h
index 35ce2b5c..94c618d 100644
--- a/base/critical_closure.h
+++ b/base/critical_closure.h
@@ -29,13 +29,13 @@
 // |ios::ScopedCriticalAction|.
 class CriticalClosure {
  public:
-  explicit CriticalClosure(Closure closure);
+  explicit CriticalClosure(OnceClosure closure);
   ~CriticalClosure();
   void Run();
 
  private:
   ios::ScopedCriticalAction critical_action_;
-  Closure closure_;
+  OnceClosure closure_;
 
   DISALLOW_COPY_AND_ASSIGN(CriticalClosure);
 };
@@ -57,13 +57,14 @@
 // background running time, |MakeCriticalClosure| should be applied on them
 // before posting.
 #if defined(OS_IOS)
-inline Closure MakeCriticalClosure(Closure closure) {
+inline OnceClosure MakeCriticalClosure(OnceClosure closure) {
   DCHECK(internal::IsMultiTaskingSupported());
-  return base::Bind(&internal::CriticalClosure::Run,
-                    Owned(new internal::CriticalClosure(std::move(closure))));
+  return base::BindOnce(
+      &internal::CriticalClosure::Run,
+      Owned(new internal::CriticalClosure(std::move(closure))));
 }
 #else  // defined(OS_IOS)
-inline Closure MakeCriticalClosure(Closure closure) {
+inline OnceClosure MakeCriticalClosure(OnceClosure closure) {
   // No-op for platforms where the application does not need to acquire
   // background time for closures to finish when it goes into the background.
   return closure;
diff --git a/base/critical_closure_internal_ios.mm b/base/critical_closure_internal_ios.mm
index 4088a47..e35eca0 100644
--- a/base/critical_closure_internal_ios.mm
+++ b/base/critical_closure_internal_ios.mm
@@ -13,13 +13,13 @@
   return [[UIDevice currentDevice] isMultitaskingSupported];
 }
 
-CriticalClosure::CriticalClosure(Closure closure)
+CriticalClosure::CriticalClosure(OnceClosure closure)
     : closure_(std::move(closure)) {}
 
 CriticalClosure::~CriticalClosure() {}
 
 void CriticalClosure::Run() {
-  closure_.Run();
+  std::move(closure_).Run();
 }
 
 }  // namespace internal
diff --git a/base/deferred_sequenced_task_runner.cc b/base/deferred_sequenced_task_runner.cc
index 926d895f..15367f0 100644
--- a/base/deferred_sequenced_task_runner.cc
+++ b/base/deferred_sequenced_task_runner.cc
@@ -34,7 +34,7 @@
 
 bool DeferredSequencedTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   AutoLock lock(lock_);
   if (started_) {
@@ -54,7 +54,7 @@
 
 bool DeferredSequencedTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   AutoLock lock(lock_);
   if (started_) {
@@ -69,7 +69,7 @@
 
 void DeferredSequencedTaskRunner::QueueDeferredTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay,
     bool is_non_nestable) {
   DCHECK(task);
diff --git a/base/deferred_sequenced_task_runner.h b/base/deferred_sequenced_task_runner.h
index 94651dd..85f196f3 100644
--- a/base/deferred_sequenced_task_runner.h
+++ b/base/deferred_sequenced_task_runner.h
@@ -28,13 +28,13 @@
 
   // TaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
   // SequencedTaskRunner implementation
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure task,
+                                  OnceClosure task,
                                   TimeDelta delay) override;
 
   // Start the execution - posts all queued tasks to the target executor. The
@@ -51,7 +51,7 @@
     DeferredTask& operator=(DeferredTask&& other);
 
     tracked_objects::Location posted_from;
-    Closure task;
+    OnceClosure task;
     // The delay this task was initially posted with.
     TimeDelta delay;
     bool is_non_nestable;
@@ -61,7 +61,7 @@
 
   // Creates a |Task| object and adds it to |deferred_tasks_queue_|.
   void QueueDeferredTask(const tracked_objects::Location& from_here,
-                         Closure task,
+                         OnceClosure task,
                          TimeDelta delay,
                          bool is_non_nestable);
 
diff --git a/base/message_loop/incoming_task_queue.cc b/base/message_loop/incoming_task_queue.cc
index f8387138..316b5ec 100644
--- a/base/message_loop/incoming_task_queue.cc
+++ b/base/message_loop/incoming_task_queue.cc
@@ -60,7 +60,7 @@
 
 bool IncomingTaskQueue::AddToIncomingQueue(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay,
     bool nestable) {
   DCHECK(task);
diff --git a/base/message_loop/incoming_task_queue.h b/base/message_loop/incoming_task_queue.h
index a912dc2..17bea07 100644
--- a/base/message_loop/incoming_task_queue.h
+++ b/base/message_loop/incoming_task_queue.h
@@ -36,7 +36,7 @@
   // returns false. In all cases, the ownership of |task| is transferred to the
   // called method.
   bool AddToIncomingQueue(const tracked_objects::Location& from_here,
-                          Closure task,
+                          OnceClosure task,
                           TimeDelta delay,
                           bool nestable);
 
diff --git a/base/message_loop/message_loop_task_runner.cc b/base/message_loop/message_loop_task_runner.cc
index ddfdeb2..aece087b 100644
--- a/base/message_loop/message_loop_task_runner.cc
+++ b/base/message_loop/message_loop_task_runner.cc
@@ -26,7 +26,7 @@
 
 bool MessageLoopTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     base::TimeDelta delay) {
   DCHECK(!task.is_null()) << from_here.ToString();
   return incoming_queue_->AddToIncomingQueue(from_here, std::move(task), delay,
@@ -35,7 +35,7 @@
 
 bool MessageLoopTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     base::TimeDelta delay) {
   DCHECK(!task.is_null()) << from_here.ToString();
   return incoming_queue_->AddToIncomingQueue(from_here, std::move(task), delay,
diff --git a/base/message_loop/message_loop_task_runner.h b/base/message_loop/message_loop_task_runner.h
index 11ee8a6..99a96a7 100644
--- a/base/message_loop/message_loop_task_runner.h
+++ b/base/message_loop/message_loop_task_runner.h
@@ -32,10 +32,10 @@
 
   // SingleThreadTaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure task,
+                                  OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
diff --git a/base/post_task_and_reply_with_result_internal.h b/base/post_task_and_reply_with_result_internal.h
index 14561293..6f50de8 100644
--- a/base/post_task_and_reply_with_result_internal.h
+++ b/base/post_task_and_reply_with_result_internal.h
@@ -16,16 +16,15 @@
 // Adapts a function that produces a result via a return value to
 // one that returns via an output parameter.
 template <typename ReturnType>
-void ReturnAsParamAdapter(const Callback<ReturnType(void)>& func,
-                          ReturnType* result) {
-  *result = func.Run();
+void ReturnAsParamAdapter(OnceCallback<ReturnType()> func, ReturnType* result) {
+  *result = std::move(func).Run();
 }
 
 // Adapts a T* result to a callblack that expects a T.
 template <typename TaskReturnType, typename ReplyArgType>
-void ReplyAdapter(const Callback<void(ReplyArgType)>& callback,
+void ReplyAdapter(OnceCallback<void(ReplyArgType)> callback,
                   TaskReturnType* result) {
-  callback.Run(std::move(*result));
+  std::move(callback).Run(std::move(*result));
 }
 
 }  // namespace internal
diff --git a/base/sequenced_task_runner.cc b/base/sequenced_task_runner.cc
index fa19ae5..4c367cb 100644
--- a/base/sequenced_task_runner.cc
+++ b/base/sequenced_task_runner.cc
@@ -12,7 +12,7 @@
 
 bool SequencedTaskRunner::PostNonNestableTask(
     const tracked_objects::Location& from_here,
-    Closure task) {
+    OnceClosure task) {
   return PostNonNestableDelayedTask(from_here, std::move(task),
                                     base::TimeDelta());
 }
diff --git a/base/sequenced_task_runner.h b/base/sequenced_task_runner.h
index b92bd997..b291539 100644
--- a/base/sequenced_task_runner.h
+++ b/base/sequenced_task_runner.h
@@ -110,11 +110,11 @@
   // below.
 
   bool PostNonNestableTask(const tracked_objects::Location& from_here,
-                           Closure task);
+                           OnceClosure task);
 
   virtual bool PostNonNestableDelayedTask(
       const tracked_objects::Location& from_here,
-      Closure task,
+      OnceClosure task,
       base::TimeDelta delay) = 0;
 
   // Submits a non-nestable task to delete the given object.  Returns
diff --git a/base/task_runner.cc b/base/task_runner.cc
index 8502510..c3e0574 100644
--- a/base/task_runner.cc
+++ b/base/task_runner.cc
@@ -23,7 +23,7 @@
 
  private:
   bool PostTask(const tracked_objects::Location& from_here,
-                Closure task) override;
+                OnceClosure task) override;
 
   // Non-owning.
   TaskRunner* destination_;
@@ -36,20 +36,20 @@
 
 bool PostTaskAndReplyTaskRunner::PostTask(
     const tracked_objects::Location& from_here,
-    Closure task) {
+    OnceClosure task) {
   return destination_->PostTask(from_here, std::move(task));
 }
 
 }  // namespace
 
 bool TaskRunner::PostTask(const tracked_objects::Location& from_here,
-                          Closure task) {
+                          OnceClosure task) {
   return PostDelayedTask(from_here, std::move(task), base::TimeDelta());
 }
 
 bool TaskRunner::PostTaskAndReply(const tracked_objects::Location& from_here,
-                                  Closure task,
-                                  Closure reply) {
+                                  OnceClosure task,
+                                  OnceClosure reply) {
   return PostTaskAndReplyTaskRunner(this).PostTaskAndReply(
       from_here, std::move(task), std::move(reply));
 }
diff --git a/base/task_runner.h b/base/task_runner.h
index d6a3871..0421d56 100644
--- a/base/task_runner.h
+++ b/base/task_runner.h
@@ -61,7 +61,7 @@
   // will not be run.
   //
   // Equivalent to PostDelayedTask(from_here, task, 0).
-  bool PostTask(const tracked_objects::Location& from_here, Closure task);
+  bool PostTask(const tracked_objects::Location& from_here, OnceClosure task);
 
   // Like PostTask, but tries to run the posted task only after
   // |delay_ms| has passed.
@@ -69,7 +69,7 @@
   // It is valid for an implementation to ignore |delay_ms|; that is,
   // to have PostDelayedTask behave the same as PostTask.
   virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
-                               Closure task,
+                               OnceClosure task,
                                base::TimeDelta delay) = 0;
 
   // Returns true if the current thread is a thread on which a task
@@ -122,8 +122,8 @@
   //     and the reply will cancel itself safely because it is bound to a
   //     WeakPtr<>.
   bool PostTaskAndReply(const tracked_objects::Location& from_here,
-                        Closure task,
-                        Closure reply);
+                        OnceClosure task,
+                        OnceClosure reply);
 
  protected:
   friend struct TaskRunnerTraits;
diff --git a/base/task_scheduler/post_task.cc b/base/task_scheduler/post_task.cc
index 0781e85..6f9adae2 100644
--- a/base/task_scheduler/post_task.cc
+++ b/base/task_scheduler/post_task.cc
@@ -21,7 +21,7 @@
 
  private:
   bool PostTask(const tracked_objects::Location& from_here,
-                Closure task) override {
+                OnceClosure task) override {
     PostTaskWithTraits(from_here, traits_, std::move(task));
     return true;
   }
@@ -32,43 +32,43 @@
 
 }  // namespace
 
-void PostTask(const tracked_objects::Location& from_here, Closure task) {
+void PostTask(const tracked_objects::Location& from_here, OnceClosure task) {
   PostDelayedTask(from_here, std::move(task), TimeDelta());
 }
 
 void PostDelayedTask(const tracked_objects::Location& from_here,
-                     Closure task,
+                     OnceClosure task,
                      TimeDelta delay) {
   PostDelayedTaskWithTraits(from_here, TaskTraits(), std::move(task), delay);
 }
 
 void PostTaskAndReply(const tracked_objects::Location& from_here,
-                      Closure task,
-                      Closure reply) {
+                      OnceClosure task,
+                      OnceClosure reply) {
   PostTaskWithTraitsAndReply(from_here, TaskTraits(), std::move(task),
                              std::move(reply));
 }
 
 void PostTaskWithTraits(const tracked_objects::Location& from_here,
                         const TaskTraits& traits,
-                        Closure task) {
+                        OnceClosure task) {
   PostDelayedTaskWithTraits(from_here, traits, std::move(task), TimeDelta());
 }
 
 void PostDelayedTaskWithTraits(const tracked_objects::Location& from_here,
                                const TaskTraits& traits,
-                               Closure task,
+                               OnceClosure task,
                                TimeDelta delay) {
   DCHECK(TaskScheduler::GetInstance())
       << "Ref. Prerequisite section of post_task.h";
   TaskScheduler::GetInstance()->PostDelayedTaskWithTraits(
-      from_here, traits, std::move(task), delay);
+      from_here, traits, std::move(task), std::move(delay));
 }
 
 void PostTaskWithTraitsAndReply(const tracked_objects::Location& from_here,
                                 const TaskTraits& traits,
-                                Closure task,
-                                Closure reply) {
+                                OnceClosure task,
+                                OnceClosure reply) {
   PostTaskAndReplyTaskRunner(traits).PostTaskAndReply(
       from_here, std::move(task), std::move(reply));
 }
diff --git a/base/task_scheduler/post_task.h b/base/task_scheduler/post_task.h
index efdee58f..69eda89 100644
--- a/base/task_scheduler/post_task.h
+++ b/base/task_scheduler/post_task.h
@@ -71,7 +71,7 @@
 // Posts |task| to the TaskScheduler. Calling this is equivalent to calling
 // PostTaskWithTraits with plain TaskTraits.
 BASE_EXPORT void PostTask(const tracked_objects::Location& from_here,
-                          Closure task);
+                          OnceClosure task);
 
 // Posts |task| to the TaskScheduler. |task| will not run before |delay|
 // expires. Calling this is equivalent to calling PostDelayedTaskWithTraits with
@@ -80,7 +80,7 @@
 // Use PostDelayedTaskWithTraits to specify a BACKGROUND priority if the task
 // doesn't have to run as soon as |delay| expires.
 BASE_EXPORT void PostDelayedTask(const tracked_objects::Location& from_here,
-                                 Closure task,
+                                 OnceClosure task,
                                  TimeDelta delay);
 
 // Posts |task| to the TaskScheduler and posts |reply| on the caller's execution
@@ -89,8 +89,8 @@
 // PostTaskWithTraitsAndReply with plain TaskTraits. Can only be called when
 // SequencedTaskRunnerHandle::IsSet().
 BASE_EXPORT void PostTaskAndReply(const tracked_objects::Location& from_here,
-                                  Closure task,
-                                  Closure reply);
+                                  OnceClosure task,
+                                  OnceClosure reply);
 
 // Posts |task| to the TaskScheduler and posts |reply| with the return value of
 // |task| as argument on the caller's execution context (i.e. same sequence or
@@ -99,16 +99,30 @@
 // TaskTraits. Can only be called when SequencedTaskRunnerHandle::IsSet().
 template <typename TaskReturnType, typename ReplyArgType>
 void PostTaskAndReplyWithResult(const tracked_objects::Location& from_here,
-                                Callback<TaskReturnType(void)> task,
-                                Callback<void(ReplyArgType)> reply) {
+                                OnceCallback<TaskReturnType()> task,
+                                OnceCallback<void(ReplyArgType)> reply) {
   PostTaskWithTraitsAndReplyWithResult(from_here, TaskTraits(), std::move(task),
                                        std::move(reply));
 }
 
+// Callback version of PostTaskAndReplyWithResult above.
+// Though RepeatingCallback is convertible to OnceCallback, we need this since
+// we can not use template deduction and object conversion at once on the
+// overload resolution.
+// TODO(tzik): Update all callers of the Callback version to use OnceCallback.
+template <typename TaskReturnType, typename ReplyArgType>
+void PostTaskAndReplyWithResult(const tracked_objects::Location& from_here,
+                                Callback<TaskReturnType()> task,
+                                Callback<void(ReplyArgType)> reply) {
+  PostTaskAndReplyWithResult(
+      from_here, OnceCallback<TaskReturnType()>(std::move(task)),
+      OnceCallback<void(ReplyArgType)>(std::move(reply)));
+}
+
 // Posts |task| with specific |traits| to the TaskScheduler.
 BASE_EXPORT void PostTaskWithTraits(const tracked_objects::Location& from_here,
                                     const TaskTraits& traits,
-                                    Closure task);
+                                    OnceClosure task);
 
 // Posts |task| with specific |traits| to the TaskScheduler. |task| will not run
 // before |delay| expires.
@@ -118,7 +132,7 @@
 BASE_EXPORT void PostDelayedTaskWithTraits(
     const tracked_objects::Location& from_here,
     const TaskTraits& traits,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay);
 
 // Posts |task| with specific |traits| to the TaskScheduler and posts |reply| on
@@ -128,8 +142,8 @@
 BASE_EXPORT void PostTaskWithTraitsAndReply(
     const tracked_objects::Location& from_here,
     const TaskTraits& traits,
-    Closure task,
-    Closure reply);
+    OnceClosure task,
+    OnceClosure reply);
 
 // Posts |task| with specific |traits| to the TaskScheduler and posts |reply|
 // with the return value of |task| as argument on the caller's execution context
@@ -139,14 +153,31 @@
 void PostTaskWithTraitsAndReplyWithResult(
     const tracked_objects::Location& from_here,
     const TaskTraits& traits,
-    Callback<TaskReturnType()> task,
-    Callback<void(ReplyArgType)> reply) {
+    OnceCallback<TaskReturnType()> task,
+    OnceCallback<void(ReplyArgType)> reply) {
   TaskReturnType* result = new TaskReturnType();
   return PostTaskWithTraitsAndReply(
-      from_here, traits, Bind(&internal::ReturnAsParamAdapter<TaskReturnType>,
-                              std::move(task), result),
-      Bind(&internal::ReplyAdapter<TaskReturnType, ReplyArgType>,
-           std::move(reply), Owned(result)));
+      from_here, traits,
+      BindOnce(&internal::ReturnAsParamAdapter<TaskReturnType>, std::move(task),
+               result),
+      BindOnce(&internal::ReplyAdapter<TaskReturnType, ReplyArgType>,
+               std::move(reply), Owned(result)));
+}
+
+// Callback version of PostTaskWithTraitsAndReplyWithResult above.
+// Though RepeatingCallback is convertible to OnceCallback, we need this since
+// we can not use template deduction and object conversion at once on the
+// overload resolution.
+// TODO(tzik): Update all callers of the Callback version to use OnceCallback.
+template <typename TaskReturnType, typename ReplyArgType>
+void PostTaskWithTraitsAndReplyWithResult(
+    const tracked_objects::Location& from_here,
+    const TaskTraits& traits,
+    Callback<TaskReturnType()> task,
+    Callback<void(ReplyArgType)> reply) {
+  PostTaskWithTraitsAndReplyWithResult(
+      from_here, traits, OnceCallback<TaskReturnType()>(std::move(task)),
+      OnceCallback<void(ReplyArgType)>(std::move(reply)));
 }
 
 // Returns a TaskRunner whose PostTask invocations result in scheduling tasks
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
index 059e459..d4c26d6 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
+++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
@@ -253,7 +253,7 @@
 
   // SingleThreadTaskRunner:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure closure,
+                       OnceClosure closure,
                        TimeDelta delay) override {
     auto task = MakeUnique<Task>(from_here, std::move(closure), traits_, delay);
     task->single_thread_task_runner_ref = this;
@@ -272,7 +272,7 @@
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure closure,
+                                  OnceClosure closure,
                                   TimeDelta delay) override {
     // Tasks are never nested within the task scheduler.
     return PostDelayedTask(from_here, std::move(closure), delay);
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task_scheduler/scheduler_worker_pool_impl.cc
index 5fb1194..cc08101 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.cc
+++ b/base/task_scheduler/scheduler_worker_pool_impl.cc
@@ -58,7 +58,7 @@
 
   // TaskRunner:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure closure,
+                       OnceClosure closure,
                        TimeDelta delay) override {
     // Post the task as part of a one-off single-task Sequence.
     return worker_pool_->PostTaskWithSequence(
@@ -93,7 +93,7 @@
 
   // SequencedTaskRunner:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure closure,
+                       OnceClosure closure,
                        TimeDelta delay) override {
     std::unique_ptr<Task> task(
         new Task(from_here, std::move(closure), traits_, delay));
@@ -104,7 +104,7 @@
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure closure,
+                                  OnceClosure closure,
                                   base::TimeDelta delay) override {
     // Tasks are never nested within the task scheduler.
     return PostDelayedTask(from_here, std::move(closure), delay);
diff --git a/base/task_scheduler/task.cc b/base/task_scheduler/task.cc
index 44aaa60..fc513e3 100644
--- a/base/task_scheduler/task.cc
+++ b/base/task_scheduler/task.cc
@@ -12,7 +12,7 @@
 namespace internal {
 
 Task::Task(const tracked_objects::Location& posted_from,
-           Closure task,
+           OnceClosure task,
            const TaskTraits& traits,
            TimeDelta delay)
     : PendingTask(
diff --git a/base/task_scheduler/task.h b/base/task_scheduler/task.h
index 1f3b775a2..43095f2a 100644
--- a/base/task_scheduler/task.h
+++ b/base/task_scheduler/task.h
@@ -28,7 +28,7 @@
   // behavior in |traits| is BLOCK_SHUTDOWN, the shutdown behavior is
   // automatically adjusted to SKIP_ON_SHUTDOWN.
   Task(const tracked_objects::Location& posted_from,
-       Closure task,
+       OnceClosure task,
        const TaskTraits& traits,
        TimeDelta delay);
   ~Task();
diff --git a/base/task_scheduler/task_scheduler.h b/base/task_scheduler/task_scheduler.h
index 57272bc..d19841f 100644
--- a/base/task_scheduler/task_scheduler.h
+++ b/base/task_scheduler/task_scheduler.h
@@ -70,7 +70,7 @@
   virtual void PostDelayedTaskWithTraits(
       const tracked_objects::Location& from_here,
       const TaskTraits& traits,
-      Closure task,
+      OnceClosure task,
       TimeDelta delay) = 0;
 
   // Returns a TaskRunner whose PostTask invocations result in scheduling tasks
diff --git a/base/task_scheduler/task_scheduler_impl.cc b/base/task_scheduler/task_scheduler_impl.cc
index f323310..3c98fdf 100644
--- a/base/task_scheduler/task_scheduler_impl.cc
+++ b/base/task_scheduler/task_scheduler_impl.cc
@@ -122,7 +122,7 @@
 void TaskSchedulerImpl::PostDelayedTaskWithTraits(
     const tracked_objects::Location& from_here,
     const TaskTraits& traits,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   // Post |task| as part of a one-off single-task Sequence.
   GetWorkerPoolForTraits(traits)->PostTaskWithSequence(
diff --git a/base/task_scheduler/task_scheduler_impl.h b/base/task_scheduler/task_scheduler_impl.h
index 4a048c94..1e31888 100644
--- a/base/task_scheduler/task_scheduler_impl.h
+++ b/base/task_scheduler/task_scheduler_impl.h
@@ -62,7 +62,7 @@
   // TaskScheduler:
   void PostDelayedTaskWithTraits(const tracked_objects::Location& from_here,
                                  const TaskTraits& traits,
-                                 Closure task,
+                                 OnceClosure task,
                                  TimeDelta delay) override;
   scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
       const TaskTraits& traits) override;
diff --git a/base/test/null_task_runner.cc b/base/test/null_task_runner.cc
index 66bdf6f..476af63 100644
--- a/base/test/null_task_runner.cc
+++ b/base/test/null_task_runner.cc
@@ -11,14 +11,14 @@
 NullTaskRunner::~NullTaskRunner() {}
 
 bool NullTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here,
-                                     Closure task,
+                                     OnceClosure task,
                                      base::TimeDelta delay) {
   return false;
 }
 
 bool NullTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     base::TimeDelta delay) {
   return false;
 }
diff --git a/base/test/null_task_runner.h b/base/test/null_task_runner.h
index a47e7b2..3dd9d7e5 100644
--- a/base/test/null_task_runner.h
+++ b/base/test/null_task_runner.h
@@ -20,10 +20,10 @@
   NullTaskRunner();
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   // Always returns true to avoid triggering DCHECKs.
   bool RunsTasksOnCurrentThread() const override;
diff --git a/base/test/scoped_task_scheduler.cc b/base/test/scoped_task_scheduler.cc
index dbf4936..4020e0e 100644
--- a/base/test/scoped_task_scheduler.cc
+++ b/base/test/scoped_task_scheduler.cc
@@ -49,7 +49,7 @@
   // TaskScheduler:
   void PostDelayedTaskWithTraits(const tracked_objects::Location& from_here,
                                  const TaskTraits& traits,
-                                 Closure task,
+                                 OnceClosure task,
                                  TimeDelta delay) override;
   scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
       const TaskTraits& traits) override;
@@ -134,10 +134,10 @@
 
   // SingleThreadTaskRunner:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure closure,
+                       OnceClosure closure,
                        TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure closure,
+                                  OnceClosure closure,
                                   TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
@@ -167,7 +167,7 @@
 void TestTaskScheduler::PostDelayedTaskWithTraits(
     const tracked_objects::Location& from_here,
     const TaskTraits& traits,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   CreateTaskRunnerWithTraits(traits)->PostDelayedTask(from_here,
                                                       std::move(task), delay);
@@ -280,7 +280,7 @@
 
 bool TestTaskSchedulerTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure closure,
+    OnceClosure closure,
     TimeDelta delay) {
   auto task =
       MakeUnique<internal::Task>(from_here, std::move(closure), traits_, delay);
@@ -293,7 +293,7 @@
 
 bool TestTaskSchedulerTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure closure,
+    OnceClosure closure,
     TimeDelta delay) {
   // Tasks are never nested within the task scheduler.
   return PostDelayedTask(from_here, std::move(closure), delay);
diff --git a/base/test/test_mock_time_task_runner.cc b/base/test/test_mock_time_task_runner.cc
index a431189..a236acf 100644
--- a/base/test/test_mock_time_task_runner.cc
+++ b/base/test/test_mock_time_task_runner.cc
@@ -81,7 +81,7 @@
     : public base::TestPendingTask {
   TestOrderedPendingTask();
   TestOrderedPendingTask(const tracked_objects::Location& location,
-                         Closure task,
+                         OnceClosure task,
                          TimeTicks post_time,
                          TimeDelta delay,
                          size_t ordinal,
@@ -106,7 +106,7 @@
 
 TestMockTimeTaskRunner::TestOrderedPendingTask::TestOrderedPendingTask(
     const tracked_objects::Location& location,
-    Closure task,
+    OnceClosure task,
     TimeTicks post_time,
     TimeDelta delay,
     size_t ordinal,
@@ -240,7 +240,7 @@
 
 bool TestMockTimeTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   AutoLock scoped_lock(tasks_lock_);
   tasks_.push(TestOrderedPendingTask(from_here, std::move(task), now_ticks_,
@@ -251,7 +251,7 @@
 
 bool TestMockTimeTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   return PostDelayedTask(from_here, std::move(task), delay);
 }
diff --git a/base/test/test_mock_time_task_runner.h b/base/test/test_mock_time_task_runner.h
index 5c61a36..2f892f5 100644
--- a/base/test/test_mock_time_task_runner.h
+++ b/base/test/test_mock_time_task_runner.h
@@ -141,10 +141,10 @@
   // SingleThreadTaskRunner:
   bool RunsTasksOnCurrentThread() const override;
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure task,
+                                  OnceClosure task,
                                   TimeDelta delay) override;
 
  protected:
diff --git a/base/test/test_pending_task.cc b/base/test/test_pending_task.cc
index 63bdfff..3f71a998 100644
--- a/base/test/test_pending_task.cc
+++ b/base/test/test_pending_task.cc
@@ -12,7 +12,7 @@
 TestPendingTask::TestPendingTask() : nestability(NESTABLE) {}
 
 TestPendingTask::TestPendingTask(const tracked_objects::Location& location,
-                                 Closure task,
+                                 OnceClosure task,
                                  TimeTicks post_time,
                                  TimeDelta delay,
                                  TestNestability nestability)
diff --git a/base/test/test_pending_task.h b/base/test/test_pending_task.h
index 4497ba18c..52ca592f 100644
--- a/base/test/test_pending_task.h
+++ b/base/test/test_pending_task.h
@@ -23,7 +23,7 @@
   TestPendingTask();
   TestPendingTask(TestPendingTask&& other);
   TestPendingTask(const tracked_objects::Location& location,
-                  Closure task,
+                  OnceClosure task,
                   TimeTicks post_time,
                   TimeDelta delay,
                   TestNestability nestability);
diff --git a/base/test/test_simple_task_runner.cc b/base/test/test_simple_task_runner.cc
index df03340..4280a0d 100644
--- a/base/test/test_simple_task_runner.cc
+++ b/base/test/test_simple_task_runner.cc
@@ -18,7 +18,7 @@
 
 bool TestSimpleTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   AutoLock auto_lock(lock_);
   pending_tasks_.push_back(TestPendingTask(from_here, std::move(task),
@@ -29,7 +29,7 @@
 
 bool TestSimpleTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   AutoLock auto_lock(lock_);
   pending_tasks_.push_back(TestPendingTask(from_here, std::move(task),
diff --git a/base/test/test_simple_task_runner.h b/base/test/test_simple_task_runner.h
index ac609f1..f46e065 100644
--- a/base/test/test_simple_task_runner.h
+++ b/base/test/test_simple_task_runner.h
@@ -44,10 +44,10 @@
 
   // SingleThreadTaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure task,
+                                  OnceClosure task,
                                   TimeDelta delay) override;
 
   bool RunsTasksOnCurrentThread() const override;
diff --git a/base/threading/post_task_and_reply_impl.cc b/base/threading/post_task_and_reply_impl.cc
index 802de8c3..cddb898 100644
--- a/base/threading/post_task_and_reply_impl.cc
+++ b/base/threading/post_task_and_reply_impl.cc
@@ -29,8 +29,8 @@
 class PostTaskAndReplyRelay {
  public:
   PostTaskAndReplyRelay(const tracked_objects::Location& from_here,
-                        Closure task,
-                        Closure reply)
+                        OnceClosure task,
+                        OnceClosure reply)
       : sequence_checker_(),
         from_here_(from_here),
         origin_task_runner_(SequencedTaskRunnerHandle::Get()),
@@ -42,8 +42,7 @@
   }
 
   void RunTaskAndPostReply() {
-    task_.Run();
-    task_.Reset();
+    std::move(task_).Run();
     origin_task_runner_->PostTask(
         from_here_, Bind(&PostTaskAndReplyRelay::RunReplyAndSelfDestruct,
                          base::Unretained(this)));
@@ -58,7 +57,7 @@
     // while |reply_| is executing.
     DCHECK(!task_);
 
-    reply_.Run();
+    std::move(reply_).Run();
 
     // Cue mission impossible theme.
     delete this;
@@ -67,8 +66,8 @@
   const SequenceChecker sequence_checker_;
   const tracked_objects::Location from_here_;
   const scoped_refptr<SequencedTaskRunner> origin_task_runner_;
-  Closure reply_;
-  Closure task_;
+  OnceClosure reply_;
+  OnceClosure task_;
 };
 
 }  // namespace
@@ -77,8 +76,8 @@
 
 bool PostTaskAndReplyImpl::PostTaskAndReply(
     const tracked_objects::Location& from_here,
-    Closure task,
-    Closure reply) {
+    OnceClosure task,
+    OnceClosure reply) {
   DCHECK(!task.is_null()) << from_here.ToString();
   DCHECK(!reply.is_null()) << from_here.ToString();
   PostTaskAndReplyRelay* relay =
diff --git a/base/threading/post_task_and_reply_impl.h b/base/threading/post_task_and_reply_impl.h
index a02c32ec..00aee6d 100644
--- a/base/threading/post_task_and_reply_impl.h
+++ b/base/threading/post_task_and_reply_impl.h
@@ -29,12 +29,12 @@
   // SequencedTaskRunnerHandle::IsSet(). Both |task| and |reply| are guaranteed
   // to be deleted on the sequence or thread that called this.
   bool PostTaskAndReply(const tracked_objects::Location& from_here,
-                        Closure task,
-                        Closure reply);
+                        OnceClosure task,
+                        OnceClosure reply);
 
  private:
   virtual bool PostTask(const tracked_objects::Location& from_here,
-                        Closure task) = 0;
+                        OnceClosure task) = 0;
 };
 
 }  // namespace internal
diff --git a/base/threading/post_task_and_reply_impl_unittest.cc b/base/threading/post_task_and_reply_impl_unittest.cc
index 5385739..f1b1d7a 100644
--- a/base/threading/post_task_and_reply_impl_unittest.cc
+++ b/base/threading/post_task_and_reply_impl_unittest.cc
@@ -29,7 +29,7 @@
 
  private:
   bool PostTask(const tracked_objects::Location& from_here,
-                Closure task) override {
+                OnceClosure task) override {
     return destination_->PostTask(from_here, std::move(task));
   }
 
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
index 9830604..64f1bbd 100644
--- a/base/threading/sequenced_worker_pool.cc
+++ b/base/threading/sequenced_worker_pool.cc
@@ -93,12 +93,15 @@
 
   ~SequencedTask() {}
 
+  SequencedTask(SequencedTask&&) = default;
+  SequencedTask& operator=(SequencedTask&&) = default;
+
   int sequence_token_id;
   int trace_id;
   int64_t sequence_task_number;
   SequencedWorkerPool::WorkerShutdown shutdown_behavior;
   tracked_objects::Location posted_from;
-  Closure task;
+  OnceClosure task;
 
   // Non-delayed tasks and delayed tasks are managed together by time-to-run
   // order. We calculate the time by adding the posted time and the given delay.
@@ -140,7 +143,7 @@
 
   // TaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
@@ -164,7 +167,7 @@
 
 bool SequencedWorkerPoolTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   if (delay.is_zero()) {
     return pool_->PostWorkerTaskWithShutdownBehavior(from_here, std::move(task),
@@ -194,13 +197,13 @@
 
   // TaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
   // SequencedTaskRunner implementation
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure task,
+                                  OnceClosure task,
                                   TimeDelta delay) override;
 
  private:
@@ -229,7 +232,7 @@
 
 bool SequencedWorkerPool::PoolSequencedTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   if (delay.is_zero()) {
     return pool_->PostSequencedWorkerTaskWithShutdownBehavior(
@@ -246,7 +249,7 @@
 
 bool SequencedWorkerPool::PoolSequencedTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   // There's no way to run nested tasks, so simply forward to
   // PostDelayedTask.
@@ -349,7 +352,7 @@
                 SequenceToken sequence_token,
                 WorkerShutdown shutdown_behavior,
                 const tracked_objects::Location& from_here,
-                Closure task,
+                OnceClosure task,
                 TimeDelta delay);
 
   bool RunsTasksOnCurrentThread() const;
@@ -394,8 +397,7 @@
   // Returns true if the task may run at some point in the future and false if
   // it will definitely not run.
   // Coalesce upon resolution of http://crbug.com/622400.
-  bool PostTaskToTaskScheduler(const SequencedTask& sequenced,
-                               const TimeDelta& delay);
+  bool PostTaskToTaskScheduler(SequencedTask sequenced, const TimeDelta& delay);
 
   // Returns the TaskScheduler TaskRunner for the specified |sequence_token_id|
   // and |traits|.
@@ -693,7 +695,7 @@
     SequenceToken sequence_token,
     WorkerShutdown shutdown_behavior,
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   DCHECK(task);
 
@@ -754,12 +756,14 @@
       sequenced.sequence_token_id = LockedGetNamedTokenID(*optional_token_name);
 
     if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) {
-      if (!PostTaskToTaskScheduler(sequenced, delay))
+      if (!PostTaskToTaskScheduler(std::move(sequenced), delay))
         return false;
     } else {
-      pending_tasks_.insert(sequenced);
+      SequencedWorkerPool::WorkerShutdown shutdown_behavior =
+          sequenced.shutdown_behavior;
+      pending_tasks_.insert(std::move(sequenced));
 
-      if (sequenced.shutdown_behavior == BLOCK_SHUTDOWN)
+      if (shutdown_behavior == BLOCK_SHUTDOWN)
         blocking_shutdown_pending_task_count_++;
 
       create_thread_id = PrepareToStartAdditionalThreadIfHelpful();
@@ -796,7 +800,7 @@
 }
 
 bool SequencedWorkerPool::Inner::PostTaskToTaskScheduler(
-    const SequencedTask& sequenced,
+    SequencedTask sequenced,
     const TimeDelta& delay) {
   DCHECK_EQ(AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER, g_all_pools_state);
 
@@ -826,7 +830,8 @@
                                 .WithPriority(task_priority_)
                                 .WithShutdownBehavior(task_shutdown_behavior);
   return GetTaskSchedulerTaskRunner(sequenced.sequence_token_id, traits)
-      ->PostDelayedTask(sequenced.posted_from, sequenced.task, delay);
+      ->PostDelayedTask(sequenced.posted_from, std::move(sequenced.task),
+                        delay);
 }
 
 scoped_refptr<TaskRunner>
@@ -1244,7 +1249,11 @@
       // refcounted, so we just need to keep a copy of them alive until the lock
       // is exited. The calling code can just clear() the vector they passed to
       // us once the lock is exited to make this happen.
-      delete_these_outside_lock->push_back(*i);
+      //
+      // The const_cast here is safe since the object is erased from
+      // |pending_tasks_| soon after the move.
+      delete_these_outside_lock->push_back(
+          std::move(const_cast<SequencedTask&>(*i)));
       pending_tasks_.erase(i++);
       continue;
     }
@@ -1255,14 +1264,18 @@
       status = GET_WORK_WAIT;
       if (cleanup_state_ == CLEANUP_RUNNING) {
         // Deferred tasks are deleted when cleaning up, see Inner::ThreadLoop.
-        delete_these_outside_lock->push_back(*i);
+        // The const_cast here is safe since the object is erased from
+        // |pending_tasks_| soon after the move.
+        delete_these_outside_lock->push_back(
+            std::move(const_cast<SequencedTask&>(*i)));
         pending_tasks_.erase(i);
       }
       break;
     }
 
-    // Found a runnable task.
-    *task = *i;
+    // Found a runnable task. The const_cast is safe here since the object is
+    // erased from |pending_tasks_| soon after the move.
+    *task = std::move(const_cast<SequencedTask&>(*i));
     pending_tasks_.erase(i);
     if (task->shutdown_behavior == BLOCK_SHUTDOWN) {
       blocking_shutdown_pending_task_count_--;
@@ -1535,14 +1548,14 @@
 
 bool SequencedWorkerPool::PostWorkerTask(
     const tracked_objects::Location& from_here,
-    Closure task) {
+    OnceClosure task) {
   return inner_->PostTask(NULL, SequenceToken(), BLOCK_SHUTDOWN, from_here,
                           std::move(task), TimeDelta());
 }
 
 bool SequencedWorkerPool::PostDelayedWorkerTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   WorkerShutdown shutdown_behavior =
       delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN;
@@ -1552,7 +1565,7 @@
 
 bool SequencedWorkerPool::PostWorkerTaskWithShutdownBehavior(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     WorkerShutdown shutdown_behavior) {
   return inner_->PostTask(NULL, SequenceToken(), shutdown_behavior, from_here,
                           std::move(task), TimeDelta());
@@ -1561,7 +1574,7 @@
 bool SequencedWorkerPool::PostSequencedWorkerTask(
     SequenceToken sequence_token,
     const tracked_objects::Location& from_here,
-    Closure task) {
+    OnceClosure task) {
   return inner_->PostTask(NULL, sequence_token, BLOCK_SHUTDOWN, from_here,
                           std::move(task), TimeDelta());
 }
@@ -1569,7 +1582,7 @@
 bool SequencedWorkerPool::PostDelayedSequencedWorkerTask(
     SequenceToken sequence_token,
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   WorkerShutdown shutdown_behavior =
       delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN;
@@ -1580,7 +1593,7 @@
 bool SequencedWorkerPool::PostNamedSequencedWorkerTask(
     const std::string& token_name,
     const tracked_objects::Location& from_here,
-    Closure task) {
+    OnceClosure task) {
   DCHECK(!token_name.empty());
   return inner_->PostTask(&token_name, SequenceToken(), BLOCK_SHUTDOWN,
                           from_here, std::move(task), TimeDelta());
@@ -1589,7 +1602,7 @@
 bool SequencedWorkerPool::PostSequencedWorkerTaskWithShutdownBehavior(
     SequenceToken sequence_token,
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     WorkerShutdown shutdown_behavior) {
   return inner_->PostTask(NULL, sequence_token, shutdown_behavior, from_here,
                           std::move(task), TimeDelta());
@@ -1597,7 +1610,7 @@
 
 bool SequencedWorkerPool::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   return PostDelayedWorkerTask(from_here, std::move(task), delay);
 }
diff --git a/base/threading/sequenced_worker_pool.h b/base/threading/sequenced_worker_pool.h
index 8cdeb0b5d..e577e1b 100644
--- a/base/threading/sequenced_worker_pool.h
+++ b/base/threading/sequenced_worker_pool.h
@@ -275,7 +275,8 @@
   //
   // Returns true if the task was posted successfully. This may fail during
   // shutdown regardless of the specified ShutdownBehavior.
-  bool PostWorkerTask(const tracked_objects::Location& from_here, Closure task);
+  bool PostWorkerTask(const tracked_objects::Location& from_here,
+                      OnceClosure task);
 
   // Same as PostWorkerTask but allows a delay to be specified (although doing
   // so changes the shutdown behavior). The task will be run after the given
@@ -287,13 +288,13 @@
   // task will be guaranteed to run to completion before shutdown
   // (BLOCK_SHUTDOWN semantics).
   bool PostDelayedWorkerTask(const tracked_objects::Location& from_here,
-                             Closure task,
+                             OnceClosure task,
                              TimeDelta delay);
 
   // Same as PostWorkerTask but allows specification of the shutdown behavior.
   bool PostWorkerTaskWithShutdownBehavior(
       const tracked_objects::Location& from_here,
-      Closure task,
+      OnceClosure task,
       WorkerShutdown shutdown_behavior);
 
   // Like PostWorkerTask above, but provides sequencing semantics. This means
@@ -309,13 +310,13 @@
   // shutdown regardless of the specified ShutdownBehavior.
   bool PostSequencedWorkerTask(SequenceToken sequence_token,
                                const tracked_objects::Location& from_here,
-                               Closure task);
+                               OnceClosure task);
 
   // Like PostSequencedWorkerTask above, but allows you to specify a named
   // token, which saves an extra call to GetNamedSequenceToken.
   bool PostNamedSequencedWorkerTask(const std::string& token_name,
                                     const tracked_objects::Location& from_here,
-                                    Closure task);
+                                    OnceClosure task);
 
   // Same as PostSequencedWorkerTask but allows a delay to be specified
   // (although doing so changes the shutdown behavior). The task will be run
@@ -329,7 +330,7 @@
   bool PostDelayedSequencedWorkerTask(
       SequenceToken sequence_token,
       const tracked_objects::Location& from_here,
-      Closure task,
+      OnceClosure task,
       TimeDelta delay);
 
   // Same as PostSequencedWorkerTask but allows specification of the shutdown
@@ -337,12 +338,12 @@
   bool PostSequencedWorkerTaskWithShutdownBehavior(
       SequenceToken sequence_token,
       const tracked_objects::Location& from_here,
-      Closure task,
+      OnceClosure task,
       WorkerShutdown shutdown_behavior);
 
   // TaskRunner implementation. Forwards to PostDelayedWorkerTask().
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
diff --git a/base/threading/worker_pool.cc b/base/threading/worker_pool.cc
index bc313ce..26ff10f 100644
--- a/base/threading/worker_pool.cc
+++ b/base/threading/worker_pool.cc
@@ -27,7 +27,7 @@
 
  private:
   bool PostTask(const tracked_objects::Location& from_here,
-                Closure task) override {
+                OnceClosure task) override {
     return WorkerPool::PostTask(from_here, std::move(task), task_is_slow_);
   }
 
@@ -45,7 +45,7 @@
 
   // TaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
@@ -56,7 +56,7 @@
   // zero because non-zero delays are not supported.
   bool PostDelayedTaskAssertZeroDelay(
       const tracked_objects::Location& from_here,
-      Closure task,
+      OnceClosure task,
       base::TimeDelta delay);
 
   const bool tasks_are_slow_;
@@ -73,7 +73,7 @@
 
 bool WorkerPoolTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     TimeDelta delay) {
   return PostDelayedTaskAssertZeroDelay(from_here, std::move(task), delay);
 }
@@ -84,7 +84,7 @@
 
 bool WorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay(
     const tracked_objects::Location& from_here,
-    Closure task,
+    OnceClosure task,
     base::TimeDelta delay) {
   DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0)
       << "WorkerPoolTaskRunner does not support non-zero delays";
@@ -102,8 +102,8 @@
 }  // namespace
 
 bool WorkerPool::PostTaskAndReply(const tracked_objects::Location& from_here,
-                                  Closure task,
-                                  Closure reply,
+                                  OnceClosure task,
+                                  OnceClosure reply,
                                   bool task_is_slow) {
   // Do not report PostTaskAndReplyRelay leaks in tests. There's nothing we can
   // do about them because WorkerPool doesn't have a flushing API.
diff --git a/base/threading/worker_pool.h b/base/threading/worker_pool.h
index d97dbd6..d1c666d2 100644
--- a/base/threading/worker_pool.h
+++ b/base/threading/worker_pool.h
@@ -32,15 +32,15 @@
   // false if |task| could not be posted to a worker thread.  Regardless of
   // return value, ownership of |task| is transferred to the worker pool.
   static bool PostTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        bool task_is_slow);
 
   // Just like TaskRunner::PostTaskAndReply, except the destination
   // for |task| is a worker thread and you can specify |task_is_slow| just
   // like you can for PostTask above.
   static bool PostTaskAndReply(const tracked_objects::Location& from_here,
-                               Closure task,
-                               Closure reply,
+                               OnceClosure task,
+                               OnceClosure reply,
                                bool task_is_slow);
 
   // Return true if the current thread is one that this WorkerPool runs tasks
diff --git a/base/threading/worker_pool_posix.cc b/base/threading/worker_pool_posix.cc
index 5d0689b..851480ad 100644
--- a/base/threading/worker_pool_posix.cc
+++ b/base/threading/worker_pool_posix.cc
@@ -49,7 +49,7 @@
   ~WorkerPoolImpl() = delete;
 
   void PostTask(const tracked_objects::Location& from_here,
-                base::Closure task,
+                base::OnceClosure task,
                 bool task_is_slow);
 
  private:
@@ -61,7 +61,7 @@
                                              kIdleSecondsBeforeExit)) {}
 
 void WorkerPoolImpl::PostTask(const tracked_objects::Location& from_here,
-                              base::Closure task,
+                              base::OnceClosure task,
                               bool task_is_slow) {
   pool_->PostTask(from_here, std::move(task));
 }
@@ -114,7 +114,7 @@
 
 // static
 bool WorkerPool::PostTask(const tracked_objects::Location& from_here,
-                          base::Closure task,
+                          base::OnceClosure task,
                           bool task_is_slow) {
   g_lazy_worker_pool.Pointer()->PostTask(from_here, std::move(task),
                                          task_is_slow);
@@ -140,7 +140,7 @@
 
 void PosixDynamicThreadPool::PostTask(
     const tracked_objects::Location& from_here,
-    base::Closure task) {
+    base::OnceClosure task) {
   PendingTask pending_task(from_here, std::move(task));
   AddTask(&pending_task);
 }
diff --git a/base/threading/worker_pool_posix.h b/base/threading/worker_pool_posix.h
index cfa50c2..0b10adf8f 100644
--- a/base/threading/worker_pool_posix.h
+++ b/base/threading/worker_pool_posix.h
@@ -51,7 +51,7 @@
                          int idle_seconds_before_exit);
 
   // Adds |task| to the thread pool.
-  void PostTask(const tracked_objects::Location& from_here, Closure task);
+  void PostTask(const tracked_objects::Location& from_here, OnceClosure task);
 
   // Worker thread method to wait for up to |idle_seconds_before_exit| for more
   // work from the thread pool.  Returns NULL if no work is available.
diff --git a/base/threading/worker_pool_win.cc b/base/threading/worker_pool_win.cc
index 4e5d9085..9b1192c9 100644
--- a/base/threading/worker_pool_win.cc
+++ b/base/threading/worker_pool_win.cc
@@ -64,7 +64,7 @@
 
 // static
 bool WorkerPool::PostTask(const tracked_objects::Location& from_here,
-                          base::Closure task,
+                          base::OnceClosure task,
                           bool task_is_slow) {
   PendingTask* pending_task = new PendingTask(from_here, std::move(task));
   return PostTaskInternal(pending_task, task_is_slow);
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index faae270..e126edd 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -105,7 +105,7 @@
 // Posts |task| to |task_runner| and blocks until it is executed.
 void PostTaskAndWait(const tracked_objects::Location& from_here,
                      SequencedTaskRunner* task_runner,
-                     base::Closure task) {
+                     base::OnceClosure task) {
   base::WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
                             WaitableEvent::InitialState::NOT_SIGNALED);
   task_runner->PostTask(from_here, std::move(task));
@@ -182,14 +182,14 @@
   unsigned no_of_post_tasks() const { return num_of_post_tasks_; }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  Closure task,
+                                  OnceClosure task,
                                   TimeDelta delay) override {
     NOTREACHED();
     return false;
   }
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       Closure task,
+                       OnceClosure task,
                        TimeDelta delay) override {
     num_of_post_tasks_++;
     if (enabled_) {
diff --git a/cc/test/ordered_simple_task_runner.cc b/cc/test/ordered_simple_task_runner.cc
index fd263f07..4b3a80a 100644
--- a/cc/test/ordered_simple_task_runner.cc
+++ b/cc/test/ordered_simple_task_runner.cc
@@ -36,7 +36,7 @@
 
 TestOrderablePendingTask::TestOrderablePendingTask(
     const tracked_objects::Location& location,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeTicks post_time,
     base::TimeDelta delay,
     TestNestability nestability)
@@ -109,7 +109,7 @@
 // base::TestSimpleTaskRunner implementation
 bool OrderedSimpleTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   DCHECK(thread_checker_.CalledOnValidThread());
   TestOrderablePendingTask pt(from_here, std::move(task), now_src_->NowTicks(),
@@ -122,7 +122,7 @@
 
 bool OrderedSimpleTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   DCHECK(thread_checker_.CalledOnValidThread());
   TestOrderablePendingTask pt(from_here, std::move(task), now_src_->NowTicks(),
diff --git a/cc/test/ordered_simple_task_runner.h b/cc/test/ordered_simple_task_runner.h
index 0f9c2f56..8051415f 100644
--- a/cc/test/ordered_simple_task_runner.h
+++ b/cc/test/ordered_simple_task_runner.h
@@ -29,7 +29,7 @@
  public:
   TestOrderablePendingTask();
   TestOrderablePendingTask(const tracked_objects::Location& location,
-                           base::Closure task,
+                           base::OnceClosure task,
                            base::TimeTicks post_time,
                            base::TimeDelta delay,
                            TestNestability nestability);
@@ -64,10 +64,10 @@
 
   // base::TestSimpleTaskRunner implementation:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
 
   bool RunsTasksOnCurrentThread() const override;
diff --git a/cc/tiles/image_controller_unittest.cc b/cc/tiles/image_controller_unittest.cc
index 6e6dc24..b0eec200 100644
--- a/cc/tiles/image_controller_unittest.cc
+++ b/cc/tiles/image_controller_unittest.cc
@@ -26,7 +26,7 @@
 
   void Run() override {
     for (;;) {
-      base::Closure task;
+      base::OnceClosure task;
       {
         base::AutoLock hold(lock_);
         if (shutdown_)
@@ -50,7 +50,7 @@
     condition_.Signal();
   }
 
-  void PostTask(base::Closure task) {
+  void PostTask(base::OnceClosure task) {
     base::AutoLock hold(lock_);
     queue_.push_back(std::move(task));
     condition_.Signal();
@@ -59,7 +59,7 @@
  private:
   base::Lock lock_;
   base::ConditionVariable condition_;
-  std::vector<base::Closure> queue_;
+  std::vector<base::OnceClosure> queue_;
   bool shutdown_ = false;
 };
 
@@ -68,13 +68,13 @@
   WorkerTaskRunner() { thread_.Start(); }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return PostDelayedTask(from_here, std::move(task), delay);
   }
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     thread_.PostTask(std::move(task));
     return true;
@@ -142,7 +142,7 @@
 class DecodeClient {
  public:
   DecodeClient() {}
-  void Callback(base::Closure quit_closure,
+  void Callback(base::OnceClosure quit_closure,
                 ImageController::ImageDecodeRequestId id,
                 ImageController::ImageDecodeResult result) {
     id_ = id;
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index 3675241..59e73f36 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -57,7 +57,7 @@
 class SynchronousSimpleTaskRunner : public base::TestSimpleTaskRunner {
  public:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     TestSimpleTaskRunner::PostDelayedTask(from_here, std::move(task), delay);
     if (run_tasks_synchronously_)
@@ -66,7 +66,7 @@
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return PostDelayedTask(from_here, std::move(task), delay);
   }
diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc
index 7b81016..5b1513c 100644
--- a/chrome/browser/after_startup_task_utils.cc
+++ b/chrome/browser/after_startup_task_utils.cc
@@ -34,13 +34,13 @@
 struct AfterStartupTask {
   AfterStartupTask(const tracked_objects::Location& from_here,
                    const scoped_refptr<base::TaskRunner>& task_runner,
-                   base::Closure task)
+                   base::OnceClosure task)
       : from_here(from_here), task_runner(task_runner), task(std::move(task)) {}
   ~AfterStartupTask() {}
 
   const tracked_objects::Location from_here;
   const scoped_refptr<base::TaskRunner> task_runner;
-  base::Closure task;
+  base::OnceClosure task;
 };
 
 // The flag may be read on any thread, but must only be set on the UI thread.
@@ -204,7 +204,7 @@
 
 bool AfterStartupTaskUtils::Runner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   DCHECK(delay.is_zero());
   AfterStartupTaskUtils::PostTask(from_here, destination_runner_,
@@ -224,7 +224,7 @@
 void AfterStartupTaskUtils::PostTask(
     const tracked_objects::Location& from_here,
     const scoped_refptr<base::TaskRunner>& destination_runner,
-    base::Closure task) {
+    base::OnceClosure task) {
   if (IsBrowserStartupComplete()) {
     destination_runner->PostTask(from_here, std::move(task));
     return;
diff --git a/chrome/browser/after_startup_task_utils.h b/chrome/browser/after_startup_task_utils.h
index dbd9b63c..a190c06 100644
--- a/chrome/browser/after_startup_task_utils.h
+++ b/chrome/browser/after_startup_task_utils.h
@@ -26,7 +26,7 @@
 
     // Overrides from base::TaskRunner:
     bool PostDelayedTask(const tracked_objects::Location& from_here,
-                         base::Closure task,
+                         base::OnceClosure task,
                          base::TimeDelta delay) override;
     bool RunsTasksOnCurrentThread() const override;
 
@@ -47,7 +47,7 @@
   static void PostTask(
       const tracked_objects::Location& from_here,
       const scoped_refptr<base::TaskRunner>& destination_runner,
-      base::Closure task);
+      base::OnceClosure task);
 
   // Returns true if browser startup is complete. Only use this on a one-off
   // basis; If you need to poll this function constantly, use the above
diff --git a/chrome/browser/after_startup_task_utils_unittest.cc b/chrome/browser/after_startup_task_utils_unittest.cc
index 6f3dad8..6b1a9c5b 100644
--- a/chrome/browser/after_startup_task_utils_unittest.cc
+++ b/chrome/browser/after_startup_task_utils_unittest.cc
@@ -31,12 +31,13 @@
       : real_task_runner_(real_runner) {}
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     ++posted_task_count_;
     return real_task_runner_->PostDelayedTask(
         from_here,
-        base::Bind(&WrappedTaskRunner::RunWrappedTask, this, std::move(task)),
+        base::BindOnce(&WrappedTaskRunner::RunWrappedTask, this,
+                       std::move(task)),
         base::TimeDelta());  // Squash all delays so our tests complete asap.
   }
 
@@ -58,7 +59,7 @@
  private:
   ~WrappedTaskRunner() override {}
 
-  void RunWrappedTask(base::Closure task) {
+  void RunWrappedTask(base::OnceClosure task) {
     ++ran_task_count_;
     std::move(task).Run();
   }
@@ -98,12 +99,12 @@
   void PostAfterStartupTaskFromDBThread(
       const tracked_objects::Location& from_here,
       const scoped_refptr<base::TaskRunner>& task_runner,
-      base::Closure task) {
+      base::OnceClosure task) {
     RunLoop run_loop;
     db_thread_->real_runner()->PostTaskAndReply(
         FROM_HERE,
-        base::Bind(&AfterStartupTaskUtils::PostTask, from_here, task_runner,
-                   std::move(task)),
+        base::BindOnce(&AfterStartupTaskUtils::PostTask, from_here, task_runner,
+                       std::move(task)),
         base::Bind(&RunLoop::Quit, base::Unretained(&run_loop)));
     run_loop.Run();
   }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index c397c07d..40ef7bf 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1081,7 +1081,7 @@
 void ChromeContentBrowserClient::PostAfterStartupTask(
     const tracked_objects::Location& from_here,
     const scoped_refptr<base::TaskRunner>& task_runner,
-    base::Closure task) {
+    base::OnceClosure task) {
   AfterStartupTaskUtils::PostTask(from_here, task_runner, std::move(task));
 }
 
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 1bdb651..f13add81 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -67,7 +67,7 @@
       const content::MainFunctionParams& parameters) override;
   void PostAfterStartupTask(const tracked_objects::Location& from_here,
                             const scoped_refptr<base::TaskRunner>& task_runner,
-                            base::Closure task) override;
+                            base::OnceClosure task) override;
   bool IsBrowserStartupComplete() override;
   std::string GetStoragePartitionIdForSite(
       content::BrowserContext* browser_context,
diff --git a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
index 5881b69..d731dd1a 100644
--- a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
+++ b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
@@ -37,7 +37,7 @@
  private:
   // base::TaskRunner overrides.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     std::move(task).Run();
     return true;
diff --git a/chrome/browser/chromeos/login/users/mock_user_manager.cc b/chrome/browser/chromeos/login/users/mock_user_manager.cc
index 26812e0a..3dd798a 100644
--- a/chrome/browser/chromeos/login/users/mock_user_manager.cc
+++ b/chrome/browser/chromeos/login/users/mock_user_manager.cc
@@ -13,7 +13,7 @@
 class FakeTaskRunner : public base::TaskRunner {
  public:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     std::move(task).Run();
     return true;
diff --git a/chrome/browser/memory/tab_manager_unittest.cc b/chrome/browser/memory/tab_manager_unittest.cc
index 0129a78..c62a285 100644
--- a/chrome/browser/memory/tab_manager_unittest.cc
+++ b/chrome/browser/memory/tab_manager_unittest.cc
@@ -100,7 +100,7 @@
 using MockTaskRunner = testing::StrictMock<LenientMockTaskRunner>;
 
 // Represents a pending task.
-using Task = std::pair<base::TimeTicks, base::Closure>;
+using Task = std::pair<base::TimeTicks, base::OnceClosure>;
 
 // Comparator used for sorting Task objects. Can't use std::pair's default
 // comparison operators because Closure's are comparable.
@@ -120,7 +120,7 @@
       : mock_(mock), clock_(clock) {}
   bool RunsTasksOnCurrentThread() const override { return true; }
   bool PostDelayedTask(const tracked_objects::Location& location,
-                       base::Closure closure,
+                       base::OnceClosure closure,
                        base::TimeDelta delta) override {
     mock_->PostDelayedTask(location, delta);
     base::TimeTicks when = clock_->NowTicks() + delta;
@@ -169,7 +169,7 @@
   base::SimpleTestTickClock* clock_;
 
   // A min-heap of outstanding tasks.
-  using Task = std::pair<base::TimeTicks, base::Closure>;
+  using Task = std::pair<base::TimeTicks, base::OnceClosure>;
   std::vector<Task> tasks_;
 
   DISALLOW_COPY_AND_ASSIGN(TaskRunnerProxy);
diff --git a/chromecast/base/system_time_change_notifier_unittest.cc b/chromecast/base/system_time_change_notifier_unittest.cc
index 3372aa9..41c0be4 100644
--- a/chromecast/base/system_time_change_notifier_unittest.cc
+++ b/chromecast/base/system_time_change_notifier_unittest.cc
@@ -28,14 +28,14 @@
 
   // base::SequencedTaskRunner implementation:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     base::ThreadTaskRunnerHandle::Get()->PostTask(from_here, std::move(task));
     return true;
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return true;
   }
diff --git a/chromeos/dbus/blocking_method_caller_unittest.cc b/chromeos/dbus/blocking_method_caller_unittest.cc
index 24588c90..f126408 100644
--- a/chromeos/dbus/blocking_method_caller_unittest.cc
+++ b/chromeos/dbus/blocking_method_caller_unittest.cc
@@ -28,7 +28,7 @@
 class FakeTaskRunner : public base::TaskRunner {
  public:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     std::move(task).Run();
     return true;
diff --git a/chromeos/tpm/tpm_token_info_getter_unittest.cc b/chromeos/tpm/tpm_token_info_getter_unittest.cc
index db58ad6..2b49d093 100644
--- a/chromeos/tpm/tpm_token_info_getter_unittest.cc
+++ b/chromeos/tpm/tpm_token_info_getter_unittest.cc
@@ -61,7 +61,7 @@
 
   // base::TaskRunner overrides:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     delays_->push_back(delay.InMilliseconds());
     base::ThreadTaskRunnerHandle::Get()->PostTask(from_here, std::move(task));
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
index f4c9e77d..b9ebe00 100644
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.cc
@@ -937,7 +937,7 @@
 }
 
 void HistoryService::ScheduleTask(SchedulePriority priority,
-                                  base::Closure task) {
+                                  base::OnceClosure task) {
   DCHECK(thread_checker_.CalledOnValidThread());
   CHECK(backend_task_runner_);
   // TODO(brettw): Do prioritization.
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h
index 9e44870..c89868c 100644
--- a/components/history/core/browser/history_service.h
+++ b/components/history/core/browser/history_service.h
@@ -801,7 +801,7 @@
 
   // Call to schedule a given task for running on the history thread with the
   // specified priority. The task will have ownership taken.
-  void ScheduleTask(SchedulePriority priority, base::Closure task);
+  void ScheduleTask(SchedulePriority priority, base::OnceClosure task);
 
   // Called when the favicons for the given page URLs (e.g.
   // http://www.google.com) and the given icon URL (e.g.
diff --git a/components/memory_pressure/memory_pressure_monitor_unittest.cc b/components/memory_pressure/memory_pressure_monitor_unittest.cc
index e295c835..ac608bf 100644
--- a/components/memory_pressure/memory_pressure_monitor_unittest.cc
+++ b/components/memory_pressure/memory_pressure_monitor_unittest.cc
@@ -48,7 +48,7 @@
   explicit TaskRunnerProxy(MockTaskRunner* mock) : mock_(mock) {}
   bool RunsTasksOnCurrentThread() const override { return true; }
   bool PostDelayedTask(const tracked_objects::Location& location,
-                       base::Closure closure,
+                       base::OnceClosure closure,
                        base::TimeDelta delta) override {
     return mock_->PostDelayedTask(location, delta);
   }
diff --git a/components/subresource_filter/content/browser/content_ruleset_service_unittest.cc b/components/subresource_filter/content/browser/content_ruleset_service_unittest.cc
index b7914875..e99b4be 100644
--- a/components/subresource_filter/content/browser/content_ruleset_service_unittest.cc
+++ b/components/subresource_filter/content/browser/content_ruleset_service_unittest.cc
@@ -48,7 +48,7 @@
   // ::content::ContentBrowserClient:
   void PostAfterStartupTask(const tracked_objects::Location&,
                             const scoped_refptr<base::TaskRunner>& task_runner,
-                            base::Closure task) override {
+                            base::OnceClosure task) override {
     scoped_refptr<base::TaskRunner> ui_task_runner =
         content::BrowserThread::GetTaskRunnerForThread(
             content::BrowserThread::UI);
@@ -62,7 +62,7 @@
   }
 
  private:
-  base::Closure last_task_;
+  base::OnceClosure last_task_;
 
   DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient);
 };
diff --git a/components/user_manager/fake_user_manager.cc b/components/user_manager/fake_user_manager.cc
index 6ff3481..69cb7469 100644
--- a/components/user_manager/fake_user_manager.cc
+++ b/components/user_manager/fake_user_manager.cc
@@ -19,7 +19,7 @@
 class FakeTaskRunner : public base::TaskRunner {
  public:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     std::move(task).Run();
     return true;
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc
index f4e0383..8df7974 100644
--- a/content/browser/browser_thread_impl.cc
+++ b/content/browser/browser_thread_impl.cc
@@ -62,14 +62,14 @@
 
   // SingleThreadTaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     return BrowserThread::PostDelayedTask(id_, from_here, std::move(task),
                                           delay);
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return BrowserThread::PostNonNestableDelayedTask(id_, from_here,
                                                      std::move(task), delay);
@@ -490,7 +490,7 @@
 bool BrowserThreadImpl::PostTaskHelper(
     BrowserThread::ID identifier,
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay,
     bool nestable) {
   DCHECK_GE(identifier, 0);
@@ -534,7 +534,7 @@
 // static
 bool BrowserThread::PostBlockingPoolTask(
     const tracked_objects::Location& from_here,
-    base::Closure task) {
+    base::OnceClosure task) {
   return g_globals.Get().blocking_pool->PostWorkerTask(from_here,
                                                        std::move(task));
 }
@@ -542,8 +542,8 @@
 // static
 bool BrowserThread::PostBlockingPoolTaskAndReply(
     const tracked_objects::Location& from_here,
-    base::Closure task,
-    base::Closure reply) {
+    base::OnceClosure task,
+    base::OnceClosure reply) {
   return g_globals.Get().blocking_pool->PostTaskAndReply(
       from_here, std::move(task), std::move(reply));
 }
@@ -552,7 +552,7 @@
 bool BrowserThread::PostBlockingPoolSequencedTask(
     const std::string& sequence_token_name,
     const tracked_objects::Location& from_here,
-    base::Closure task) {
+    base::OnceClosure task) {
   return g_globals.Get().blocking_pool->PostNamedSequencedWorkerTask(
       sequence_token_name, from_here, std::move(task));
 }
@@ -561,7 +561,7 @@
 void BrowserThread::PostAfterStartupTask(
     const tracked_objects::Location& from_here,
     const scoped_refptr<base::TaskRunner>& task_runner,
-    base::Closure task) {
+    base::OnceClosure task) {
   GetContentClient()->browser()->PostAfterStartupTask(from_here, task_runner,
                                                       std::move(task));
 }
@@ -623,7 +623,7 @@
 // static
 bool BrowserThread::PostTask(ID identifier,
                              const tracked_objects::Location& from_here,
-                             base::Closure task) {
+                             base::OnceClosure task) {
   return BrowserThreadImpl::PostTaskHelper(
       identifier, from_here, std::move(task), base::TimeDelta(), true);
 }
@@ -631,7 +631,7 @@
 // static
 bool BrowserThread::PostDelayedTask(ID identifier,
                                     const tracked_objects::Location& from_here,
-                                    base::Closure task,
+                                    base::OnceClosure task,
                                     base::TimeDelta delay) {
   return BrowserThreadImpl::PostTaskHelper(identifier, from_here,
                                            std::move(task), delay, true);
@@ -641,7 +641,7 @@
 bool BrowserThread::PostNonNestableTask(
     ID identifier,
     const tracked_objects::Location& from_here,
-    base::Closure task) {
+    base::OnceClosure task) {
   return BrowserThreadImpl::PostTaskHelper(
       identifier, from_here, std::move(task), base::TimeDelta(), false);
 }
@@ -650,7 +650,7 @@
 bool BrowserThread::PostNonNestableDelayedTask(
     ID identifier,
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return BrowserThreadImpl::PostTaskHelper(identifier, from_here,
                                            std::move(task), delay, false);
@@ -659,8 +659,8 @@
 // static
 bool BrowserThread::PostTaskAndReply(ID identifier,
                                      const tracked_objects::Location& from_here,
-                                     base::Closure task,
-                                     base::Closure reply) {
+                                     base::OnceClosure task,
+                                     base::OnceClosure reply) {
   return GetTaskRunnerForThread(identifier)
       ->PostTaskAndReply(from_here, std::move(task), std::move(reply));
 }
diff --git a/content/browser/browser_thread_impl.h b/content/browser/browser_thread_impl.h
index b4a84399..51adc53 100644
--- a/content/browser/browser_thread_impl.h
+++ b/content/browser/browser_thread_impl.h
@@ -87,7 +87,7 @@
 
   static bool PostTaskHelper(BrowserThread::ID identifier,
                              const tracked_objects::Location& from_here,
-                             base::Closure task,
+                             base::OnceClosure task,
                              base::TimeDelta delay,
                              bool nestable);
 
diff --git a/content/browser/compositor/reflector_impl_unittest.cc b/content/browser/compositor/reflector_impl_unittest.cc
index b926b4c..aa62722d 100644
--- a/content/browser/compositor/reflector_impl_unittest.cc
+++ b/content/browser/compositor/reflector_impl_unittest.cc
@@ -35,12 +35,12 @@
   FakeTaskRunner() {}
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return true;
   }
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     return true;
   }
diff --git a/content/browser/dom_storage/dom_storage_task_runner.cc b/content/browser/dom_storage/dom_storage_task_runner.cc
index f4e18f0..738be98 100644
--- a/content/browser/dom_storage/dom_storage_task_runner.cc
+++ b/content/browser/dom_storage/dom_storage_task_runner.cc
@@ -31,7 +31,7 @@
 
 bool DOMStorageWorkerPoolTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return primary_sequence_->PostDelayedTask(from_here, std::move(task), delay);
 }
@@ -39,7 +39,7 @@
 bool DOMStorageWorkerPoolTaskRunner::PostShutdownBlockingTask(
     const tracked_objects::Location& from_here,
     SequenceID sequence_id,
-    base::Closure task) {
+    base::OnceClosure task) {
   return GetSequencedTaskRunner(sequence_id)
       ->PostTask(from_here, std::move(task));
 }
@@ -74,7 +74,7 @@
 
 bool MockDOMStorageTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostTask(from_here, std::move(task));
 }
@@ -82,7 +82,7 @@
 bool MockDOMStorageTaskRunner::PostShutdownBlockingTask(
     const tracked_objects::Location& from_here,
     SequenceID sequence_id,
-    base::Closure task) {
+    base::OnceClosure task) {
   return task_runner_->PostTask(from_here, std::move(task));
 }
 
diff --git a/content/browser/dom_storage/dom_storage_task_runner.h b/content/browser/dom_storage/dom_storage_task_runner.h
index 6dcbe783..ef90833 100644
--- a/content/browser/dom_storage/dom_storage_task_runner.h
+++ b/content/browser/dom_storage/dom_storage_task_runner.h
@@ -34,14 +34,14 @@
   // The PostTask() and PostDelayedTask() methods defined by TaskRunner
   // post shutdown-blocking tasks on the primary sequence.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override = 0;
 
   // Posts a shutdown blocking task to |sequence_id|.
   virtual bool PostShutdownBlockingTask(
       const tracked_objects::Location& from_here,
       SequenceID sequence_id,
-      base::Closure task) = 0;
+      base::OnceClosure task) = 0;
 
   virtual void AssertIsRunningOnPrimarySequence() const = 0;
   virtual void AssertIsRunningOnCommitSequence() const = 0;
@@ -66,12 +66,12 @@
   bool RunsTasksOnCurrentThread() const override;
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
 
   bool PostShutdownBlockingTask(const tracked_objects::Location& from_here,
                                 SequenceID sequence_id,
-                                base::Closure task) override;
+                                base::OnceClosure task) override;
 
   void AssertIsRunningOnPrimarySequence() const override;
   void AssertIsRunningOnCommitSequence() const override;
@@ -103,12 +103,12 @@
   bool RunsTasksOnCurrentThread() const override;
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
 
   bool PostShutdownBlockingTask(const tracked_objects::Location& from_here,
                                 SequenceID sequence_id,
-                                base::Closure task) override;
+                                base::OnceClosure task) override;
 
   void AssertIsRunningOnPrimarySequence() const override;
   void AssertIsRunningOnCommitSequence() const override;
diff --git a/content/browser/startup_task_runner_unittest.cc b/content/browser/startup_task_runner_unittest.cc
index cec2ec3..747c313f 100644
--- a/content/browser/startup_task_runner_unittest.cc
+++ b/content/browser/startup_task_runner_unittest.cc
@@ -88,25 +88,25 @@
   TaskRunnerProxy(MockTaskRunner* mock) : mock_(mock) {}
   bool RunsTasksOnCurrentThread() const override { return true; }
   bool PostDelayedTask(const tracked_objects::Location& location,
-                       base::Closure closure,
+                       base::OnceClosure closure,
                        base::TimeDelta delta) override {
     last_task_ = std::move(closure);
     return mock_->PostDelayedTask(location, delta);
   }
   bool PostNonNestableDelayedTask(const tracked_objects::Location& location,
-                                  base::Closure closure,
+                                  base::OnceClosure closure,
                                   base::TimeDelta delta) override {
     last_task_ = std::move(closure);
     return mock_->PostNonNestableDelayedTask(location, delta);
   }
 
-  base::Closure TakeLastTaskClosure() { return std::move(last_task_); }
+  base::OnceClosure TakeLastTaskClosure() { return std::move(last_task_); }
 
  private:
   ~TaskRunnerProxy() override {}
 
   MockTaskRunner* mock_;
-  base::Closure last_task_;
+  base::OnceClosure last_task_;
 };
 
 TEST_F(StartupTaskRunnerTest, SynchronousExecution) {
diff --git a/content/child/worker_thread_registry.cc b/content/child/worker_thread_registry.cc
index 8eae438..80fe598 100644
--- a/content/child/worker_thread_registry.cc
+++ b/content/child/worker_thread_registry.cc
@@ -38,7 +38,7 @@
   ~DoNothingTaskRunner() override {}
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     return false;
   }
@@ -56,7 +56,7 @@
   return base::PlatformThread::CurrentId();
 }
 
-void WorkerThread::PostTask(int id, base::Closure task) {
+void WorkerThread::PostTask(int id, base::OnceClosure task) {
   WorkerThreadRegistry::Instance()->PostTask(id, std::move(task));
 }
 
@@ -125,7 +125,7 @@
              : task_runner_for_dead_worker_.get();
 }
 
-bool WorkerThreadRegistry::PostTask(int id, base::Closure closure) {
+bool WorkerThreadRegistry::PostTask(int id, base::OnceClosure closure) {
   DCHECK(id > 0);
   base::AutoLock locker(task_runner_map_lock_);
   IDToTaskRunnerMap::iterator found = task_runner_map_.find(id);
diff --git a/content/child/worker_thread_registry.h b/content/child/worker_thread_registry.h
index 3e8f994d..657d88c 100644
--- a/content/child/worker_thread_registry.h
+++ b/content/child/worker_thread_registry.h
@@ -39,7 +39,7 @@
   friend class WorkerThread;
   friend class WorkerThreadRegistryTest;
 
-  bool PostTask(int id, base::Closure task);
+  bool PostTask(int id, base::OnceClosure task);
 
   using IDToTaskRunnerMap = std::map<base::PlatformThreadId, base::TaskRunner*>;
 
diff --git a/content/public/browser/browser_thread.h b/content/public/browser/browser_thread.h
index f410569..ad2db91 100644
--- a/content/public/browser/browser_thread.h
+++ b/content/public/browser/browser_thread.h
@@ -116,24 +116,24 @@
   // the target thread may already have a Quit message in its queue.
   static bool PostTask(ID identifier,
                        const tracked_objects::Location& from_here,
-                       base::Closure task);
+                       base::OnceClosure task);
   static bool PostDelayedTask(ID identifier,
                               const tracked_objects::Location& from_here,
-                              base::Closure task,
+                              base::OnceClosure task,
                               base::TimeDelta delay);
   static bool PostNonNestableTask(ID identifier,
                                   const tracked_objects::Location& from_here,
-                                  base::Closure task);
+                                  base::OnceClosure task);
   static bool PostNonNestableDelayedTask(
       ID identifier,
       const tracked_objects::Location& from_here,
-      base::Closure task,
+      base::OnceClosure task,
       base::TimeDelta delay);
 
   static bool PostTaskAndReply(ID identifier,
                                const tracked_objects::Location& from_here,
-                               base::Closure task,
-                               base::Closure reply);
+                               base::OnceClosure task,
+                               base::OnceClosure reply);
 
   template <typename ReturnType, typename ReplyArgType>
   static bool PostTaskAndReplyWithResult(
@@ -193,15 +193,15 @@
   // base::PostTaskAndReplyWithResult() with GetBlockingPool() as the task
   // runner.
   static bool PostBlockingPoolTask(const tracked_objects::Location& from_here,
-                                   base::Closure task);
+                                   base::OnceClosure task);
   static bool PostBlockingPoolTaskAndReply(
       const tracked_objects::Location& from_here,
-      base::Closure task,
-      base::Closure reply);
+      base::OnceClosure task,
+      base::OnceClosure reply);
   static bool PostBlockingPoolSequencedTask(
       const std::string& sequence_token_name,
       const tracked_objects::Location& from_here,
-      base::Closure task);
+      base::OnceClosure task);
 
   // For use with scheduling non-critical tasks for execution after startup.
   // The order or execution of tasks posted here is unspecified even when
@@ -213,7 +213,7 @@
   static void PostAfterStartupTask(
       const tracked_objects::Location& from_here,
       const scoped_refptr<base::TaskRunner>& task_runner,
-      base::Closure task);
+      base::OnceClosure task);
 
   // Returns the thread pool used for blocking file I/O. Use this object to
   // perform random blocking operations such as file writes.
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index bf8f8fb..754c5c6 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -31,7 +31,7 @@
 void ContentBrowserClient::PostAfterStartupTask(
     const tracked_objects::Location& from_here,
     const scoped_refptr<base::TaskRunner>& task_runner,
-    base::Closure task) {
+    base::OnceClosure task) {
   task_runner->PostTask(from_here, std::move(task));
 }
 
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index bdb9182..f360af58 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -160,7 +160,7 @@
   virtual void PostAfterStartupTask(
       const tracked_objects::Location& from_here,
       const scoped_refptr<base::TaskRunner>& task_runner,
-      base::Closure task);
+      base::OnceClosure task);
 
   // Allows the embedder to indicate whether it considers startup to be
   // complete. May be called on any thread. This should be called on a one-off
diff --git a/content/public/child/worker_thread.h b/content/public/child/worker_thread.h
index c35ce8bd..926b3bd 100644
--- a/content/public/child/worker_thread.h
+++ b/content/public/child/worker_thread.h
@@ -42,7 +42,7 @@
   static int GetCurrentId();
 
   // Posts a task to the worker thread with ID |id|. ID must be > 0.
-  static void PostTask(int id, base::Closure task);
+  static void PostTask(int id, base::OnceClosure task);
 
  private:
   WorkerThread(){};
diff --git a/content/renderer/categorized_worker_pool.cc b/content/renderer/categorized_worker_pool.cc
index 8ce19ba..5569e06a 100644
--- a/content/renderer/categorized_worker_pool.cc
+++ b/content/renderer/categorized_worker_pool.cc
@@ -53,7 +53,7 @@
 
   // Overridden from base::TaskRunner:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     return PostNonNestableDelayedTask(from_here, std::move(task), delay);
   }
@@ -61,7 +61,7 @@
 
   // Overridden from base::SequencedTaskRunner:
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     DCHECK(task);
     base::AutoLock lock(lock_);
@@ -187,7 +187,7 @@
 // Overridden from base::TaskRunner:
 bool CategorizedWorkerPool::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   base::AutoLock lock(lock_);
 
@@ -415,7 +415,7 @@
   }
 }
 
-CategorizedWorkerPool::ClosureTask::ClosureTask(base::Closure closure)
+CategorizedWorkerPool::ClosureTask::ClosureTask(base::OnceClosure closure)
     : closure_(std::move(closure)) {}
 
 // Overridden from cc::Task:
diff --git a/content/renderer/categorized_worker_pool.h b/content/renderer/categorized_worker_pool.h
index ec65e4af..83d0fe1 100644
--- a/content/renderer/categorized_worker_pool.h
+++ b/content/renderer/categorized_worker_pool.h
@@ -36,7 +36,7 @@
 
   // Overridden from base::TaskRunner:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
@@ -85,7 +85,7 @@
   // |task_graph_runner_|.
   class ClosureTask : public cc::Task {
    public:
-    explicit ClosureTask(base::Closure closure);
+    explicit ClosureTask(base::OnceClosure closure);
 
     // Overridden from cc::Task:
     void RunOnWorkerThread() override;
@@ -94,7 +94,7 @@
     ~ClosureTask() override;
 
    private:
-    base::Closure closure_;
+    base::OnceClosure closure_;
 
     DISALLOW_COPY_AND_ASSIGN(ClosureTask);
   };
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc
index c896a6b..d9de9dda 100644
--- a/content/renderer/render_thread_impl_browsertest.cc
+++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -84,7 +84,7 @@
 
   // SingleThreadTaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location&,
-                       base::Closure,
+                       base::OnceClosure,
                        base::TimeDelta) override {
     base::AutoLock auto_lock(lock_);
     count_++;
@@ -92,7 +92,7 @@
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location&,
-                                  base::Closure,
+                                  base::OnceClosure,
                                   base::TimeDelta) override {
     base::AutoLock auto_lock(lock_);
     count_++;
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc
index de1fbdc..52c86cb 100644
--- a/content/test/test_blink_web_unit_test_support.cc
+++ b/content/test/test_blink_web_unit_test_support.cc
@@ -65,14 +65,14 @@
   DummyTaskRunner() : thread_id_(base::PlatformThread::CurrentId()) {}
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     // Drop the delayed task.
     return false;
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     // Drop the delayed task.
     return false;
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm
index 6c0bc350..2062c8f 100644
--- a/ios/chrome/app/application_delegate/app_state.mm
+++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -50,7 +50,7 @@
 
 namespace {
 // Helper method to post |closure| on the UI thread.
-void PostTaskOnUIThread(base::Closure closure) {
+void PostTaskOnUIThread(base::OnceClosure closure) {
   web::WebThread::PostTask(web::WebThread::UI, FROM_HERE, std::move(closure));
 }
 NSString* const kStartupAttemptReset = @"StartupAttempReset";
@@ -215,17 +215,19 @@
         [[_browserLauncher browserViewInformation] currentBVC]
             .browserState->GetRequestContext();
     _savingCookies = YES;
-    base::Closure criticalClosure =
+    base::OnceClosure criticalClosure =
         base::MakeCriticalClosure(base::BindBlockArc(^{
           DCHECK_CURRENTLY_ON(web::WebThread::UI);
           _savingCookies = NO;
         }));
+    base::Closure post_back_to_ui =
+        base::Bind(&PostTaskOnUIThread, base::Passed(&criticalClosure));
     web::WebThread::PostTask(
         web::WebThread::IO, FROM_HERE, base::BindBlockArc(^{
           net::CookieStoreIOS* store = static_cast<net::CookieStoreIOS*>(
               getter->GetURLRequestContext()->cookie_store());
           // FlushStore() runs its callback on any thread. Jump back to UI.
-          store->FlushStore(base::Bind(&PostTaskOnUIThread, criticalClosure));
+          store->FlushStore(post_back_to_ui);
         }));
   }
 
diff --git a/ios/web/public/web_thread.h b/ios/web/public/web_thread.h
index 6a7930b..be41b30 100644
--- a/ios/web/public/web_thread.h
+++ b/ios/web/public/web_thread.h
@@ -101,31 +101,31 @@
   // They return true iff the thread existed and the task was posted.
   static bool PostTask(ID identifier,
                        const tracked_objects::Location& from_here,
-                       base::Closure task);
+                       base::OnceClosure task);
   static bool PostDelayedTask(ID identifier,
                               const tracked_objects::Location& from_here,
-                              base::Closure task,
+                              base::OnceClosure task,
                               base::TimeDelta delay);
   static bool PostNonNestableTask(ID identifier,
                                   const tracked_objects::Location& from_here,
-                                  base::Closure task);
+                                  base::OnceClosure task);
   static bool PostNonNestableDelayedTask(
       ID identifier,
       const tracked_objects::Location& from_here,
-      base::Closure task,
+      base::OnceClosure task,
       base::TimeDelta delay);
 
   static bool PostTaskAndReply(ID identifier,
                                const tracked_objects::Location& from_here,
-                               base::Closure task,
-                               base::Closure reply);
+                               base::OnceClosure task,
+                               base::OnceClosure reply);
 
   template <typename ReturnType, typename ReplyArgType>
   static bool PostTaskAndReplyWithResult(
       ID identifier,
       const tracked_objects::Location& from_here,
-      base::Callback<ReturnType()> task,
-      base::Callback<void(ReplyArgType)> reply) {
+      base::OnceCallback<ReturnType()> task,
+      base::OnceCallback<void(ReplyArgType)> reply) {
     scoped_refptr<base::SingleThreadTaskRunner> task_runner =
         GetTaskRunnerForThread(identifier);
     return base::PostTaskAndReplyWithResult(task_runner.get(), from_here,
@@ -161,15 +161,15 @@
   // base::PostTaskAndReplyWithResult() with GetBlockingPool() as the task
   // runner.
   static bool PostBlockingPoolTask(const tracked_objects::Location& from_here,
-                                   base::Closure task);
+                                   base::OnceClosure task);
   static bool PostBlockingPoolTaskAndReply(
       const tracked_objects::Location& from_here,
-      base::Closure task,
-      base::Closure reply);
+      base::OnceClosure task,
+      base::OnceClosure reply);
   static bool PostBlockingPoolSequencedTask(
       const std::string& sequence_token_name,
       const tracked_objects::Location& from_here,
-      base::Closure task);
+      base::OnceClosure task);
 
   // Returns the thread pool used for blocking file I/O. Use this object to
   // perform random blocking operations such as file writes.
diff --git a/ios/web/web_thread_impl.cc b/ios/web/web_thread_impl.cc
index d03e29df..236759af 100644
--- a/ios/web/web_thread_impl.cc
+++ b/ios/web/web_thread_impl.cc
@@ -49,13 +49,13 @@
 
   // SingleThreadTaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     return WebThread::PostDelayedTask(id_, from_here, std::move(task), delay);
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return WebThread::PostNonNestableDelayedTask(id_, from_here,
                                                  std::move(task), delay);
@@ -291,7 +291,7 @@
 // static
 bool WebThreadImpl::PostTaskHelper(WebThread::ID identifier,
                                    const tracked_objects::Location& from_here,
-                                   base::Closure task,
+                                   base::OnceClosure task,
                                    base::TimeDelta delay,
                                    bool nestable) {
   DCHECK(identifier >= 0 && identifier < ID_COUNT);
@@ -331,7 +331,7 @@
 
 // static
 bool WebThread::PostBlockingPoolTask(const tracked_objects::Location& from_here,
-                                     base::Closure task) {
+                                     base::OnceClosure task) {
   return g_globals.Get().blocking_pool->PostWorkerTask(from_here,
                                                        std::move(task));
 }
@@ -339,8 +339,8 @@
 // static
 bool WebThread::PostBlockingPoolTaskAndReply(
     const tracked_objects::Location& from_here,
-    base::Closure task,
-    base::Closure reply) {
+    base::OnceClosure task,
+    base::OnceClosure reply) {
   return g_globals.Get().blocking_pool->PostTaskAndReply(
       from_here, std::move(task), std::move(reply));
 }
@@ -349,7 +349,7 @@
 bool WebThread::PostBlockingPoolSequencedTask(
     const std::string& sequence_token_name,
     const tracked_objects::Location& from_here,
-    base::Closure task) {
+    base::OnceClosure task) {
   return g_globals.Get().blocking_pool->PostNamedSequencedWorkerTask(
       sequence_token_name, from_here, std::move(task));
 }
@@ -409,7 +409,7 @@
 // static
 bool WebThread::PostTask(ID identifier,
                          const tracked_objects::Location& from_here,
-                         base::Closure task) {
+                         base::OnceClosure task) {
   return WebThreadImpl::PostTaskHelper(identifier, from_here, std::move(task),
                                        base::TimeDelta(), true);
 }
@@ -417,7 +417,7 @@
 // static
 bool WebThread::PostDelayedTask(ID identifier,
                                 const tracked_objects::Location& from_here,
-                                base::Closure task,
+                                base::OnceClosure task,
                                 base::TimeDelta delay) {
   return WebThreadImpl::PostTaskHelper(identifier, from_here, std::move(task),
                                        delay, true);
@@ -426,7 +426,7 @@
 // static
 bool WebThread::PostNonNestableTask(ID identifier,
                                     const tracked_objects::Location& from_here,
-                                    base::Closure task) {
+                                    base::OnceClosure task) {
   return WebThreadImpl::PostTaskHelper(identifier, from_here, std::move(task),
                                        base::TimeDelta(), false);
 }
@@ -435,7 +435,7 @@
 bool WebThread::PostNonNestableDelayedTask(
     ID identifier,
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return WebThreadImpl::PostTaskHelper(identifier, from_here, std::move(task),
                                        delay, false);
@@ -444,8 +444,8 @@
 // static
 bool WebThread::PostTaskAndReply(ID identifier,
                                  const tracked_objects::Location& from_here,
-                                 base::Closure task,
-                                 base::Closure reply) {
+                                 base::OnceClosure task,
+                                 base::OnceClosure reply) {
   return GetTaskRunnerForThread(identifier)
       ->PostTaskAndReply(from_here, std::move(task), std::move(reply));
 }
diff --git a/ios/web/web_thread_impl.h b/ios/web/web_thread_impl.h
index 1341d63..c2e388b 100644
--- a/ios/web/web_thread_impl.h
+++ b/ios/web/web_thread_impl.h
@@ -49,7 +49,7 @@
 
   static bool PostTaskHelper(WebThread::ID identifier,
                              const tracked_objects::Location& from_here,
-                             base::Closure task,
+                             base::OnceClosure task,
                              base::TimeDelta delay,
                              bool nestable);
 
diff --git a/media/base/fake_single_thread_task_runner.cc b/media/base/fake_single_thread_task_runner.cc
index 63d741f..c57ae1f 100644
--- a/media/base/fake_single_thread_task_runner.cc
+++ b/media/base/fake_single_thread_task_runner.cc
@@ -20,7 +20,7 @@
 
 bool FakeSingleThreadTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   if (fail_on_next_task_) {
     LOG(FATAL) << "Infinite task posting loop detected.  Possibly caused by "
@@ -69,7 +69,7 @@
     if (clock_->NowTicks() < it->first.first)
       return;
 
-    base::Closure task = std::move(it->second);
+    base::OnceClosure task = std::move(it->second);
     tasks_.erase(it);
     std::move(task).Run();
   }
@@ -90,9 +90,9 @@
       }
 
       clock_->Advance(it->first.first - clock_->NowTicks());
-      const base::Closure task = it->second;
+      base::OnceClosure task = std::move(it->second);
       tasks_.erase(it);
-      task.Run();
+      std::move(task).Run();
     }
 
     // If this point is reached, there's likely some sort of case where a new
@@ -106,7 +106,7 @@
 
 bool FakeSingleThreadTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   NOTIMPLEMENTED();
   return false;
diff --git a/media/base/fake_single_thread_task_runner.h b/media/base/fake_single_thread_task_runner.h
index 504e27d..7b77455 100644
--- a/media/base/fake_single_thread_task_runner.h
+++ b/media/base/fake_single_thread_task_runner.h
@@ -25,14 +25,14 @@
 
   // base::SingleThreadTaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) final;
 
   bool RunsTasksOnCurrentThread() const final;
 
   // This function is currently not used, and will return false.
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) final;
 
  protected:
@@ -49,7 +49,7 @@
   // Note: The std::map data structure was chosen because the entire
   // cast_unittests suite performed 20% faster than when using
   // std::priority_queue.  http://crbug.com/530842
-  std::map<TaskKey, base::Closure> tasks_;
+  std::map<TaskKey, base::OnceClosure> tasks_;
 
   bool fail_on_next_task_;
 
diff --git a/media/cast/test/skewed_single_thread_task_runner.cc b/media/cast/test/skewed_single_thread_task_runner.cc
index 6797d6fa..28361438 100644
--- a/media/cast/test/skewed_single_thread_task_runner.cc
+++ b/media/cast/test/skewed_single_thread_task_runner.cc
@@ -28,7 +28,7 @@
 
 bool SkewedSingleThreadTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostDelayedTask(
       from_here, std::move(task),
@@ -41,7 +41,7 @@
 
 bool SkewedSingleThreadTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostNonNestableDelayedTask(
       from_here, std::move(task),
diff --git a/media/cast/test/skewed_single_thread_task_runner.h b/media/cast/test/skewed_single_thread_task_runner.h
index 3fd6bdc..f03d0db 100644
--- a/media/cast/test/skewed_single_thread_task_runner.h
+++ b/media/cast/test/skewed_single_thread_task_runner.h
@@ -31,14 +31,14 @@
 
   // base::SingleThreadTaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) final;
 
   bool RunsTasksOnCurrentThread() const final;
 
   // This function is currently not used, and will return false.
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) final;
 
  protected:
diff --git a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
index 757ed5e5..569eb51 100644
--- a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
@@ -32,14 +32,14 @@
                     base::WaitableEvent::InitialState::NOT_SIGNALED) {}
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     NOTREACHED();
     return false;
   }
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     {
       base::AutoLock locker(lock_);
@@ -112,7 +112,7 @@
 
   // Protect |tasks_|.
   base::Lock lock_;
-  std::queue<base::Closure> tasks_;
+  std::queue<base::OnceClosure> tasks_;
 
   DISALLOW_COPY_AND_ASSIGN(TestTaskRunner);
 };
diff --git a/net/quic/chromium/test_task_runner.cc b/net/quic/chromium/test_task_runner.cc
index eee1ad76..6ff86e5 100644
--- a/net/quic/chromium/test_task_runner.cc
+++ b/net/quic/chromium/test_task_runner.cc
@@ -18,7 +18,7 @@
 TestTaskRunner::~TestTaskRunner() {}
 
 bool TestTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here,
-                                     base::Closure task,
+                                     base::OnceClosure task,
                                      base::TimeDelta delay) {
   EXPECT_GE(delay, base::TimeDelta());
   tasks_.push_back(PostedTask(from_here, std::move(task), clock_->NowInTicks(),
diff --git a/net/quic/chromium/test_task_runner.h b/net/quic/chromium/test_task_runner.h
index a7d72e207..0c6478e1 100644
--- a/net/quic/chromium/test_task_runner.h
+++ b/net/quic/chromium/test_task_runner.h
@@ -28,7 +28,7 @@
 
   // base::TaskRunner implementation.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
diff --git a/remoting/base/auto_thread_task_runner.cc b/remoting/base/auto_thread_task_runner.cc
index be997110..552b985 100644
--- a/remoting/base/auto_thread_task_runner.cc
+++ b/remoting/base/auto_thread_task_runner.cc
@@ -12,14 +12,14 @@
 
 AutoThreadTaskRunner::AutoThreadTaskRunner(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    base::Closure stop_task)
+    base::OnceClosure stop_task)
     : stop_task_(std::move(stop_task)), task_runner_(task_runner) {
   DCHECK(!stop_task_.is_null());
 }
 
 bool AutoThreadTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   CHECK(task_runner_->PostDelayedTask(from_here, std::move(task), delay));
   return true;
@@ -27,7 +27,7 @@
 
 bool AutoThreadTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   CHECK(task_runner_->PostNonNestableDelayedTask(from_here, std::move(task),
                                                  delay));
diff --git a/remoting/base/auto_thread_task_runner.h b/remoting/base/auto_thread_task_runner.h
index 39e8f3c..f29173e 100644
--- a/remoting/base/auto_thread_task_runner.h
+++ b/remoting/base/auto_thread_task_runner.h
@@ -23,14 +23,14 @@
   // |stop_task| is posted to |task_runner| when the last reference to
   // the AutoThreadTaskRunner is dropped.
   AutoThreadTaskRunner(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-                       base::Closure stop_task);
+                       base::OnceClosure stop_task);
 
   // SingleThreadTaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
@@ -42,7 +42,7 @@
   ~AutoThreadTaskRunner() override;
 
   // Task posted to |task_runner_| to notify the caller that it may be stopped.
-  base::Closure stop_task_;
+  base::OnceClosure stop_task_;
 
   // The wrapped task runner.
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
diff --git a/remoting/client/plugin/pepper_main_thread_task_runner.cc b/remoting/client/plugin/pepper_main_thread_task_runner.cc
index 8f3ca24..c350566 100644
--- a/remoting/client/plugin/pepper_main_thread_task_runner.cc
+++ b/remoting/client/plugin/pepper_main_thread_task_runner.cc
@@ -17,8 +17,9 @@
 namespace {
 
 void RunAndDestroy(void* task_ptr, int32_t) {
-  std::unique_ptr<base::Closure> task(static_cast<base::Closure*>(task_ptr));
-  task->Run();
+  std::unique_ptr<base::OnceClosure> task(
+      static_cast<base::OnceClosure*>(task_ptr));
+  std::move(*task).Run();
 }
 
 }  // namespace
@@ -31,9 +32,9 @@
 
 bool PepperMainThreadTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
-  auto task_ptr = base::MakeUnique<base::Closure>(base::Bind(
+  auto task_ptr = base::MakeUnique<base::OnceClosure>(base::Bind(
       &PepperMainThreadTaskRunner::RunTask, weak_ptr_, base::Passed(&task)));
   core_->CallOnMainThread(
       delay.InMillisecondsRoundedUp(),
@@ -43,7 +44,7 @@
 
 bool PepperMainThreadTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return PostDelayedTask(from_here, std::move(task), delay);
 }
@@ -54,7 +55,7 @@
 
 PepperMainThreadTaskRunner::~PepperMainThreadTaskRunner() {}
 
-void PepperMainThreadTaskRunner::RunTask(base::Closure task) {
+void PepperMainThreadTaskRunner::RunTask(base::OnceClosure task) {
   std::move(task).Run();
 }
 
diff --git a/remoting/client/plugin/pepper_main_thread_task_runner.h b/remoting/client/plugin/pepper_main_thread_task_runner.h
index 320d8f5..7cc953f9 100644
--- a/remoting/client/plugin/pepper_main_thread_task_runner.h
+++ b/remoting/client/plugin/pepper_main_thread_task_runner.h
@@ -27,10 +27,10 @@
 
   // base::SingleThreadTaskRunner interface.
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
 
@@ -40,7 +40,7 @@
  private:
   // Helper that allows a base::Closure to be used as a pp::CompletionCallback,
   // by ignoring the completion result.
-  void RunTask(base::Closure task);
+  void RunTask(base::OnceClosure task);
 
   pp::Core* core_;
 
diff --git a/third_party/WebKit/Source/platform/WebTaskRunner.h b/third_party/WebKit/Source/platform/WebTaskRunner.h
index 1dda249..e35fa389 100644
--- a/third_party/WebKit/Source/platform/WebTaskRunner.h
+++ b/third_party/WebKit/Source/platform/WebTaskRunner.h
@@ -62,7 +62,7 @@
   // Schedule a task to be run after |delayMs| on the the associated WebThread.
   // Can be called from any thread.
   virtual void postDelayedTask(const WebTraceLocation&,
-                               base::Closure,
+                               base::OnceClosure,
                                double delayMs) = 0;
 
   // Returns true if the current thread is a thread on which a task may be run.
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
index f0758ba..b34de09 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
@@ -119,7 +119,7 @@
 }
 
 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from,
-                          base::Closure task,
+                          base::OnceClosure task,
                           base::TimeTicks desired_run_time,
                           EnqueueOrder sequence_number,
                           bool nestable)
@@ -132,7 +132,7 @@
 }
 
 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from,
-                          base::Closure task,
+                          base::OnceClosure task,
                           base::TimeTicks desired_run_time,
                           EnqueueOrder sequence_number,
                           bool nestable,
@@ -194,7 +194,7 @@
 }
 
 bool TaskQueueImpl::PostDelayedTask(const tracked_objects::Location& from_here,
-                                    base::Closure task,
+                                    base::OnceClosure task,
                                     base::TimeDelta delay) {
   if (delay.is_zero())
     return PostImmediateTaskImpl(from_here, std::move(task), TaskType::NORMAL);
@@ -205,7 +205,7 @@
 
 bool TaskQueueImpl::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   if (delay.is_zero())
     return PostImmediateTaskImpl(from_here, std::move(task),
@@ -217,7 +217,7 @@
 
 bool TaskQueueImpl::PostImmediateTaskImpl(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     TaskType task_type) {
   DCHECK(task);
   base::AutoLock lock(any_thread_lock_);
@@ -235,7 +235,7 @@
 
 bool TaskQueueImpl::PostDelayedTaskImpl(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay,
     TaskType task_type) {
   DCHECK(task);
@@ -332,7 +332,7 @@
 
 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked(
     const tracked_objects::Location& posted_from,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeTicks desired_run_time,
     EnqueueOrder sequence_number,
     bool nestable) {
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
index a50de15..b786e22 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
@@ -69,13 +69,13 @@
    public:
     Task();
     Task(const tracked_objects::Location& posted_from,
-         base::Closure task,
+         base::OnceClosure task,
          base::TimeTicks desired_run_time,
          EnqueueOrder sequence_number,
          bool nestable);
 
     Task(const tracked_objects::Location& posted_from,
-         base::Closure task,
+         base::OnceClosure task,
          base::TimeTicks desired_run_time,
          EnqueueOrder sequence_number,
          bool nestable,
@@ -131,10 +131,10 @@
   void UnregisterTaskQueue() override;
   bool RunsTasksOnCurrentThread() const override;
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   std::unique_ptr<QueueEnabledVoter> CreateQueueEnabledVoter() override;
   bool IsQueueEnabled() const override;
@@ -283,10 +283,10 @@
   ~TaskQueueImpl() override;
 
   bool PostImmediateTaskImpl(const tracked_objects::Location& from_here,
-                             base::Closure task,
+                             base::OnceClosure task,
                              TaskType task_type);
   bool PostDelayedTaskImpl(const tracked_objects::Location& from_here,
-                           base::Closure task,
+                           base::OnceClosure task,
                            base::TimeDelta delay,
                            TaskType task_type);
 
@@ -308,7 +308,7 @@
   // empty.
   void PushOntoImmediateIncomingQueueLocked(
       const tracked_objects::Location& posted_from,
-      base::Closure task,
+      base::OnceClosure task,
       base::TimeTicks desired_run_time,
       EnqueueOrder sequence_number,
       bool nestable);
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.cc
index 0893006..b22d977 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.cc
@@ -30,14 +30,14 @@
 
 bool TaskQueueManagerDelegateForTest::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostDelayedTask(from_here, std::move(task), delay);
 }
 
 bool TaskQueueManagerDelegateForTest::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostNonNestableDelayedTask(from_here, std::move(task),
                                                   delay);
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.h b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.h
index 6ac74f8..81495a4 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.h
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_delegate_for_test.h
@@ -23,10 +23,10 @@
 
   // NestableSingleThreadTaskRunner implementation
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
   bool IsNested() const override;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
index 345a443b..a86fafd6 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/compositor_worker_scheduler.cc
@@ -29,13 +29,13 @@
   }
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     return task_runner_->PostDelayedTask(from_here, std::move(task), delay);
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     return task_runner_->PostNonNestableDelayedTask(from_here, std::move(task),
                                                     delay);
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.cc b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.cc
index ad6fa03..e296540 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.cc
@@ -41,14 +41,14 @@
 
 bool SchedulerTqmDelegateForTest::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostDelayedTask(from_here, std::move(task), delay);
 }
 
 bool SchedulerTqmDelegateForTest::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return task_runner_->PostNonNestableDelayedTask(from_here, std::move(task),
                                                   delay);
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.h b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.h
index 445d7aa..5946dbc 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_for_test.h
@@ -28,10 +28,10 @@
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
   void RestoreDefaultTaskRunner() override;
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
   bool IsNested() const override;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.cc
index 8425c34..007dd53 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.cc
@@ -40,7 +40,7 @@
 
 bool SchedulerTqmDelegateImpl::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return message_loop_task_runner_->PostDelayedTask(from_here, std::move(task),
                                                     delay);
@@ -48,7 +48,7 @@
 
 bool SchedulerTqmDelegateImpl::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return message_loop_task_runner_->PostNonNestableDelayedTask(
       from_here, std::move(task), delay);
diff --git a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.h b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.h
index b8308a7..b043ff4 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.h
@@ -29,10 +29,10 @@
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
   void RestoreDefaultTaskRunner() override;
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
   bool IsNested() const override;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc
index f340294..b9d79069 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc
@@ -22,7 +22,7 @@
 }
 
 void WebTaskRunnerImpl::postDelayedTask(const WebTraceLocation& location,
-                                        base::Closure task,
+                                        base::OnceClosure task,
                                         double delayMs) {
   DCHECK_GE(delayMs, 0.0) << location.function_name() << " "
                           << location.file_name();
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h
index fe21732..fbc49c26 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h
@@ -24,7 +24,7 @@
 
   // WebTaskRunner implementation:
   void postDelayedTask(const WebTraceLocation&,
-                       base::Closure,
+                       base::OnceClosure,
                        double delayMs) override;
   bool runsTasksOnCurrentThread() override;
   double virtualTimeSeconds() const override;
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 57f06be..682decb 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
@@ -19,11 +19,12 @@
  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()));
+  void PostTask(base::OnceClosure task, base::TimeDelta delay) {
+    task_queue_.push_back(
+        std::make_pair(std::move(task), time_ + delay.InSecondsF()));
   }
 
-  using QueueItem = std::pair<base::Closure, double>;
+  using QueueItem = std::pair<base::OnceClosure, double>;
   std::deque<QueueItem>::iterator FindRunnableTask() {
     // TODO(tkent): This should return an item which has the minimum |second|.
     return std::find_if(
@@ -47,14 +48,14 @@
   explicit BaseTaskRunner(PassRefPtr<Data> data) : data_(std::move(data)) {}
 
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override {
     data_->PostTask(std::move(task), delay);
     return true;
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override {
     data_->PostTask(std::move(task), delay);
     return true;
@@ -82,7 +83,7 @@
 }
 
 void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&,
-                                        base::Closure closure,
+                                        base::OnceClosure closure,
                                         double delay_ms) {
   data_->PostTask(std::move(closure),
                   base::TimeDelta::FromMillisecondsD(delay_ms));
@@ -108,7 +109,7 @@
   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()).first;
+    base::OnceClosure task = std::move(data_->task_queue_.front()).first;
     data_->task_queue_.pop_front();
     std::move(task).Run();
   }
@@ -118,13 +119,13 @@
   data_->time_ += delta_seconds;
   for (auto it = data_->FindRunnableTask(); it != data_->task_queue_.end();
        it = data_->FindRunnableTask()) {
-    base::Closure task = std::move(*it).first;
+    base::OnceClosure task = std::move(*it).first;
     data_->task_queue_.erase(it);
-    task.Run();
+    std::move(task).Run();
   }
 }
 
-std::deque<std::pair<base::Closure, double>>
+std::deque<std::pair<base::OnceClosure, double>>
 FakeWebTaskRunner::takePendingTasksForTesting() {
   return std::move(data_->task_queue_);
 }
diff --git a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h
index 192ec09..ce82ab2 100644
--- a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h
+++ b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h
@@ -25,7 +25,9 @@
   void setTime(double new_time);
 
   // WebTaskRunner implementation:
-  void postDelayedTask(const WebTraceLocation&, base::Closure, double) override;
+  void postDelayedTask(const WebTraceLocation&,
+                       base::OnceClosure,
+                       double) override;
   bool runsTasksOnCurrentThread() override;
   double virtualTimeSeconds() const override;
   double monotonicallyIncreasingVirtualTimeSeconds() const override;
@@ -33,7 +35,7 @@
 
   void runUntilIdle();
   void advanceTimeAndRun(double delta_seconds);
-  std::deque<std::pair<base::Closure, double>> takePendingTasksForTesting();
+  std::deque<std::pair<base::OnceClosure, double>> takePendingTasksForTesting();
 
  private:
   ~FakeWebTaskRunner() override;
diff --git a/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.cc b/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.cc
index c089abf2..bd41c59f 100644
--- a/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.cc
+++ b/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.cc
@@ -68,7 +68,7 @@
 
 bool LazySchedulerMessageLoopDelegateForTests::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   EnsureMessageLoop();
   return original_task_runner_->PostDelayedTask(from_here, std::move(task),
@@ -77,7 +77,7 @@
 
 bool LazySchedulerMessageLoopDelegateForTests::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   EnsureMessageLoop();
   return original_task_runner_->PostNonNestableDelayedTask(
diff --git a/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.h b/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.h
index 6044dc6..bdbd746 100644
--- a/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.h
+++ b/third_party/WebKit/Source/platform/scheduler/test/lazy_scheduler_message_loop_delegate_for_tests.h
@@ -32,10 +32,10 @@
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
   void RestoreDefaultTaskRunner() override;
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
   bool RunsTasksOnCurrentThread() const override;
   bool IsNested() const override;
diff --git a/ui/accelerated_widget_mac/window_resize_helper_mac.cc b/ui/accelerated_widget_mac/window_resize_helper_mac.cc
index 2c999b8..88bf682a 100644
--- a/ui/accelerated_widget_mac/window_resize_helper_mac.cc
+++ b/ui/accelerated_widget_mac/window_resize_helper_mac.cc
@@ -32,7 +32,7 @@
 // yet, to avoid running them twice.
 class WrappedTask {
  public:
-  WrappedTask(base::Closure closure, base::TimeDelta delay);
+  WrappedTask(base::OnceClosure closure, base::TimeDelta delay);
   ~WrappedTask();
   bool ShouldRunBefore(const WrappedTask& other);
   void Run();
@@ -41,7 +41,7 @@
   const base::TimeTicks& can_run_time() const { return can_run_time_; }
 
  private:
-  base::Closure closure_;
+  base::OnceClosure closure_;
   base::TimeTicks can_run_time_;
   bool has_run_;
   uint64_t sequence_number_;
@@ -74,11 +74,11 @@
 
   // base::SingleThreadTaskRunner implementation:
   bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::Closure task,
+                       base::OnceClosure task,
                        base::TimeDelta delay) override;
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::Closure task,
+                                  base::OnceClosure task,
                                   base::TimeDelta delay) override;
 
   bool RunsTasksOnCurrentThread() const override;
@@ -114,7 +114,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 // WrappedTask
 
-WrappedTask::WrappedTask(base::Closure closure, base::TimeDelta delay)
+WrappedTask::WrappedTask(base::OnceClosure closure, base::TimeDelta delay)
     : closure_(std::move(closure)),
       can_run_time_(base::TimeTicks::Now() + delay),
       has_run_(false),
@@ -260,7 +260,7 @@
 
 bool PumpableTaskRunner::PostDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   return EnqueueAndPostWrappedTask(
       from_here, new WrappedTask(std::move(task), delay), delay);
@@ -268,7 +268,7 @@
 
 bool PumpableTaskRunner::PostNonNestableDelayedTask(
     const tracked_objects::Location& from_here,
-    base::Closure task,
+    base::OnceClosure task,
     base::TimeDelta delay) {
   // The correctness of non-nestable events hasn't been proven for this
   // structure.