Use CompletionOnceCallback in //net/proxy_resolution.

Change most of arguments of type CompletionCallback by constant reference to
CompletionOnceCallback by value, and change most const or non-const
CompletionCallback type members to non-const CompletionOnceCallback in
//net/proxy_resolution, and in some other places as necessary.  This is part of
//the larger transition effort described on the bug.

In addition to changing type, also:
* avoid move to local variable when unnecessary;
* remove unused MockAsyncProxyResolver::callback() method;
* inline ProxyResolutionService::InitProxyResolver::DoCallback() and
  PacFileDecider::DoCallback(), both only called once;
* include completion_callback.h in //chromeos where
  CompletionCallback is used but was only transitively included.

Bug: 807724
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_mojo
Change-Id: Ib9e08f54988abb6655f2efd68fc6169ff12e9b20
Reviewed-on: https://chromium-review.googlesource.com/1066291
Reviewed-by: Steven Bennetts <[email protected]>
Reviewed-by: Eric Roman <[email protected]>
Reviewed-by: Scott Graham <[email protected]>
Commit-Queue: Bence Béky <[email protected]>
Cr-Commit-Position: refs/heads/master@{#561992}
diff --git a/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc b/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc
index a44b973..3de36e03 100644
--- a/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc
+++ b/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc
@@ -61,7 +61,7 @@
   // net::ProxyResolver:
   int GetProxyForURL(const GURL& url,
                      net::ProxyInfo* results,
-                     const net::CompletionCallback& callback,
+                     net::CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const net::NetLogWithSource& net_log) override {
     CHECK(network_task_runner_->BelongsToCurrentThread());
@@ -70,7 +70,7 @@
       return result_;
 
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(callback, result_));
+        FROM_HERE, base::BindOnce(std::move(callback), result_));
     return net::ERR_IO_PENDING;
   }
 
@@ -103,7 +103,7 @@
   // net::ProxyResolverFactory:
   int CreateProxyResolver(const scoped_refptr<net::PacFileData>& pac_script,
                           std::unique_ptr<net::ProxyResolver>* resolver,
-                          const net::CompletionCallback& callback,
+                          net::CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     *resolver = std::make_unique<net::ForwardingProxyResolver>(resolver_);
     return net::OK;
diff --git a/chromeos/network/dhcp_pac_file_fetcher_chromeos.cc b/chromeos/network/dhcp_pac_file_fetcher_chromeos.cc
index 4605b22..1830c3d 100644
--- a/chromeos/network/dhcp_pac_file_fetcher_chromeos.cc
+++ b/chromeos/network/dhcp_pac_file_fetcher_chromeos.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/network/dhcp_pac_file_fetcher_chromeos.h"
 
+#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/task_runner_util.h"
 #include "chromeos/network/network_event_log.h"
@@ -44,7 +45,7 @@
 
 int DhcpPacFileFetcherChromeos::Fetch(
     base::string16* utf16_text,
-    const net::CompletionCallback& callback,
+    net::CompletionOnceCallback callback,
     const net::NetLogWithSource& net_log,
     const net::NetworkTrafficAnnotationTag traffic_annotation) {
   if (!network_handler_task_runner_.get())
@@ -52,10 +53,10 @@
   CHECK(!callback.is_null());
   base::PostTaskAndReplyWithResult(
       network_handler_task_runner_.get(), FROM_HERE,
-      base::Bind(&GetPacUrlFromDefaultNetwork),
-      base::Bind(&DhcpPacFileFetcherChromeos::ContinueFetch,
-                 weak_ptr_factory_.GetWeakPtr(), utf16_text, callback,
-                 traffic_annotation));
+      base::BindOnce(&GetPacUrlFromDefaultNetwork),
+      base::BindOnce(&DhcpPacFileFetcherChromeos::ContinueFetch,
+                     weak_ptr_factory_.GetWeakPtr(), utf16_text,
+                     std::move(callback), traffic_annotation));
   return net::ERR_IO_PENDING;
 }
 
@@ -79,19 +80,22 @@
 
 void DhcpPacFileFetcherChromeos::ContinueFetch(
     base::string16* utf16_text,
-    net::CompletionCallback callback,
+    net::CompletionOnceCallback callback,
     const net::NetworkTrafficAnnotationTag traffic_annotation,
     std::string pac_url) {
   NET_LOG_EVENT("DhcpPacFileFetcher", pac_url);
   pac_url_ = GURL(pac_url);
   if (pac_url_.is_empty()) {
-    callback.Run(net::ERR_PAC_NOT_IN_DHCP);
+    std::move(callback).Run(net::ERR_PAC_NOT_IN_DHCP);
     return;
   }
-  int res = pac_file_fetcher_->Fetch(pac_url_, utf16_text, callback,
+
+  auto repeating_callback =
+      base::AdaptCallbackForRepeating(std::move(callback));
+  int res = pac_file_fetcher_->Fetch(pac_url_, utf16_text, repeating_callback,
                                      traffic_annotation);
   if (res != net::ERR_IO_PENDING)
-    callback.Run(res);
+    repeating_callback.Run(res);
 }
 
 }  // namespace chromeos
diff --git a/chromeos/network/dhcp_pac_file_fetcher_chromeos.h b/chromeos/network/dhcp_pac_file_fetcher_chromeos.h
index 8cac872..cf98c4bb 100644
--- a/chromeos/network/dhcp_pac_file_fetcher_chromeos.h
+++ b/chromeos/network/dhcp_pac_file_fetcher_chromeos.h
@@ -11,6 +11,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "chromeos/chromeos_export.h"
+#include "net/base/completion_once_callback.h"
 #include "net/proxy_resolution/dhcp_pac_file_fetcher.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
@@ -39,7 +40,7 @@
 
   // net::DhcpPacFileFetcher
   int Fetch(base::string16* utf16_text,
-            const net::CompletionCallback& callback,
+            net::CompletionOnceCallback callback,
             const net::NetLogWithSource& net_log,
             const net::NetworkTrafficAnnotationTag traffic_annotation) override;
   void Cancel() override;
@@ -49,7 +50,7 @@
 
  private:
   void ContinueFetch(base::string16* utf16_text,
-                     net::CompletionCallback callback,
+                     net::CompletionOnceCallback callback,
                      const net::NetworkTrafficAnnotationTag traffic_annotation,
                      std::string pac_url);
 
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 973e3d9..6d0f47ee 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -265,7 +265,7 @@
   // ProxyResolverFactory override.
   int CreateProxyResolver(const scoped_refptr<PacFileData>& script_data,
                           std::unique_ptr<ProxyResolver>* result,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     return ERR_PAC_SCRIPT_FAILED;
   }
