Use CompletionOnceCallback in struct WaitingForRead.

Since CompletionOnceCallback is non-copyable, therefore WaitingForRead
becomes non-copyable.  This Cl adds a move constructor so that
WaitingForRead can be put in a std::map.

Bug: 807724
Change-Id: I57dce65d46626ce0c39cd3e2e738ad9d6979165c
Reviewed-on: https://chromium-review.googlesource.com/1156862
Reviewed-by: Ryan Hamilton <rch@chromium.org>
Commit-Queue: Bence Béky <bnc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#579961}
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index 1ab3fbb..2ccc30a2 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -66,7 +66,7 @@
   // with the data returned from that read.
   if (next_state_ != State::NONE) {
     WaitingForRead read_info(buf, buf_len, callback);
-    waiting_for_read_.insert(std::make_pair(transaction, read_info));
+    waiting_for_read_.insert(std::make_pair(transaction, std::move(read_info)));
     return ERR_IO_PENDING;
   }
 
@@ -305,19 +305,18 @@
 HttpCache::Writers::WaitingForRead::WaitingForRead(
     scoped_refptr<IOBuffer> buf,
     int len,
-    const CompletionCallback& consumer_callback)
+    CompletionOnceCallback consumer_callback)
     : read_buf(std::move(buf)),
       read_buf_len(len),
       write_len(0),
-      callback(consumer_callback) {
+      callback(std::move(consumer_callback)) {
   DCHECK(read_buf);
   DCHECK_GT(len, 0);
-  DCHECK(!consumer_callback.is_null());
+  DCHECK(!callback.is_null());
 }
 
 HttpCache::Writers::WaitingForRead::~WaitingForRead() = default;
-HttpCache::Writers::WaitingForRead::WaitingForRead(const WaitingForRead&) =
-    default;
+HttpCache::Writers::WaitingForRead::WaitingForRead(WaitingForRead&&) = default;
 
 int HttpCache::Writers::DoLoop(int result) {
   DCHECK_NE(State::UNSET, next_state_);
@@ -534,7 +533,8 @@
 
     // Post task to notify transaction.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(it->second.callback, callback_result));
+        FROM_HERE,
+        base::BindOnce(std::move(it->second.callback), callback_result));
 
     it = waiting_for_read_.erase(it);
 
diff --git a/net/http/http_cache_writers.h b/net/http/http_cache_writers.h
index 86eeed1f..f92f51c9 100644
--- a/net/http/http_cache_writers.h
+++ b/net/http/http_cache_writers.h
@@ -11,6 +11,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/http/http_cache.h"
 
 namespace net {
@@ -164,12 +165,12 @@
     scoped_refptr<IOBuffer> read_buf;
     int read_buf_len;
     int write_len;
-    const CompletionCallback callback;
+    CompletionOnceCallback callback;
     WaitingForRead(scoped_refptr<IOBuffer> read_buf,
                    int len,
-                   const CompletionCallback& consumer_callback);
+                   CompletionOnceCallback consumer_callback);
     ~WaitingForRead();
-    WaitingForRead(const WaitingForRead&);
+    WaitingForRead(WaitingForRead&&);
   };
   using WaitingForReadMap = std::map<Transaction*, WaitingForRead>;