@@ -4514,7 +4514,7 @@
   // ProxyResolver implementation.
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& /*net_log*/) override {
     *results = ProxyInfo();
@@ -4552,7 +4552,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     *resolver = std::make_unique<SameProxyWithDifferentSchemesProxyResolver>();
     return OK;
@@ -12128,7 +12128,7 @@
 
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override {
     ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
@@ -12153,7 +12153,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const net::CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     *resolver = std::make_unique<ForwardingProxyResolver>(resolver_);
     return OK;
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc
index b499032..d19d41c 100644
--- a/net/http/http_stream_factory_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/platform_thread.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/test_proxy_delegate.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_basic_stream.h"
@@ -87,7 +88,7 @@
   // ProxyResolverFactory override.
   int CreateProxyResolver(const scoped_refptr<PacFileData>& script_data,
                           std::unique_ptr<ProxyResolver>* result,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     return ERR_PAC_SCRIPT_FAILED;
   }
diff --git a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc
index d6515969..b035f26 100644
--- a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc
+++ b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc
@@ -49,14 +49,14 @@
 
 void DhcpPacFileAdapterFetcher::Fetch(
     const std::string& adapter_name,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     const NetworkTrafficAnnotationTag traffic_annotation) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK_EQ(state_, STATE_START);
   result_ = ERR_IO_PENDING;
   pac_script_ = base::string16();
   state_ = STATE_WAIT_DHCP;
-  callback_ = callback;
+  callback_ = std::move(callback);
 
   wait_timer_.Start(FROM_HERE, ImplGetTimeout(), this,
                     &DhcpPacFileAdapterFetcher::OnTimeout);
@@ -182,12 +182,10 @@
 void DhcpPacFileAdapterFetcher::TransitionToFinish() {
   DCHECK(state_ == STATE_WAIT_DHCP || state_ == STATE_WAIT_URL);
   state_ = STATE_FINISH;
-  CompletionCallback callback = callback_;
-  callback_.Reset();
 
   // Be careful not to touch any member state after this, as the client
   // may delete us during this callback.
-  callback.Run(result_);
+  std::move(callback_).Run(result_);
 }
 
 DhcpPacFileAdapterFetcher::State DhcpPacFileAdapterFetcher::state() const {
diff --git a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.h b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.h
index 4d84aef..512f532 100644
--- a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.h
+++ b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.h
@@ -16,7 +16,7 @@
 #include "base/strings/string16.h"
 #include "base/threading/thread_checker.h"
 #include "base/timer/timer.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
@@ -50,7 +50,7 @@
   // You may only call Fetch() once on a given instance of
   // DhcpPacFileAdapterFetcher.
   virtual void Fetch(const std::string& adapter_name,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      const NetworkTrafficAnnotationTag traffic_annotation);
 
   // Cancels the fetch on this adapter.
@@ -177,7 +177,7 @@
 
   // Callback to let our client know we're done. Invalid in states
   // START, FINISH and CANCEL.
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 
   // Fetcher to retrieve PAC files once URL is known.
   std::unique_ptr<PacFileFetcher> script_fetcher_;
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher.cc b/net/proxy_resolution/dhcp_pac_file_fetcher.cc
index 0814f961..0e2ccf3 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher.cc
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher.cc
@@ -22,7 +22,7 @@
 
 int DoNothingDhcpPacFileFetcher::Fetch(
     base::string16* utf16_text,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     const NetLogWithSource& net_log,
     const NetworkTrafficAnnotationTag traffic_annotation) {
   return ERR_NOT_IMPLEMENTED;
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher.h b/net/proxy_resolution/dhcp_pac_file_fetcher.h
index f5f9330..ee49706 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher.h
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher.h
@@ -8,7 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/pac_file_fetcher.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -60,7 +60,7 @@
   //
   // Only one fetch is allowed to be outstanding at a time.
   virtual int Fetch(base::string16* utf16_text,
-                    const CompletionCallback& callback,
+                    CompletionOnceCallback callback,
                     const NetLogWithSource& net_log,
                     const NetworkTrafficAnnotationTag traffic_annotation) = 0;
 
@@ -96,7 +96,7 @@
   ~DoNothingDhcpPacFileFetcher() override;
 
   int Fetch(base::string16* utf16_text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetLogWithSource& net_log,
             const NetworkTrafficAnnotationTag traffic_annotation) override;
   void Cancel() override;
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher_factory.h b/net/proxy_resolution/dhcp_pac_file_fetcher_factory.h
index cf520a9..832cea8 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher_factory.h
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher_factory.h
@@ -9,7 +9,6 @@
 
 #include "base/macros.h"
 #include "base/memory/singleton.h"
-#include "net/base/completion_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/dhcp_pac_file_fetcher.h"
 
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc b/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
index d8440ca..82b3e2a 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
@@ -289,7 +289,7 @@
 
 int DhcpPacFileFetcherWin::Fetch(
     base::string16* utf16_text,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     const NetLogWithSource& net_log,
     const NetworkTrafficAnnotationTag traffic_annotation) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -304,7 +304,7 @@
     return ERR_CONTEXT_SHUT_DOWN;
 
   state_ = STATE_WAIT_ADAPTERS;
-  callback_ = callback;
+  callback_ = std::move(callback);
   destination_string_ = utf16_text;
 
   net_log.BeginEvent(NetLogEventType::WPAD_DHCP_WIN_FETCH);
@@ -336,7 +336,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   // Back up callback, if there is one, as CancelImpl() will destroy it.
-  net::CompletionCallback callback = std::move(callback_);
+  net::CompletionOnceCallback callback = std::move(callback_);
 
   // Cancel current request, if there is one.
   CancelImpl();
@@ -346,7 +346,7 @@
 
   // Invoke callback with error, if present.
   if (callback)
-    callback.Run(ERR_CONTEXT_SHUT_DOWN);
+    std::move(callback).Run(ERR_CONTEXT_SHUT_DOWN);
 }
 
 void DhcpPacFileFetcherWin::CancelImpl() {
@@ -509,18 +509,17 @@
     }
   }
 
-  CompletionCallback callback = callback_;
+  CompletionOnceCallback callback = std::move(callback_);
   CancelImpl();
   DCHECK_EQ(state_, STATE_DONE);
   DCHECK(fetchers_.empty());
-  DCHECK(callback_.is_null());  // Invariant of data.
 
   net_log_.EndEvent(
       NetLogEventType::WPAD_DHCP_WIN_FETCH,
       base::Bind(&NetLogFetcherDoneCallback, used_fetcher_index, result));
 
   // We may be deleted re-entrantly within this outcall.
-  callback.Run(result);
+  std::move(callback).Run(result);
 }
 
 int DhcpPacFileFetcherWin::num_pending_fetchers() const {
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher_win.h b/net/proxy_resolution/dhcp_pac_file_fetcher_win.h
index 078b2dd..f72fc6f 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher_win.h
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher_win.h
@@ -15,6 +15,7 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/dhcp_pac_file_fetcher.h"
@@ -43,7 +44,7 @@
 
   // DhcpPacFileFetcher implementation.
   int Fetch(base::string16* utf16_text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetLogWithSource& net_log,
             const NetworkTrafficAnnotationTag traffic_annotation) override;
   void Cancel() override;
@@ -167,7 +168,7 @@
   int num_pending_fetchers_;
 
   // Lets our client know we're done. Not valid in states START or DONE.
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 
   // The NetLog to use for the current Fetch().
   NetLogWithSource net_log_;
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher_win_unittest.cc b/net/proxy_resolution/dhcp_pac_file_fetcher_win_unittest.cc
index cad7689..f8e3278 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher_win_unittest.cc
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher_win_unittest.cc
@@ -14,7 +14,6 @@
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/timer/elapsed_timer.h"
-#include "net/base/completion_callback.h"
 #include "net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.h"
 #include "net/test/gtest_util.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -221,9 +220,9 @@
         fetch_delay_ms_(1) {}
 
   void Fetch(const std::string& adapter_name,
-             const CompletionCallback& callback,
+             CompletionOnceCallback callback,
              const NetworkTrafficAnnotationTag traffic_annotation) override {
-    callback_ = callback;
+    callback_ = std::move(callback);
     timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(fetch_delay_ms_),
                  this, &DummyDhcpPacFileAdapterFetcher::OnTimer);
   }
@@ -244,9 +243,7 @@
     return pac_script_;
   }
 
-  void OnTimer() {
-    callback_.Run(result_);
-  }
+  void OnTimer() { std::move(callback_).Run(result_); }
 
   void Configure(bool did_finish,
                  int result,
@@ -263,7 +260,7 @@
   int result_;
   base::string16 pac_script_;
   int fetch_delay_ms_;
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
   base::OneShotTimer timer_;
 };
 
diff --git a/net/proxy_resolution/mock_pac_file_fetcher.cc b/net/proxy_resolution/mock_pac_file_fetcher.cc
index a4d10a4..d939a246 100644
--- a/net/proxy_resolution/mock_pac_file_fetcher.cc
+++ b/net/proxy_resolution/mock_pac_file_fetcher.cc
@@ -24,7 +24,7 @@
 int MockPacFileFetcher::Fetch(
     const GURL& url,
     base::string16* text,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     const NetworkTrafficAnnotationTag traffic_annotation) {
   DCHECK(!has_pending_request());
 
@@ -36,7 +36,7 @@
 
   // Save the caller's information, and have them wait.
   pending_request_url_ = url;
-  pending_request_callback_ = callback;
+  pending_request_callback_ = std::move(callback);
   pending_request_text_ = text;
 
   return ERR_IO_PENDING;
diff --git a/net/proxy_resolution/mock_pac_file_fetcher.h b/net/proxy_resolution/mock_pac_file_fetcher.h
index d59e3d1c..e1f1051 100644
--- a/net/proxy_resolution/mock_pac_file_fetcher.h
+++ b/net/proxy_resolution/mock_pac_file_fetcher.h
@@ -6,6 +6,7 @@
 #define NET_PROXY_MOCK_PAC_FILE_FETCHER_H_
 
 #include "base/compiler_specific.h"
+#include "net/base/completion_once_callback.h"
 #include "net/proxy_resolution/pac_file_fetcher.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
@@ -26,7 +27,7 @@
   // PacFileFetcher implementation.
   int Fetch(const GURL& url,
             base::string16* text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetworkTrafficAnnotationTag traffic_annotation) override;
   void Cancel() override;
   void OnShutdown() override;
@@ -41,7 +42,7 @@
 
  private:
   GURL pending_request_url_;
-  CompletionCallback pending_request_callback_;
+  CompletionOnceCallback pending_request_callback_;
   base::string16* pending_request_text_;
   bool waiting_for_fetch_;
   bool is_shutdown_;
diff --git a/net/proxy_resolution/mock_proxy_resolver.cc b/net/proxy_resolution/mock_proxy_resolver.cc
index b7076ead..2067d7e5 100644
--- a/net/proxy_resolution/mock_proxy_resolver.cc
+++ b/net/proxy_resolution/mock_proxy_resolver.cc
@@ -28,17 +28,20 @@
 MockAsyncProxyResolver::Job::Job(MockAsyncProxyResolver* resolver,
                                  const GURL& url,
                                  ProxyInfo* results,
-                                 const CompletionCallback& callback)
-    : resolver_(resolver), url_(url), results_(results), callback_(callback) {}
+                                 CompletionOnceCallback callback)
+    : resolver_(resolver),
+      url_(url),
+      results_(results),
+      callback_(std::move(callback)) {}
 
 MockAsyncProxyResolver::Job::~Job() = default;
 
 void MockAsyncProxyResolver::Job::CompleteNow(int rv) {
-  CompletionCallback callback = callback_;
+  CompletionOnceCallback callback = std::move(callback_);
 
   resolver_->RemovePendingJob(this);
 
-  callback.Run(rv);
+  std::move(callback).Run(rv);
 }
 
 MockAsyncProxyResolver::~MockAsyncProxyResolver() = default;
@@ -46,10 +49,10 @@
 int MockAsyncProxyResolver::GetProxyForURL(
     const GURL& url,
     ProxyInfo* results,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request,
     const NetLogWithSource& /*net_log*/) {
-  std::unique_ptr<Job> job(new Job(this, url, results, callback));
+  std::unique_ptr<Job> job(new Job(this, url, results, std::move(callback)));
 
   pending_jobs_.push_back(job.get());
   request->reset(new RequestImpl(std::move(job)));
@@ -83,11 +86,11 @@
     MockAsyncProxyResolverFactory* factory,
     const scoped_refptr<PacFileData>& script_data,
     std::unique_ptr<ProxyResolver>* resolver,
-    const CompletionCallback& callback)
+    CompletionOnceCallback callback)
     : factory_(factory),
       script_data_(script_data),
       resolver_(resolver),
-      callback_(callback) {}
+      callback_(std::move(callback)) {}
 
 MockAsyncProxyResolverFactory::Request::~Request() = default;
 
@@ -100,7 +103,7 @@
   scoped_refptr<MockAsyncProxyResolverFactory::Request> keep_alive(this);
   factory_->RemovePendingRequest(this);
   factory_ = nullptr;
-  callback_.Run(rv);
+  std::move(callback_).Run(rv);
 }
 
 void MockAsyncProxyResolverFactory::Request::CompleteNowWithForwarder(
@@ -139,10 +142,10 @@
 int MockAsyncProxyResolverFactory::CreateProxyResolver(
     const scoped_refptr<PacFileData>& pac_script,
     std::unique_ptr<ProxyResolver>* resolver,
-    const net::CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<ProxyResolverFactory::Request>* request_handle) {
   scoped_refptr<Request> request =
-      new Request(this, pac_script, resolver, callback);
+      new Request(this, pac_script, resolver, std::move(callback));
   pending_requests_.push_back(request);
 
   request_handle->reset(new Job(request));
@@ -170,10 +173,11 @@
 
 int ForwardingProxyResolver::GetProxyForURL(const GURL& query_url,
                                             ProxyInfo* results,
-                                            const CompletionCallback& callback,
+                                            CompletionOnceCallback callback,
                                             std::unique_ptr<Request>* request,
                                             const NetLogWithSource& net_log) {
-  return impl_->GetProxyForURL(query_url, results, callback, request, net_log);
+  return impl_->GetProxyForURL(query_url, results, std::move(callback), request,
+                               net_log);
 }
 
 }  // namespace net
diff --git a/net/proxy_resolution/mock_proxy_resolver.h b/net/proxy_resolution/mock_proxy_resolver.h
index 9270a5f..7a4cc6b 100644
--- a/net/proxy_resolution/mock_proxy_resolver.h
+++ b/net/proxy_resolution/mock_proxy_resolver.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_errors.h"
 #include "net/proxy_resolution/proxy_resolver.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
@@ -25,11 +26,10 @@
     Job(MockAsyncProxyResolver* resolver,
         const GURL& url,
         ProxyInfo* results,
-        const CompletionCallback& callback);
+        CompletionOnceCallback callback);
 
     const GURL& url() const { return url_; }
     ProxyInfo* results() const { return results_; }
-    const CompletionCallback& callback() const { return callback_; }
     MockAsyncProxyResolver* Resolver() const { return resolver_; };
 
     void CompleteNow(int rv);
@@ -40,7 +40,7 @@
     MockAsyncProxyResolver* resolver_;
     const GURL url_;
     ProxyInfo* results_;
-    CompletionCallback callback_;
+    CompletionOnceCallback callback_;
   };
 
   class RequestImpl : public ProxyResolver::Request {
@@ -61,7 +61,7 @@
   // ProxyResolver implementation.
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& /*net_log*/) override;
   const std::vector<Job*>& pending_jobs() const { return pending_jobs_; }
@@ -92,7 +92,7 @@
   int CreateProxyResolver(
       const scoped_refptr<PacFileData>& pac_script,
       std::unique_ptr<ProxyResolver>* resolver,
-      const CompletionCallback& callback,
+      CompletionOnceCallback callback,
       std::unique_ptr<ProxyResolverFactory::Request>* request) override;
 
   const RequestsList& pending_requests() const { return pending_requests_; }
@@ -113,7 +113,7 @@
   Request(MockAsyncProxyResolverFactory* factory,
           const scoped_refptr<PacFileData>& script_data,
           std::unique_ptr<ProxyResolver>* resolver,
-          const CompletionCallback& callback);
+          CompletionOnceCallback callback);
 
   const scoped_refptr<PacFileData>& script_data() const { return script_data_; }
 
@@ -137,7 +137,7 @@
   MockAsyncProxyResolverFactory* factory_;
   const scoped_refptr<PacFileData> script_data_;
   std::unique_ptr<ProxyResolver>* resolver_;
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 };
 
 // ForwardingProxyResolver forwards all requests to |impl|. |impl| must remain
@@ -149,7 +149,7 @@
   // ProxyResolver overrides.
   int GetProxyForURL(const GURL& query_url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override;
 
diff --git a/net/proxy_resolution/multi_threaded_proxy_resolver.cc b/net/proxy_resolution/multi_threaded_proxy_resolver.cc
index d8c8e83..9431ff9 100644
--- a/net/proxy_resolution/multi_threaded_proxy_resolver.cc
+++ b/net/proxy_resolution/multi_threaded_proxy_resolver.cc
@@ -118,7 +118,7 @@
   // ProxyResolver implementation:
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override;
 
@@ -159,12 +159,11 @@
     TYPE_CREATE_RESOLVER,
   };
 
-  Job(Type type, const CompletionCallback& callback)
+  Job(Type type, CompletionOnceCallback callback)
       : type_(type),
-        callback_(callback),
+        callback_(std::move(callback)),
         executor_(NULL),
-        was_cancelled_(false) {
-  }
+        was_cancelled_(false) {}
 
   void set_executor(Executor* executor) {
     executor_ = executor;
@@ -218,7 +217,7 @@
   void RunUserCallback(int result) {
     DCHECK(has_user_callback());
     // Reset the callback so has_user_callback() will now return false.
-    base::ResetAndReturn(&callback_).Run(result);
+    std::move(callback_).Run(result);
   }
 
   friend class base::RefCountedThreadSafe<Job>;
@@ -227,7 +226,7 @@
 
  private:
   const Type type_;
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
   Executor* executor_;
   bool was_cancelled_;
 };
@@ -253,7 +252,7 @@
  public:
   CreateResolverJob(const scoped_refptr<PacFileData>& script_data,
                     ProxyResolverFactory* factory)
-      : Job(TYPE_CREATE_RESOLVER, CompletionCallback()),
+      : Job(TYPE_CREATE_RESOLVER, CompletionOnceCallback()),
         script_data_(script_data),
         factory_(factory) {}
 
@@ -261,7 +260,7 @@
   void Run(scoped_refptr<base::SingleThreadTaskRunner> origin_runner) override {
     std::unique_ptr<ProxyResolverFactory::Request> request;
     int rv = factory_->CreateProxyResolver(script_data_, &resolver_,
-                                           CompletionCallback(), &request);
+                                           CompletionOnceCallback(), &request);
 
     DCHECK_NE(rv, ERR_IO_PENDING);
     origin_runner->PostTask(
@@ -295,15 +294,13 @@
   // |results|     -- the structure to fill with proxy resolve results.
   GetProxyForURLJob(const GURL& url,
                     ProxyInfo* results,
-                    const CompletionCallback& callback,
+                    CompletionOnceCallback callback,
                     const NetLogWithSource& net_log)
-      : Job(TYPE_GET_PROXY_FOR_URL, callback),
+      : Job(TYPE_GET_PROXY_FOR_URL, std::move(callback)),
         results_(results),
         net_log_(net_log),
         url_(url),
-        was_waiting_for_thread_(false) {
-    DCHECK(!callback.is_null());
-  }
+        was_waiting_for_thread_(false) {}
 
   NetLogWithSource* net_log() { return &net_log_; }
 
@@ -328,8 +325,8 @@
   void Run(scoped_refptr<base::SingleThreadTaskRunner> origin_runner) override {
     ProxyResolver* resolver = executor()->resolver();
     DCHECK(resolver);
-    int rv = resolver->GetProxyForURL(
-        url_, &results_buf_, CompletionCallback(), NULL, net_log_);
+    int rv = resolver->GetProxyForURL(url_, &results_buf_,
+                                      CompletionOnceCallback(), NULL, net_log_);
     DCHECK_NE(rv, ERR_IO_PENDING);
 
     origin_runner->PostTask(
@@ -459,14 +456,14 @@
 int MultiThreadedProxyResolver::GetProxyForURL(
     const GURL& url,
     ProxyInfo* results,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request,
     const NetLogWithSource& net_log) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!callback.is_null());
 
   scoped_refptr<GetProxyForURLJob> job(
-      new GetProxyForURLJob(url, results, callback, net_log));
+      new GetProxyForURLJob(url, results, std::move(callback), net_log));
 
   // Completion will be notified through |callback|, unless the caller cancels
   // the request using |request|.
@@ -539,14 +536,14 @@
       std::unique_ptr<ProxyResolver>* resolver,
       std::unique_ptr<ProxyResolverFactory> resolver_factory,
       size_t max_num_threads,
-      const CompletionCallback& callback)
+      CompletionOnceCallback callback)
       : factory_(factory),
         resolver_out_(resolver),
         resolver_factory_(std::move(resolver_factory)),
         max_num_threads_(max_num_threads),
         script_data_(script_data),
         executor_(new Executor(this, 0)),
-        callback_(callback) {
+        callback_(std::move(callback)) {
     executor_->StartJob(
         new CreateResolverJob(script_data_, resolver_factory_.get()));
   }
@@ -577,7 +574,7 @@
     }
     factory_->RemoveJob(this);
     factory_ = nullptr;
-    callback_.Run(error);
+    std::move(callback_).Run(error);
   }
 
   MultiThreadedProxyResolverFactory* factory_;
@@ -586,7 +583,7 @@
   const size_t max_num_threads_;
   scoped_refptr<PacFileData> script_data_;
   scoped_refptr<Executor> executor_;
-  const CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 };
 
 MultiThreadedProxyResolverFactory::MultiThreadedProxyResolverFactory(
@@ -606,11 +603,11 @@
 int MultiThreadedProxyResolverFactory::CreateProxyResolver(
     const scoped_refptr<PacFileData>& pac_script,
     std::unique_ptr<ProxyResolver>* resolver,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request) {
   std::unique_ptr<Job> job(new Job(this, pac_script, resolver,
                                    CreateProxyResolverFactory(),
-                                   max_num_threads_, callback));
+                                   max_num_threads_, std::move(callback)));
   jobs_.insert(job.get());
   *request = std::move(job);
   return ERR_IO_PENDING;
diff --git a/net/proxy_resolution/multi_threaded_proxy_resolver.h b/net/proxy_resolution/multi_threaded_proxy_resolver.h
index 8daa17ef..afaa419 100644
--- a/net/proxy_resolution/multi_threaded_proxy_resolver.h
+++ b/net/proxy_resolution/multi_threaded_proxy_resolver.h
@@ -11,6 +11,7 @@
 #include <set>
 
 #include "base/memory/ref_counted.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
 
@@ -57,7 +58,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override;
 
  private:
diff --git a/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc b/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
index d057283e..fc0ed9b 100644
--- a/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
+++ b/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
@@ -51,7 +51,7 @@
   // ProxyResolver implementation.
   int GetProxyForURL(const GURL& query_url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override {
     if (!resolve_latency_.is_zero())
@@ -128,7 +128,7 @@
 
   int GetProxyForURL(const GURL& query_url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override {
     {
@@ -146,7 +146,7 @@
     }
 
     return MockProxyResolver::GetProxyForURL(
-        query_url, results, callback, request, net_log);
+        query_url, results, std::move(callback), request, net_log);
   }
 
  private:
@@ -166,7 +166,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& script_data,
                           std::unique_ptr<ProxyResolver>* result,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     BlockableProxyResolver* resolver = new BlockableProxyResolver;
     result->reset(resolver);
@@ -703,7 +703,7 @@
   // ProxyResolverFactory override.
   int CreateProxyResolver(const scoped_refptr<PacFileData>& script_data,
                           std::unique_ptr<ProxyResolver>* result,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     return ERR_PAC_SCRIPT_FAILED;
   }
@@ -751,10 +751,10 @@
   base::RunLoop().RunUntilIdle();
 }
 
-void DeleteRequest(const CompletionCallback& callback,
+void DeleteRequest(CompletionOnceCallback callback,
                    std::unique_ptr<ProxyResolverFactory::Request>* request,
                    int result) {
-  callback.Run(result);
+  std::move(callback).Run(result);
   request->reset();
 }
 
@@ -769,8 +769,8 @@
   EXPECT_EQ(ERR_IO_PENDING,
             resolver_factory.CreateProxyResolver(
                 PacFileData::FromUTF8("pac script bytes"), &resolver,
-                base::Bind(&DeleteRequest, callback.callback(),
-                           base::Unretained(&request)),
+                base::BindOnce(&DeleteRequest, callback.callback(),
+                               base::Unretained(&request)),
                 &request));
   EXPECT_TRUE(request);
   EXPECT_THAT(callback.WaitForResult(), IsOk());
diff --git a/net/proxy_resolution/network_delegate_error_observer_unittest.cc b/net/proxy_resolution/network_delegate_error_observer_unittest.cc
index 86c730a..3bfe9ec 100644
--- a/net/proxy_resolution/network_delegate_error_observer_unittest.cc
+++ b/net/proxy_resolution/network_delegate_error_observer_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_delegate_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/net/proxy_resolution/pac_file_decider.cc b/net/proxy_resolution/pac_file_decider.cc
index db7efcfd..9eb3640 100644
--- a/net/proxy_resolution/pac_file_decider.cc
+++ b/net/proxy_resolution/pac_file_decider.cc
@@ -15,6 +15,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
+#include "net/base/completion_repeating_callback.h"
 #include "net/base/net_errors.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_event_type.h"
@@ -101,7 +102,7 @@
 int PacFileDecider::Start(const ProxyConfigWithAnnotation& config,
                           const base::TimeDelta wait_delay,
                           bool fetch_pac_bytes,
-                          const CompletionCallback& callback) {
+                          CompletionOnceCallback callback) {
   DCHECK_EQ(STATE_NONE, next_state_);
   DCHECK(!callback.is_null());
   DCHECK(config.value().HasAutomaticSettings());
@@ -127,7 +128,7 @@
 
   int rv = DoLoop(OK);
   if (rv == ERR_IO_PENDING)
-    callback_ = callback;
+    callback_ = std::move(callback);
   else
     DidComplete();
 
@@ -139,13 +140,13 @@
   if (next_state_ == STATE_NONE)
     return;
 
-  CompletionCallback callback = std::move(callback_);
+  CompletionOnceCallback callback = std::move(callback_);
 
   // Just cancel any pending work.
   Cancel();
 
   if (callback)
-    callback.Run(ERR_CONTEXT_SHUT_DOWN);
+    std::move(callback).Run(ERR_CONTEXT_SHUT_DOWN);
 }
 
 const ProxyConfigWithAnnotation& PacFileDecider::effective_config() const {
@@ -179,7 +180,7 @@
   int rv = DoLoop(result);
   if (rv != ERR_IO_PENDING) {
     DidComplete();
-    DoCallback(rv);
+    std::move(callback_).Run(rv);
   }
 }
 
@@ -227,12 +228,6 @@
   return rv;
 }
 
-void PacFileDecider::DoCallback(int result) {
-  DCHECK_NE(ERR_IO_PENDING, result);
-  DCHECK(!callback_.is_null());
-  callback_.Run(result);
-}
-
 int PacFileDecider::DoWait() {
   next_state_ = STATE_WAIT_COMPLETE;
 
@@ -273,13 +268,13 @@
   std::string host = current_pac_source().url.host();
   HostResolver::RequestInfo reqinfo(HostPortPair(host, 80));
   reqinfo.set_host_resolver_flags(HOST_RESOLVER_SYSTEM_ONLY);
-  CompletionCallback callback =
-      base::Bind(&PacFileDecider::OnIOCompletion, base::Unretained(this));
+  CompletionRepeatingCallback callback = base::BindRepeating(
+      &PacFileDecider::OnIOCompletion, base::Unretained(this));
 
   next_state_ = STATE_QUICK_CHECK_COMPLETE;
   quick_check_timer_.Start(
       FROM_HERE, base::TimeDelta::FromMilliseconds(kQuickCheckDelayMs),
-      base::Bind(callback, ERR_NAME_NOT_RESOLVED));
+      base::BindRepeating(callback, ERR_NAME_NOT_RESOLVED));
 
   HostResolver* host_resolver =
       pac_file_fetcher_->GetRequestContext()->host_resolver();
diff --git a/net/proxy_resolution/pac_file_decider.h b/net/proxy_resolution/pac_file_decider.h
index 90d5ed9..aaa0c252 100644
--- a/net/proxy_resolution/pac_file_decider.h
+++ b/net/proxy_resolution/pac_file_decider.h
@@ -16,7 +16,7 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "net/base/address_list.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/dns/host_resolver.h"
 #include "net/log/net_log_with_source.h"
@@ -79,7 +79,7 @@
   int Start(const ProxyConfigWithAnnotation& config,
             const base::TimeDelta wait_delay,
             bool fetch_pac_bytes,
-            const CompletionCallback& callback);
+            CompletionOnceCallback callback);
 
   // Shuts down any in-progress DNS requests, and cancels any ScriptFetcher
   // requests.  Does not call OnShutdown on the [Dhcp]PacFileFetcher.
@@ -131,7 +131,6 @@
 
   void OnIOCompletion(int result);
   int DoLoop(int result);
-  void DoCallback(int result);
 
   int DoWait();
   int DoWaitComplete(int result);
@@ -167,7 +166,7 @@
   PacFileFetcher* pac_file_fetcher_;
   DhcpPacFileFetcher* dhcp_pac_file_fetcher_;
 
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 
   size_t current_pac_source_index_;
 
diff --git a/net/proxy_resolution/pac_file_decider_unittest.cc b/net/proxy_resolution/pac_file_decider_unittest.cc
index e9d7e3c..917617f 100644
--- a/net/proxy_resolution/pac_file_decider_unittest.cc
+++ b/net/proxy_resolution/pac_file_decider_unittest.cc
@@ -119,7 +119,7 @@
   // PacFileFetcher implementation.
   int Fetch(const GURL& url,
             base::string16* text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetworkTrafficAnnotationTag traffic_annotation) override {
     const Rules::Rule& rule = rules_->GetRuleByUrl(url);
     int rv = rule.fetch_error;
@@ -149,7 +149,7 @@
   ~MockDhcpPacFileFetcher() override;
 
   int Fetch(base::string16* utf16_text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetLogWithSource& net_log,
             const NetworkTrafficAnnotationTag traffic_annotation) override;
   void Cancel() override;
@@ -161,7 +161,7 @@
   virtual void CompleteRequests(int result, const base::string16& script);
 
  private:
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
   base::string16* utf16_text_;
   GURL gurl_;
   DISALLOW_COPY_AND_ASSIGN(MockDhcpPacFileFetcher);
@@ -173,11 +173,11 @@
 
 int MockDhcpPacFileFetcher::Fetch(
     base::string16* utf16_text,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     const NetLogWithSource& net_log,
     const NetworkTrafficAnnotationTag traffic_annotation) {
   utf16_text_ = utf16_text;
-  callback_ = callback;
+  callback_ = std::move(callback);
   return ERR_IO_PENDING;
 }
 
@@ -196,7 +196,7 @@
 void MockDhcpPacFileFetcher::CompleteRequests(int result,
                                               const base::string16& script) {
   *utf16_text_ = script;
-  callback_.Run(result);
+  std::move(callback_).Run(result);
 }
 
 // Succeed using custom PAC script.
@@ -701,7 +701,7 @@
       : gurl_("http://dhcppac/"), expected_text_(expected_text) {}
 
   int Fetch(base::string16* utf16_text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetLogWithSource& net_log,
             const NetworkTrafficAnnotationTag traffic_annotation) override {
     *utf16_text = expected_text_;
@@ -785,10 +785,10 @@
   ~AsyncFailDhcpFetcher() override = default;
 
   int Fetch(base::string16* utf16_text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetLogWithSource& net_log,
             const NetworkTrafficAnnotationTag traffic_annotation) override {
-    callback_ = callback;
+    callback_ = std::move(callback);
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::Bind(&AsyncFailDhcpFetcher::CallbackWithFailure, AsWeakPtr()));
@@ -803,12 +803,12 @@
 
   void CallbackWithFailure() {
     if (!callback_.is_null())
-      callback_.Run(ERR_PAC_NOT_IN_DHCP);
+      std::move(callback_).Run(ERR_PAC_NOT_IN_DHCP);
   }
 
  private:
   GURL dummy_gurl_;
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 };
 
 TEST(PacFileDeciderTest, DhcpCancelledByDestructor) {
diff --git a/net/proxy_resolution/pac_file_fetcher.h b/net/proxy_resolution/pac_file_fetcher.h
index 8555563..bd0ca211 100644
--- a/net/proxy_resolution/pac_file_fetcher.h
+++ b/net/proxy_resolution/pac_file_fetcher.h
@@ -10,7 +10,7 @@
 #define NET_PROXY_PAC_FILE_FETCHER_H_
 
 #include "base/strings/string16.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
@@ -47,7 +47,7 @@
   // Only one fetch is allowed to be outstanding at a time.
   virtual int Fetch(const GURL& url,
                     base::string16* utf16_text,
-                    const CompletionCallback& callback,
+                    CompletionOnceCallback callback,
                     const NetworkTrafficAnnotationTag traffic_annotation) = 0;
 
   // Aborts the in-progress fetch (if any).
diff --git a/net/proxy_resolution/pac_file_fetcher_impl.cc b/net/proxy_resolution/pac_file_fetcher_impl.cc
index 688f32f..0201c27 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl.cc
@@ -126,7 +126,7 @@
 int PacFileFetcherImpl::Fetch(
     const GURL& url,
     base::string16* text,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     const NetworkTrafficAnnotationTag traffic_annotation) {
   // It is invalid to call Fetch() while a request is already in progress.
   DCHECK(!cur_request_.get());
@@ -175,7 +175,7 @@
                              LOAD_IGNORE_LIMITS);
 
   // Save the caller's info for notification on completion.
-  callback_ = callback;
+  callback_ = std::move(callback);
   result_text_ = text;
 
   bytes_read_so_far_.clear();
@@ -392,11 +392,11 @@
   }
 
   int result_code = result_code_;
-  CompletionCallback callback = callback_;
+  CompletionOnceCallback callback = std::move(callback_);
 
   ResetCurRequestState();
 
-  callback.Run(result_code);
+  std::move(callback).Run(result_code);
 }
 
 void PacFileFetcherImpl::ResetCurRequestState() {
diff --git a/net/proxy_resolution/pac_file_fetcher_impl.h b/net/proxy_resolution/pac_file_fetcher_impl.h
index 92d95993..448b009 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl.h
+++ b/net/proxy_resolution/pac_file_fetcher_impl.h
@@ -16,6 +16,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/pac_file_fetcher.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -67,7 +68,7 @@
   // PacFileFetcher methods:
   int Fetch(const GURL& url,
             base::string16* text,
-            const CompletionCallback& callback,
+            CompletionOnceCallback callback,
             const NetworkTrafficAnnotationTag traffic_annotation) override;
   void Cancel() override;
   URLRequestContext* GetRequestContext() const override;
@@ -131,7 +132,7 @@
   int cur_request_id_;
 
   // Callback to invoke on completion of the fetch.
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 
   // Holds the error condition that was hit on the current request, or OK.
   int result_code_;
diff --git a/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc b/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
index 600a9321..2b0b05a 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "net/base/completion_callback.h"
 #include "net/base/filename_util.h"
 #include "net/base/load_flags.h"
 #include "net/base/network_delegate_impl.h"
diff --git a/net/proxy_resolution/proxy_resolution_service.cc b/net/proxy_resolution/proxy_resolution_service.cc
index 10a2d92..ea417271 100644
--- a/net/proxy_resolution/proxy_resolution_service.cc
+++ b/net/proxy_resolution/proxy_resolution_service.cc
@@ -21,7 +21,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/base/proxy_delegate.h"
 #include "net/base/url_util.h"
@@ -218,7 +217,7 @@
   // ProxyResolver implementation.
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override {
     return ERR_NOT_IMPLEMENTED;
@@ -235,7 +234,7 @@
 
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override {
     results->UsePacString(pac_string_);
@@ -283,7 +282,7 @@
   // ProxyResolverFactory overrides.
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const net::CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     resolver->reset(new ProxyResolverNull());
     return OK;
@@ -301,7 +300,7 @@
   // ProxyResolverFactory override.
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const net::CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     resolver->reset(new ProxyResolverFromPacString(pac_string_));
     return OK;
@@ -451,7 +450,7 @@
             NetLog* net_log,
             const ProxyConfigWithAnnotation& config,
             TimeDelta wait_delay,
-            const CompletionCallback& callback) {
+            CompletionOnceCallback callback) {
     DCHECK_EQ(STATE_NONE, next_state_);
     proxy_resolver_ = proxy_resolver;
     proxy_resolver_factory_ = proxy_resolver_factory;
@@ -461,7 +460,7 @@
     decider_->set_quick_check_enabled(quick_check_enabled_);
     config_ = config;
     wait_delay_ = wait_delay;
-    callback_ = callback;
+    callback_ = std::move(callback);
 
     next_state_ = STATE_DECIDE_PAC_FILE;
     return DoLoop(OK);
@@ -477,14 +476,14 @@
                        const ProxyConfigWithAnnotation& effective_config,
                        int decider_result,
                        PacFileData* script_data,
-                       const CompletionCallback& callback) {
+                       CompletionOnceCallback callback) {
     DCHECK_EQ(STATE_NONE, next_state_);
     proxy_resolver_ = proxy_resolver;
     proxy_resolver_factory_ = proxy_resolver_factory;
 
     effective_config_ = effective_config;
     script_data_ = script_data;
-    callback_ = callback;
+    callback_ = std::move(callback);
 
     if (decider_result != OK)
       return decider_result;
@@ -603,12 +602,7 @@
     DCHECK_NE(STATE_NONE, next_state_);
     int rv = DoLoop(result);
     if (rv != ERR_IO_PENDING)
-      DoCallback(rv);
-  }
-
-  void DoCallback(int result) {
-    DCHECK_NE(ERR_IO_PENDING, result);
-    callback_.Run(result);
+      std::move(callback_).Run(result);
   }
 
   ProxyConfigWithAnnotation config_;
@@ -619,7 +613,7 @@
   ProxyResolverFactory* proxy_resolver_factory_;
   std::unique_ptr<ProxyResolverFactory::Request> create_resolver_request_;
   std::unique_ptr<ProxyResolver>* proxy_resolver_;
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
   State next_state_;
   bool quick_check_enabled_;
 
@@ -845,10 +839,10 @@
           const std::string& method,
           ProxyDelegate* proxy_delegate,
           ProxyInfo* results,
-          const CompletionCallback& user_callback,
+          CompletionOnceCallback user_callback,
           const NetLogWithSource& net_log)
       : service_(service),
-        user_callback_(user_callback),
+        user_callback_(std::move(user_callback)),
         results_(results),
         url_(url),
         method_(method),
@@ -856,7 +850,7 @@
         resolve_job_(nullptr),
         net_log_(net_log),
         creation_time_(TimeTicks::Now()) {
-    DCHECK(!user_callback.is_null());
+    DCHECK(!user_callback_.is_null());
   }
 
   // Starts the resolve proxy request.
@@ -968,9 +962,9 @@
     // Remove this completed Request from the service's pending list.
     /// (which will probably cause deletion of |this|).
     if (!user_callback_.is_null()) {
-      CompletionCallback callback = user_callback_;
+      CompletionOnceCallback callback = std::move(user_callback_);
       service_->RemovePendingRequest(this);
-      callback.Run(result_code);
+      std::move(callback).Run(result_code);
     }
   }
 
@@ -980,7 +974,7 @@
   // Outstanding requests are cancelled during ~ProxyResolutionService, so this
   // is guaranteed to be valid throughout our lifetime.
   ProxyResolutionService* service_;
-  CompletionCallback user_callback_;
+  CompletionOnceCallback user_callback_;
   ProxyInfo* results_;
   GURL url_;
   std::string method_;
@@ -1090,20 +1084,20 @@
 int ProxyResolutionService::ResolveProxy(const GURL& raw_url,
                                          const std::string& method,
                                          ProxyInfo* result,
-                                         const CompletionCallback& callback,
+                                         CompletionOnceCallback callback,
                                          Request** pac_request,
                                          ProxyDelegate* proxy_delegate,
                                          const NetLogWithSource& net_log) {
   DCHECK(!callback.is_null());
-  return ResolveProxyHelper(raw_url, method, result, callback, pac_request,
-                            proxy_delegate, net_log);
+  return ResolveProxyHelper(raw_url, method, result, std::move(callback),
+                            pac_request, proxy_delegate, net_log);
 }
 
 int ProxyResolutionService::ResolveProxyHelper(
     const GURL& raw_url,
     const std::string& method,
     ProxyInfo* result,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     Request** pac_request,
     ProxyDelegate* proxy_delegate,
     const NetLogWithSource& net_log) {
@@ -1139,7 +1133,7 @@
     return ERR_IO_PENDING;
 
   scoped_refptr<Request> req(new Request(this, url, method, proxy_delegate,
-                                         result, callback, net_log));
+                                         result, std::move(callback), net_log));
 
   if (current_state_ == STATE_READY) {
     // Start the resolve request.
@@ -1168,8 +1162,7 @@
     ProxyInfo* result,
     ProxyDelegate* proxy_delegate,
     const NetLogWithSource& net_log) {
-  CompletionCallback null_callback;
-  return ResolveProxyHelper(raw_url, method, result, null_callback,
+  return ResolveProxyHelper(raw_url, method, result, CompletionOnceCallback(),
                             nullptr /* pac_request*/, proxy_delegate,
                             net_log) == OK;
 }
diff --git a/net/proxy_resolution/proxy_resolution_service.h b/net/proxy_resolution/proxy_resolution_service.h
index 61b748a..27485a2 100644
--- a/net/proxy_resolution/proxy_resolution_service.h
+++ b/net/proxy_resolution/proxy_resolution_service.h
@@ -18,7 +18,7 @@
 #include "base/optional.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_checker.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/load_states.h"
 #include "net/base/net_export.h"
 #include "net/base/network_change_notifier.h"
@@ -151,7 +151,7 @@
   int ResolveProxy(const GURL& url,
                    const std::string& method,
                    ProxyInfo* results,
-                   const CompletionCallback& callback,
+                   CompletionOnceCallback callback,
                    Request** request,
                    ProxyDelegate* proxy_delegate,
                    const NetLogWithSource& net_log);
@@ -354,7 +354,7 @@
   int ResolveProxyHelper(const GURL& url,
                          const std::string& method,
                          ProxyInfo* results,
-                         const CompletionCallback& callback,
+                         CompletionOnceCallback callback,
                          Request** request,
                          ProxyDelegate* proxy_delegate,
                          const NetLogWithSource& net_log);
diff --git a/net/proxy_resolution/proxy_resolver.h b/net/proxy_resolution/proxy_resolver.h
index f89d3477..ea01efa5 100644
--- a/net/proxy_resolution/proxy_resolver.h
+++ b/net/proxy_resolution/proxy_resolver.h
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/load_states.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/pac_file_data.h"
@@ -45,7 +45,7 @@
   // |*request| is written to. Call request_.reset() to cancel the request
   virtual int GetProxyForURL(const GURL& url,
                              ProxyInfo* results,
-                             const CompletionCallback& callback,
+                             CompletionOnceCallback callback,
                              std::unique_ptr<Request>* request,
                              const NetLogWithSource& net_log) = 0;
 
diff --git a/net/proxy_resolution/proxy_resolver_factory.h b/net/proxy_resolution/proxy_resolver_factory.h
index ea229ae..25ae651 100644
--- a/net/proxy_resolution/proxy_resolver_factory.h
+++ b/net/proxy_resolution/proxy_resolver_factory.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/pac_file_data.h"
 
@@ -40,7 +40,7 @@
   // the ProxyResolverFactory is deleted.
   virtual int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                                   std::unique_ptr<ProxyResolver>* resolver,
-                                  const net::CompletionCallback& callback,
+                                  CompletionOnceCallback callback,
                                   std::unique_ptr<Request>* request) = 0;
 
   // The PAC script backend can be specified to the ProxyResolverFactory either
diff --git a/net/proxy_resolution/proxy_resolver_mac.cc b/net/proxy_resolution/proxy_resolver_mac.cc
index 8570f98..66aaf2a 100644
--- a/net/proxy_resolution/proxy_resolver_mac.cc
+++ b/net/proxy_resolution/proxy_resolver_mac.cc
@@ -189,7 +189,7 @@
   // ProxyResolver methods:
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override;
 
@@ -207,7 +207,7 @@
 // inspired by http://developer.apple.com/samplecode/CFProxySupportTool/
 int ProxyResolverMac::GetProxyForURL(const GURL& query_url,
                                      ProxyInfo* results,
-                                     const CompletionCallback& /*callback*/,
+                                     CompletionOnceCallback /*callback*/,
                                      std::unique_ptr<Request>* /*request*/,
                                      const NetLogWithSource& net_log) {
   base::ScopedCFTypeRef<CFStringRef> query_ref(
@@ -345,7 +345,7 @@
 int ProxyResolverFactoryMac::CreateProxyResolver(
     const scoped_refptr<PacFileData>& pac_script,
     std::unique_ptr<ProxyResolver>* resolver,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request) {
   resolver->reset(new ProxyResolverMac(pac_script));
   return OK;
diff --git a/net/proxy_resolution/proxy_resolver_mac.h b/net/proxy_resolution/proxy_resolver_mac.h
index 3577dc2..5cc49f8 100644
--- a/net/proxy_resolution/proxy_resolver_mac.h
+++ b/net/proxy_resolution/proxy_resolver_mac.h
@@ -7,6 +7,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
 #include "url/gurl.h"
@@ -23,7 +24,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override;
 
  private:
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing.cc b/net/proxy_resolution/proxy_resolver_v8_tracing.cc
index 8b96c07..cdea928 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing.cc
@@ -101,12 +101,12 @@
   // Called from origin thread.
   void StartCreateV8Resolver(const scoped_refptr<PacFileData>& script_data,
                              std::unique_ptr<ProxyResolverV8>* resolver,
-                             const CompletionCallback& callback);
+                             CompletionOnceCallback callback);
 
   // Called from origin thread.
   void StartGetProxyForURL(const GURL& url,
                            ProxyInfo* results,
-                           const CompletionCallback& callback);
+                           CompletionOnceCallback callback);
 
   // Called from origin thread.
   void Cancel();
@@ -134,7 +134,7 @@
   void CheckIsOnWorkerThread() const;
   void CheckIsOnOriginThread() const;
 
-  void SetCallback(const CompletionCallback& callback);
+  void SetCallback(CompletionOnceCallback callback);
   void ReleaseCallback();
 
   ProxyResolverV8* v8_resolver();
@@ -145,8 +145,7 @@
   void NotifyCaller(int result);
   void NotifyCallerOnOriginLoop(int result);
 
-  void Start(Operation op, bool blocking_dns,
-             const CompletionCallback& callback);
+  void Start(Operation op, bool blocking_dns, CompletionOnceCallback callback);
 
   void ExecuteBlocking();
   void ExecuteNonBlocking();
@@ -215,7 +214,7 @@
 
   // The callback to run (on the origin thread) when the Job finishes.
   // Should only be accessed from origin thread.
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
 
   // Flag to indicate whether the request has been cancelled.
   base::CancellationFlag cancelled_;
@@ -312,7 +311,7 @@
   // ProxyResolverV8Tracing overrides.
   void GetProxyForURL(const GURL& url,
                       ProxyInfo* results,
-                      const CompletionCallback& callback,
+                      CompletionOnceCallback callback,
                       std::unique_ptr<ProxyResolver::Request>* request,
                       std::unique_ptr<Bindings> bindings) override;
 
@@ -354,7 +353,7 @@
 
 void Job::StartCreateV8Resolver(const scoped_refptr<PacFileData>& script_data,
                                 std::unique_ptr<ProxyResolverV8>* resolver,
-                                const CompletionCallback& callback) {
+                                CompletionOnceCallback callback) {
   CheckIsOnOriginThread();
 
   resolver_out_ = resolver;
@@ -364,18 +363,18 @@
   // advantage to using non-blocking mode here. That is because the
   // parent ProxyResolutionService can't submit any ProxyResolve requests until
   // initialization has completed successfully!
-  Start(CREATE_V8_RESOLVER, true /*blocking*/, callback);
+  Start(CREATE_V8_RESOLVER, true /*blocking*/, std::move(callback));
 }
 
 void Job::StartGetProxyForURL(const GURL& url,
                               ProxyInfo* results,
-                              const CompletionCallback& callback) {
+                              CompletionOnceCallback callback) {
   CheckIsOnOriginThread();
 
   url_ = url;
   user_results_ = results;
 
-  Start(GET_PROXY_FOR_URL, false /*non-blocking*/, callback);
+  Start(GET_PROXY_FOR_URL, false /*non-blocking*/, std::move(callback));
 }
 
 void Job::Cancel() {
@@ -440,16 +439,15 @@
   DCHECK(origin_runner_->BelongsToCurrentThread());
 }
 
-void Job::SetCallback(const CompletionCallback& callback) {
+void Job::SetCallback(CompletionOnceCallback callback) {
   CheckIsOnOriginThread();
   DCHECK(callback_.is_null());
   (*params_->num_outstanding_callbacks)++;
-  callback_ = callback;
+  callback_ = std::move(callback);
 }
 
 void Job::ReleaseCallback() {
   CheckIsOnOriginThread();
-  DCHECK(!callback_.is_null());
   CHECK_GT(*params_->num_outstanding_callbacks, 0);
   (*params_->num_outstanding_callbacks)--;
   callback_.Reset();
@@ -497,9 +495,9 @@
     *user_results_ = results_;
   }
 
-  CompletionCallback callback = callback_;
+  CompletionOnceCallback callback = std::move(callback_);
   ReleaseCallback();
-  callback.Run(result);
+  std::move(callback).Run(result);
 
   bindings_.reset();
   owned_self_reference_ = NULL;
@@ -507,12 +505,12 @@
 
 void Job::Start(Operation op,
                 bool blocking_dns,
-                const CompletionCallback& callback) {
+                CompletionOnceCallback callback) {
   CheckIsOnOriginThread();
 
   operation_ = op;
   blocking_dns_ = blocking_dns;
-  SetCallback(callback);
+  SetCallback(std::move(callback));
 
   owned_self_reference_ = this;
 
@@ -964,7 +962,7 @@
 void ProxyResolverV8TracingImpl::GetProxyForURL(
     const GURL& url,
     ProxyInfo* results,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<ProxyResolver::Request>* request,
     std::unique_ptr<Bindings> bindings) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -974,7 +972,7 @@
 
   request->reset(new RequestImpl(job));
 
-  job->StartGetProxyForURL(url, results, callback);
+  job->StartGetProxyForURL(url, results, std::move(callback));
 }
 
 
@@ -987,7 +985,7 @@
       const scoped_refptr<PacFileData>& pac_script,
       std::unique_ptr<ProxyResolverV8Tracing::Bindings> bindings,
       std::unique_ptr<ProxyResolverV8Tracing>* resolver,
-      const CompletionCallback& callback,
+      CompletionOnceCallback callback,
       std::unique_ptr<ProxyResolverFactory::Request>* request) override;
 
  private:
@@ -1007,11 +1005,11 @@
             std::unique_ptr<ProxyResolverV8Tracing::Bindings> bindings,
             const scoped_refptr<PacFileData>& pac_script,
             std::unique_ptr<ProxyResolverV8Tracing>* resolver_out,
-            const CompletionCallback& callback)
+            CompletionOnceCallback callback)
       : factory_(factory),
         thread_(new base::Thread("Proxy Resolver")),
         resolver_out_(resolver_out),
-        callback_(callback),
+        callback_(std::move(callback)),
         num_outstanding_callbacks_(0) {
     // Start up the thread.
     base::Thread::Options options;
@@ -1058,7 +1056,7 @@
     factory_->RemoveJob(this);
     factory_ = nullptr;
     create_resolver_job_ = nullptr;
-    callback_.Run(error);
+    std::move(callback_).Run(error);
   }
 
   void StopWorkerThread() {
@@ -1073,7 +1071,7 @@
   scoped_refptr<Job> create_resolver_job_;
   std::unique_ptr<ProxyResolverV8> v8_resolver_;
   std::unique_ptr<ProxyResolverV8Tracing>* resolver_out_;
-  const CompletionCallback callback_;
+  CompletionOnceCallback callback_;
   int num_outstanding_callbacks_;
 
   DISALLOW_COPY_AND_ASSIGN(CreateJob);
@@ -1092,10 +1090,10 @@
     const scoped_refptr<PacFileData>& pac_script,
     std::unique_ptr<ProxyResolverV8Tracing::Bindings> bindings,
     std::unique_ptr<ProxyResolverV8Tracing>* resolver,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<ProxyResolverFactory::Request>* request) {
-  std::unique_ptr<CreateJob> job(
-      new CreateJob(this, std::move(bindings), pac_script, resolver, callback));
+  std::unique_ptr<CreateJob> job(new CreateJob(
+      this, std::move(bindings), pac_script, resolver, std::move(callback)));
   jobs_.insert(job.get());
   *request = std::move(job);
 }
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing.h b/net/proxy_resolution/proxy_resolver_v8_tracing.h
index 7decd2c..242a6c6d 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing.h
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/proxy_resolver.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
@@ -56,7 +57,7 @@
   // |*request|.
   virtual void GetProxyForURL(const GURL& url,
                               ProxyInfo* results,
-                              const CompletionCallback& callback,
+                              CompletionOnceCallback callback,
                               std::unique_ptr<ProxyResolver::Request>* request,
                               std::unique_ptr<Bindings> bindings) = 0;
 };
@@ -75,7 +76,7 @@
       const scoped_refptr<PacFileData>& pac_script,
       std::unique_ptr<ProxyResolverV8Tracing::Bindings> bindings,
       std::unique_ptr<ProxyResolverV8Tracing>* resolver,
-      const CompletionCallback& callback,
+      CompletionOnceCallback callback,
       std::unique_ptr<ProxyResolverFactory::Request>* request) = 0;
 
   static std::unique_ptr<ProxyResolverV8TracingFactory> Create();
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing_unittest.cc b/net/proxy_resolution/proxy_resolver_v8_tracing_unittest.cc
index d6e21f8..b49f577 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing_unittest.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_checker.h"
 #include "base/values.h"
+#include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
 #include "net/dns/host_cache.h"
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.cc b/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.cc
index cef1b8a..3dc5634 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.cc
@@ -94,7 +94,7 @@
 
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const NetLogWithSource& net_log) override;
 
@@ -120,11 +120,11 @@
 int ProxyResolverV8TracingWrapper::GetProxyForURL(
     const GURL& url,
     ProxyInfo* results,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request,
     const NetLogWithSource& net_log) {
   resolver_impl_->GetProxyForURL(
-      url, results, callback, request,
+      url, results, std::move(callback), request,
       std::make_unique<BindingsImpl>(error_observer_.get(), host_resolver_,
                                      net_log_, net_log));
   return ERR_IO_PENDING;
@@ -149,7 +149,7 @@
 int ProxyResolverFactoryV8TracingWrapper::CreateProxyResolver(
     const scoped_refptr<PacFileData>& pac_script,
     std::unique_ptr<ProxyResolver>* resolver,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request) {
   std::unique_ptr<std::unique_ptr<ProxyResolverV8Tracing>> v8_resolver(
       new std::unique_ptr<ProxyResolverV8Tracing>);
@@ -165,9 +165,10 @@
       std::make_unique<BindingsImpl>(error_observer_local, host_resolver_,
                                      net_log_, NetLogWithSource()),
       v8_resolver_local,
-      base::Bind(&ProxyResolverFactoryV8TracingWrapper::OnProxyResolverCreated,
-                 base::Unretained(this), base::Passed(&v8_resolver), resolver,
-                 callback, base::Passed(&error_observer)),
+      base::BindOnce(
+          &ProxyResolverFactoryV8TracingWrapper::OnProxyResolverCreated,
+          base::Unretained(this), base::Passed(&v8_resolver), resolver,
+          std::move(callback), base::Passed(&error_observer)),
       request);
   return ERR_IO_PENDING;
 }
@@ -175,7 +176,7 @@
 void ProxyResolverFactoryV8TracingWrapper::OnProxyResolverCreated(
     std::unique_ptr<std::unique_ptr<ProxyResolverV8Tracing>> v8_resolver,
     std::unique_ptr<ProxyResolver>* resolver,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<ProxyResolverErrorObserver> error_observer,
     int error) {
   if (error == OK) {
@@ -183,7 +184,7 @@
         std::move(*v8_resolver), net_log_, host_resolver_,
         std::move(error_observer)));
   }
-  callback.Run(error);
+  std::move(callback).Run(error);
 }
 
 }  // namespace net
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.h b/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.h
index b7423063..53f29b6 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.h
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/proxy_resolver.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
@@ -40,14 +41,14 @@
   // ProxyResolverFactory override.
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override;
 
  private:
   void OnProxyResolverCreated(
       std::unique_ptr<std::unique_ptr<ProxyResolverV8Tracing>> v8_resolver,
       std::unique_ptr<ProxyResolver>* resolver,
-      const CompletionCallback& callback,
+      CompletionOnceCallback callback,
       std::unique_ptr<ProxyResolverErrorObserver> error_observer,
       int error);
 
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper_unittest.cc b/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper_unittest.cc
index d15bd41..d3a61e6 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper_unittest.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing_wrapper_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/platform_thread.h"
 #include "base/values.h"
+#include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
 #include "net/dns/host_cache.h"
diff --git a/net/proxy_resolution/proxy_resolver_v8_unittest.cc b/net/proxy_resolution/proxy_resolver_v8_unittest.cc
index 56977d41..cbb1a80 100644
--- a/net/proxy_resolution/proxy_resolver_v8_unittest.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/proxy_resolution/pac_file_data.h"
 #include "net/proxy_resolution/proxy_info.h"
diff --git a/net/proxy_resolution/proxy_resolver_winhttp.cc b/net/proxy_resolution/proxy_resolver_winhttp.cc
index 40d46f9..82ccdb18 100644
--- a/net/proxy_resolution/proxy_resolver_winhttp.cc
+++ b/net/proxy_resolution/proxy_resolver_winhttp.cc
@@ -58,7 +58,7 @@
   // ProxyResolver implementation:
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
-                     const CompletionCallback& /*callback*/,
+                     CompletionOnceCallback /*callback*/,
                      std::unique_ptr<Request>* /*request*/,
                      const NetLogWithSource& /*net_log*/) override;
 
@@ -87,7 +87,7 @@
 
 int ProxyResolverWinHttp::GetProxyForURL(const GURL& query_url,
                                          ProxyInfo* results,
-                                         const CompletionCallback& /*callback*/,
+                                         CompletionOnceCallback /*callback*/,
                                          std::unique_ptr<Request>* /*request*/,
                                          const NetLogWithSource& /*net_log*/) {
   // If we don't have a WinHTTP session, then create a new one.
@@ -204,7 +204,7 @@
 int ProxyResolverFactoryWinHttp::CreateProxyResolver(
     const scoped_refptr<PacFileData>& pac_script,
     std::unique_ptr<ProxyResolver>* resolver,
-    const CompletionCallback& callback,
+    CompletionOnceCallback callback,
     std::unique_ptr<Request>* request) {
   resolver->reset(new ProxyResolverWinHttp(pac_script));
   return OK;
diff --git a/net/proxy_resolution/proxy_resolver_winhttp.h b/net/proxy_resolution/proxy_resolver_winhttp.h
index f76576a4..b28f61c 100644
--- a/net/proxy_resolution/proxy_resolver_winhttp.h
+++ b/net/proxy_resolution/proxy_resolver_winhttp.h
@@ -7,6 +7,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
 #include "url/gurl.h"
@@ -22,7 +23,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override;
 
  private:
diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc
index c57aa53..41c4cc3 100644
--- a/net/url_request/url_request_ftp_job_unittest.cc
+++ b/net/url_request/url_request_ftp_job_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/load_states.h"
 #include "net/base/proxy_server.h"
@@ -47,7 +48,7 @@
 
   int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
                           std::unique_ptr<ProxyResolver>* resolver,
-                          const CompletionCallback& callback,
+                          CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override {
     EXPECT_FALSE(resolver_);
     std::unique_ptr<MockAsyncProxyResolver> owned_resolver(
diff --git a/services/network/proxy_resolver_factory_mojo.cc b/services/network/proxy_resolver_factory_mojo.cc
index 3636ed6..02331a5 100644
--- a/services/network/proxy_resolver_factory_mojo.cc
+++ b/services/network/proxy_resolver_factory_mojo.cc
@@ -123,7 +123,7 @@
   // ProxyResolver implementation:
   int GetProxyForURL(const GURL& url,
                      net::ProxyInfo* results,
-                     const net::CompletionCallback& callback,
+                     net::CompletionOnceCallback callback,
                      std::unique_ptr<Request>* request,
                      const net::NetLogWithSource& net_log) override;
 
@@ -154,7 +154,7 @@
   Job(ProxyResolverMojo* resolver,
       const GURL& url,
       net::ProxyInfo* results,
-      const net::CompletionCallback& callback,
+      net::CompletionOnceCallback callback,
       const net::NetLogWithSource& net_log);
   ~Job() override;
 
@@ -173,7 +173,7 @@
 
   const GURL url_;
   net::ProxyInfo* results_;
-  net::CompletionCallback callback_;
+  net::CompletionOnceCallback callback_;
 
   SEQUENCE_CHECKER(sequence_checker_);
   mojo::Binding<proxy_resolver::mojom::ProxyResolverRequestClient> binding_;
@@ -184,7 +184,7 @@
 ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver,
                             const GURL& url,
                             net::ProxyInfo* results,
-                            const net::CompletionCallback& callback,
+                            net::CompletionOnceCallback callback,
                             const net::NetLogWithSource& net_log)
     : ClientMixin<proxy_resolver::mojom::ProxyResolverRequestClient>(
           resolver->host_resolver_,
@@ -193,7 +193,7 @@
           net_log),
       url_(url),
       results_(results),
-      callback_(callback),
+      callback_(std::move(callback)),
       binding_(this) {
   proxy_resolver::mojom::ProxyResolverRequestClientPtr client;
   binding_.Bind(mojo::MakeRequest(&client));
@@ -217,9 +217,9 @@
 
 void ProxyResolverMojo::Job::CompleteRequest(int result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  net::CompletionCallback callback = base::ResetAndReturn(&callback_);
+  net::CompletionOnceCallback callback = std::move(callback_);
   binding_.Close();
-  callback.Run(result);
+  std::move(callback).Run(result);
 }
 
 void ProxyResolverMojo::Job::ReportResult(int32_t error,
@@ -262,7 +262,7 @@
 
 int ProxyResolverMojo::GetProxyForURL(const GURL& url,
                                       net::ProxyInfo* results,
-                                      const net::CompletionCallback& callback,
+                                      net::CompletionOnceCallback callback,
                                       std::unique_ptr<Request>* request,
                                       const net::NetLogWithSource& net_log) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -270,7 +270,8 @@
   if (!mojo_proxy_resolver_ptr_)
     return net::ERR_PAC_SCRIPT_TERMINATED;
 
-  *request = std::make_unique<Job>(this, url, results, callback, net_log);
+  *request =
+      std::make_unique<Job>(this, url, results, std::move(callback), net_log);
 
   return net::ERR_IO_PENDING;
 }
@@ -290,7 +291,7 @@
   Job(ProxyResolverFactoryMojo* factory,
       const scoped_refptr<net::PacFileData>& pac_script,
       std::unique_ptr<net::ProxyResolver>* resolver,
-      const net::CompletionCallback& callback,
+      net::CompletionOnceCallback callback,
       std::unique_ptr<net::ProxyResolverErrorObserver> error_observer)
       : ClientMixin<proxy_resolver::mojom::ProxyResolverFactoryRequestClient>(
             factory->host_resolver_,
@@ -299,7 +300,7 @@
             net::NetLogWithSource()),
         factory_(factory),
         resolver_(resolver),
-        callback_(callback),
+        callback_(std::move(callback)),
         binding_(this),
         error_observer_(std::move(error_observer)) {
     proxy_resolver::mojom::ProxyResolverFactoryRequestClientPtr client;
@@ -326,12 +327,12 @@
           std::move(resolver_ptr_), factory_->host_resolver_,
           std::move(error_observer_), factory_->net_log_));
     }
-    callback_.Run(error);
+    std::move(callback_).Run(error);
   }
 
   ProxyResolverFactoryMojo* const factory_;
   std::unique_ptr<net::ProxyResolver>* resolver_;
-  const net::CompletionCallback callback_;
+  net::CompletionOnceCallback callback_;
   proxy_resolver::mojom::ProxyResolverPtr resolver_ptr_;
   mojo::Binding<proxy_resolver::mojom::ProxyResolverFactoryRequestClient>
       binding_;
@@ -356,7 +357,7 @@
 int ProxyResolverFactoryMojo::CreateProxyResolver(
     const scoped_refptr<net::PacFileData>& pac_script,
     std::unique_ptr<net::ProxyResolver>* resolver,
-    const net::CompletionCallback& callback,
+    net::CompletionOnceCallback callback,
     std::unique_ptr<net::ProxyResolverFactory::Request>* request) {
   DCHECK(resolver);
   DCHECK(request);
@@ -364,7 +365,7 @@
       pac_script->utf16().empty()) {
     return net::ERR_PAC_SCRIPT_FAILED;
   }
-  request->reset(new Job(this, pac_script, resolver, callback,
+  request->reset(new Job(this, pac_script, resolver, std::move(callback),
                          error_observer_factory_.is_null()
                              ? nullptr
                              : error_observer_factory_.Run()));
diff --git a/services/network/proxy_resolver_factory_mojo.h b/services/network/proxy_resolver_factory_mojo.h
index d924158..1f6747c2 100644
--- a/services/network/proxy_resolver_factory_mojo.h
+++ b/services/network/proxy_resolver_factory_mojo.h
@@ -12,7 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/proxy_resolution/proxy_resolver_factory.h"
 #include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
 
@@ -41,7 +41,7 @@
   // ProxyResolverFactory override.
   int CreateProxyResolver(const scoped_refptr<net::PacFileData>& pac_script,
                           std::unique_ptr<net::ProxyResolver>* resolver,
-                          const net::CompletionCallback& callback,
+                          net::CompletionOnceCallback callback,
                           std::unique_ptr<Request>* request) override;
 
  private:
diff --git a/services/proxy_resolver/proxy_resolver_factory_impl_unittest.cc b/services/proxy_resolver/proxy_resolver_factory_impl_unittest.cc
index b6f4025..e3cbcce2 100644
--- a/services/proxy_resolver/proxy_resolver_factory_impl_unittest.cc
+++ b/services/proxy_resolver/proxy_resolver_factory_impl_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/test_completion_callback.h"
 #include "net/proxy_resolution/mock_proxy_resolver.h"
 #include "net/proxy_resolution/proxy_resolver_v8_tracing.h"
@@ -39,7 +40,7 @@
   // net::ProxyResolverV8Tracing overrides.
   void GetProxyForURL(const GURL& url,
                       net::ProxyInfo* results,
-                      const net::CompletionCallback& callback,
+                      net::CompletionOnceCallback callback,
                       std::unique_ptr<net::ProxyResolver::Request>* request,
                       std::unique_ptr<Bindings> bindings) override {}
 
@@ -57,7 +58,7 @@
  public:
   struct PendingRequest {
     std::unique_ptr<net::ProxyResolverV8Tracing>* resolver;
-    net::CompletionCallback callback;
+    net::CompletionOnceCallback callback;
   };
 
   explicit TestProxyResolverFactory(net::EventWaiter<Event>* waiter)
@@ -69,7 +70,7 @@
       const scoped_refptr<net::PacFileData>& pac_script,
       std::unique_ptr<net::ProxyResolverV8Tracing::Bindings> bindings,
       std::unique_ptr<net::ProxyResolverV8Tracing>* resolver,
-      const net::CompletionCallback& callback,
+      net::CompletionOnceCallback callback,
       std::unique_ptr<net::ProxyResolverFactory::Request>* request) override {
     requests_handled_++;
     waiter_->NotifyEvent(RESOLVER_CREATED);
@@ -77,7 +78,7 @@
     EXPECT_TRUE(resolver);
     pending_request_.reset(new PendingRequest);
     pending_request_->resolver = resolver;
-    pending_request_->callback = callback;
+    pending_request_->callback = std::move(callback);
 
     ASSERT_TRUE(bindings);
 
@@ -87,7 +88,7 @@
   }
 
   size_t requests_handled() { return requests_handled_; }
-  const PendingRequest* pending_request() { return pending_request_.get(); }
+  PendingRequest* pending_request() { return pending_request_.get(); }
 
  private:
   net::EventWaiter<Event>* waiter_;
@@ -131,7 +132,9 @@
     waiter_.NotifyEvent(RESOLVER_DESTROYED);
   }
 
-  void ReportResult(int32_t error) override { create_callback_.Run(error); }
+  void ReportResult(int32_t error) override {
+    std::move(create_callback_).Run(error);
+  }
 
   void Alert(const std::string& message) override {}
 
@@ -169,7 +172,7 @@
   std::unique_ptr<base::RunLoop> service_ref_run_loop_;
 
   int instances_destroyed_ = 0;
-  net::CompletionCallback create_callback_;
+  net::CompletionOnceCallback create_callback_;
 
   net::EventWaiter<Event> waiter_;
 };
@@ -193,7 +196,7 @@
   mock_factory_->pending_request()->resolver->reset(new FakeProxyResolver(
       base::Bind(&ProxyResolverFactoryImplTest::OnFakeProxyInstanceDestroyed,
                  base::Unretained(this))));
-  mock_factory_->pending_request()->callback.Run(net::OK);
+  std::move(mock_factory_->pending_request()->callback).Run(net::OK);
   EXPECT_THAT(create_callback.WaitForResult(), IsOk());
   EXPECT_FALSE(service_ref_factory_.HasNoRefs());
 
@@ -231,7 +234,7 @@
   mock_factory_->pending_request()->resolver->reset(new FakeProxyResolver(
       base::Bind(&ProxyResolverFactoryImplTest::OnFakeProxyInstanceDestroyed,
                  base::Unretained(this))));
-  mock_factory_->pending_request()->callback.Run(net::OK);
+  std::move(mock_factory_->pending_request()->callback).Run(net::OK);
   EXPECT_THAT(create_callback.WaitForResult(), IsOk());
   EXPECT_FALSE(service_ref_factory_.HasNoRefs());
 
@@ -261,7 +264,8 @@
   net::TestCompletionCallback create_callback;
   create_callback_ = create_callback.callback();
   ASSERT_TRUE(mock_factory_->pending_request());
-  mock_factory_->pending_request()->callback.Run(net::ERR_PAC_SCRIPT_FAILED);
+  std::move(mock_factory_->pending_request()->callback)
+      .Run(net::ERR_PAC_SCRIPT_FAILED);
   EXPECT_THAT(create_callback.WaitForResult(),
               IsError(net::ERR_PAC_SCRIPT_FAILED));
 }
diff --git a/services/proxy_resolver/proxy_resolver_impl_unittest.cc b/services/proxy_resolver/proxy_resolver_impl_unittest.cc
index 129e9a39..2aa9fd99 100644
--- a/services/proxy_resolver/proxy_resolver_impl_unittest.cc
+++ b/services/proxy_resolver/proxy_resolver_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_errors.h"
 #include "net/base/proxy_server.h"
 #include "net/proxy_resolution/mock_proxy_resolver.h"
@@ -111,16 +112,17 @@
     bool cancelled = false;
     void Complete(int result) {
       DCHECK(!callback_.is_null());
-      callback_.Run(result);
-      callback_.Reset();
+      std::move(callback_).Run(result);
     }
 
     bool WasCompleted() { return callback_.is_null(); }
 
-    void SetCallback(net::CompletionCallback callback) { callback_ = callback; }
+    void SetCallback(net::CompletionOnceCallback callback) {
+      callback_ = std::move(callback);
+    }
 
    private:
-    net::CompletionCallback callback_;
+    net::CompletionOnceCallback callback_;
   };
 
   class RequestImpl : public net::ProxyResolver::Request {
@@ -152,7 +154,7 @@
   // ProxyResolverV8Tracing overrides.
   void GetProxyForURL(const GURL& url,
                       net::ProxyInfo* results,
-                      const net::CompletionCallback& callback,
+                      net::CompletionOnceCallback callback,
                       std::unique_ptr<net::ProxyResolver::Request>* request,
                       std::unique_ptr<Bindings> bindings) override;
 
@@ -170,14 +172,14 @@
 void MockProxyResolverV8Tracing::GetProxyForURL(
     const GURL& url,
     net::ProxyInfo* results,
-    const net::CompletionCallback& callback,
+    net::CompletionOnceCallback callback,
     std::unique_ptr<net::ProxyResolver::Request>* request,
     std::unique_ptr<Bindings> bindings) {
   pending_jobs_.push_back(base::WrapUnique(new Job()));
   auto* pending_job = pending_jobs_.back().get();
   pending_job->url = url;
   pending_job->results = results;
-  pending_job->SetCallback(callback);
+  pending_job->SetCallback(std::move(callback));
   request->reset(new RequestImpl(pending_job, this));
 }