[Remoting] Make OAuthTokenGetter::TokenCallback OnceCallback

This CL makes OAuthTokenGetter::TokenCallback OnceCallback so that it's
cleaner to use. It also marks
OAuthTokenGetter::CredentialsUpdatedCallback repeating callback, which
doesn't change its behavior but makes it cleaner.

Bug: 824488
Change-Id: I7b5a64c66792ac32b01d788f1e4e2895d97a393a
Reviewed-on: https://chromium-review.googlesource.com/c/1477924
Commit-Queue: Yuwei Huang <[email protected]>
Reviewed-by: Joe Downing <[email protected]>
Cr-Commit-Position: refs/heads/master@{#633930}
diff --git a/remoting/base/fake_oauth_token_getter.cc b/remoting/base/fake_oauth_token_getter.cc
index b1b21c7..4c60e6d 100644
--- a/remoting/base/fake_oauth_token_getter.cc
+++ b/remoting/base/fake_oauth_token_getter.cc
@@ -18,10 +18,10 @@
 
 FakeOAuthTokenGetter::~FakeOAuthTokenGetter() = default;
 
-void FakeOAuthTokenGetter::CallWithToken(const TokenCallback& on_access_token) {
+void FakeOAuthTokenGetter::CallWithToken(TokenCallback on_access_token) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(on_access_token, status_, user_email_, access_token_));
+      FROM_HERE, base::BindOnce(std::move(on_access_token), status_,
+                                user_email_, access_token_));
 }
 
 void FakeOAuthTokenGetter::InvalidateCache() {
diff --git a/remoting/base/fake_oauth_token_getter.h b/remoting/base/fake_oauth_token_getter.h
index 0b70a09..1966f96 100644
--- a/remoting/base/fake_oauth_token_getter.h
+++ b/remoting/base/fake_oauth_token_getter.h
@@ -20,7 +20,7 @@
   ~FakeOAuthTokenGetter() override;
 
   // OAuthTokenGetter interface.
-  void CallWithToken(const TokenCallback& on_access_token) override;
+  void CallWithToken(TokenCallback on_access_token) override;
   void InvalidateCache() override;
 
  private:
diff --git a/remoting/base/oauth_token_getter.h b/remoting/base/oauth_token_getter.h
index cd3eb58..361d01e 100644
--- a/remoting/base/oauth_token_getter.h
+++ b/remoting/base/oauth_token_getter.h
@@ -25,14 +25,13 @@
     AUTH_ERROR,
   };
 
-  // TODO(crbug.com/824488): Change to use base::OnceCallback.
-  typedef base::Callback<void(Status status,
-                              const std::string& user_email,
-                              const std::string& access_token)>
+  typedef base::OnceCallback<void(Status status,
+                                  const std::string& user_email,
+                                  const std::string& access_token)>
       TokenCallback;
 
-  typedef base::Callback<void(const std::string& user_email,
-                              const std::string& refresh_token)>
+  typedef base::RepeatingCallback<void(const std::string& user_email,
+                                       const std::string& refresh_token)>
       CredentialsUpdatedCallback;
 
   // This structure contains information required to perform authorization
@@ -87,7 +86,7 @@
 
   // Call |on_access_token| with an access token, or the failure status.
   virtual void CallWithToken(
-      const OAuthTokenGetter::TokenCallback& on_access_token) = 0;
+      OAuthTokenGetter::TokenCallback on_access_token) = 0;
 
   // Invalidates the cache, so the next CallWithToken() will get a fresh access
   // token.
diff --git a/remoting/base/oauth_token_getter_impl.cc b/remoting/base/oauth_token_getter_impl.cc
index f095ccbe..5bc231b 100644
--- a/remoting/base/oauth_token_getter_impl.cc
+++ b/remoting/base/oauth_token_getter_impl.cc
@@ -148,11 +148,11 @@
     const std::string& user_email,
     const std::string& access_token) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  base::queue<TokenCallback> callbacks(pending_callbacks_);
-  pending_callbacks_ = base::queue<TokenCallback>();
+  base::queue<TokenCallback> callbacks;
+  callbacks.swap(pending_callbacks_);
 
   while (!callbacks.empty()) {
-    callbacks.front().Run(status, user_email, access_token);
+    std::move(callbacks.front()).Run(status, user_email, access_token);
     callbacks.pop();
   }
 }
@@ -189,10 +189,10 @@
                        std::string());
 }
 
-void OAuthTokenGetterImpl::CallWithToken(const TokenCallback& on_access_token) {
+void OAuthTokenGetterImpl::CallWithToken(TokenCallback on_access_token) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (intermediate_credentials_) {
-    pending_callbacks_.push(on_access_token);
+    pending_callbacks_.push(std::move(on_access_token));
     if (!response_pending_) {
       GetOauthTokensFromAuthCode();
     }
@@ -203,13 +203,13 @@
         (!authorization_credentials_->is_service_account && !email_verified_);
 
     if (need_new_auth_token) {
-      pending_callbacks_.push(on_access_token);
+      pending_callbacks_.push(std::move(on_access_token));
       if (!response_pending_) {
         RefreshAccessToken();
       }
     } else {
-      on_access_token.Run(SUCCESS, authorization_credentials_->login,
-                          oauth_access_token_);
+      std::move(on_access_token)
+          .Run(SUCCESS, authorization_credentials_->login, oauth_access_token_);
     }
   }
 }
diff --git a/remoting/base/oauth_token_getter_impl.h b/remoting/base/oauth_token_getter_impl.h
index bdb20080..68ef1fec 100644
--- a/remoting/base/oauth_token_getter_impl.h
+++ b/remoting/base/oauth_token_getter_impl.h
@@ -42,8 +42,7 @@
   ~OAuthTokenGetterImpl() override;
 
   // OAuthTokenGetter interface.
-  void CallWithToken(
-      const OAuthTokenGetter::TokenCallback& on_access_token) override;
+  void CallWithToken(OAuthTokenGetter::TokenCallback on_access_token) override;
   void InvalidateCache() override;
 
  private:
diff --git a/remoting/base/telemetry_log_writer.cc b/remoting/base/telemetry_log_writer.cc
index 6b8e0ec..8054f9c 100644
--- a/remoting/base/telemetry_log_writer.cc
+++ b/remoting/base/telemetry_log_writer.cc
@@ -67,7 +67,7 @@
     LOG(ERROR) << "Failed to serialize log to JSON.";
     return;
   }
-  token_getter_->CallWithToken(base::BindRepeating(
+  token_getter_->CallWithToken(base::BindOnce(
       &TelemetryLogWriter::PostJsonToServer, base::Unretained(this), json));
 }
 
diff --git a/remoting/client/jni/jni_oauth_token_getter.cc b/remoting/client/jni/jni_oauth_token_getter.cc
index 3198018..ea6a1e8 100644
--- a/remoting/client/jni/jni_oauth_token_getter.cc
+++ b/remoting/client/jni/jni_oauth_token_getter.cc
@@ -37,9 +37,12 @@
       NOTREACHED();
       return;
   }
-  callback->Run(status,
-                user_email.is_null() ? "" : ConvertJavaStringToUTF8(user_email),
-                token.is_null() ? "" : ConvertJavaStringToUTF8(token));
+
+  std::string utf8_user_email =
+      user_email.is_null() ? "" : ConvertJavaStringToUTF8(user_email);
+  std::string utf8_token =
+      token.is_null() ? "" : ConvertJavaStringToUTF8(token);
+  std::move(*callback).Run(status, utf8_user_email, utf8_token);
   delete callback;
 }
 
@@ -52,12 +55,12 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 }
 
-void JniOAuthTokenGetter::CallWithToken(const TokenCallback& on_access_token) {
+void JniOAuthTokenGetter::CallWithToken(TokenCallback on_access_token) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   JNIEnv* env = base::android::AttachCurrentThread();
-  TokenCallback* callback_copy = new TokenCallback(on_access_token);
-  Java_JniOAuthTokenGetter_fetchAuthToken(
-      env, reinterpret_cast<intptr_t>(callback_copy));
+  TokenCallback* callback = new TokenCallback(std::move(on_access_token));
+  Java_JniOAuthTokenGetter_fetchAuthToken(env,
+                                          reinterpret_cast<intptr_t>(callback));
 }
 
 void JniOAuthTokenGetter::InvalidateCache() {
diff --git a/remoting/client/jni/jni_oauth_token_getter.h b/remoting/client/jni/jni_oauth_token_getter.h
index bdb0381..7328032 100644
--- a/remoting/client/jni/jni_oauth_token_getter.h
+++ b/remoting/client/jni/jni_oauth_token_getter.h
@@ -31,7 +31,7 @@
   ~JniOAuthTokenGetter() override;
 
   // OAuthTokenGetter overrides.
-  void CallWithToken(const TokenCallback& on_access_token) override;
+  void CallWithToken(TokenCallback on_access_token) override;
   void InvalidateCache() override;
 
   base::WeakPtr<JniOAuthTokenGetter> GetWeakPtr();
diff --git a/remoting/client/oauth_token_getter_proxy.cc b/remoting/client/oauth_token_getter_proxy.cc
index 361412b..af04ae84 100644
--- a/remoting/client/oauth_token_getter_proxy.cc
+++ b/remoting/client/oauth_token_getter_proxy.cc
@@ -14,19 +14,19 @@
 namespace {
 
 void ResolveCallback(
-    const OAuthTokenGetter::TokenCallback& on_access_token,
+    OAuthTokenGetter::TokenCallback on_access_token,
     scoped_refptr<base::SingleThreadTaskRunner> original_task_runner,
     OAuthTokenGetter::Status status,
     const std::string& user_email,
     const std::string& access_token) {
   if (!original_task_runner->BelongsToCurrentThread()) {
     original_task_runner->PostTask(
-        FROM_HERE,
-        base::BindOnce(on_access_token, status, user_email, access_token));
+        FROM_HERE, base::BindOnce(std::move(on_access_token), status,
+                                  user_email, access_token));
     return;
   }
 
-  on_access_token.Run(status, user_email, access_token);
+  std::move(on_access_token).Run(status, user_email, access_token);
 }
 
 }  // namespace
@@ -39,21 +39,20 @@
 OAuthTokenGetterProxy::~OAuthTokenGetterProxy() {}
 
 void OAuthTokenGetterProxy::CallWithToken(
-    const OAuthTokenGetter::TokenCallback& on_access_token) {
+    OAuthTokenGetter::TokenCallback on_access_token) {
   if (!task_runner_->BelongsToCurrentThread()) {
     auto task_runner_to_reply = base::ThreadTaskRunnerHandle::Get();
 
-    // TODO(crbug.com/824488): Change to base::BindOnce().
-    auto reply_callback = base::BindRepeating(&ResolveCallback, on_access_token,
-                                              task_runner_to_reply);
-    task_runner_->PostTask(FROM_HERE,
-                           base::BindOnce(&OAuthTokenGetter::CallWithToken,
-                                          token_getter_, reply_callback));
+    auto reply_callback = base::BindOnce(
+        &ResolveCallback, std::move(on_access_token), task_runner_to_reply);
+    task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&OAuthTokenGetter::CallWithToken,
+                                  token_getter_, std::move(reply_callback)));
     return;
   }
 
   if (token_getter_) {
-    token_getter_->CallWithToken(on_access_token);
+    token_getter_->CallWithToken(std::move(on_access_token));
   }
 }
 
diff --git a/remoting/client/oauth_token_getter_proxy.h b/remoting/client/oauth_token_getter_proxy.h
index 2fe3199a..a246a434 100644
--- a/remoting/client/oauth_token_getter_proxy.h
+++ b/remoting/client/oauth_token_getter_proxy.h
@@ -29,7 +29,7 @@
   ~OAuthTokenGetterProxy() override;
 
   // OAuthTokenGetter overrides.
-  void CallWithToken(const TokenCallback& on_access_token) override;
+  void CallWithToken(TokenCallback on_access_token) override;
   void InvalidateCache() override;
 
  private:
diff --git a/remoting/client/oauth_token_getter_proxy_unittest.cc b/remoting/client/oauth_token_getter_proxy_unittest.cc
index d9f0bdc..58caac0 100644
--- a/remoting/client/oauth_token_getter_proxy_unittest.cc
+++ b/remoting/client/oauth_token_getter_proxy_unittest.cc
@@ -37,7 +37,7 @@
   void ExpectInvalidateCache();
 
   // OAuthTokenGetter overrides.
-  void CallWithToken(const TokenCallback& on_access_token) override;
+  void CallWithToken(TokenCallback on_access_token) override;
   void InvalidateCache() override;
 
   base::WeakPtr<FakeOAuthTokenGetter> GetWeakPtr();
@@ -66,8 +66,7 @@
                                            const std::string& access_token) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!on_access_token_.is_null());
-  on_access_token_.Run(status, user_email, access_token);
-  on_access_token_.Reset();
+  std::move(on_access_token_).Run(status, user_email, access_token);
 }
 
 void FakeOAuthTokenGetter::ExpectInvalidateCache() {
@@ -76,9 +75,9 @@
   invalidate_cache_expected_ = true;
 }
 
-void FakeOAuthTokenGetter::CallWithToken(const TokenCallback& on_access_token) {
+void FakeOAuthTokenGetter::CallWithToken(TokenCallback on_access_token) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  on_access_token_ = on_access_token;
+  on_access_token_ = std::move(on_access_token);
 }
 
 void FakeOAuthTokenGetter::InvalidateCache() {
diff --git a/remoting/host/gcd_rest_client.cc b/remoting/host/gcd_rest_client.cc
index 0120d08..cbd3a42 100644
--- a/remoting/host/gcd_rest_client.cc
+++ b/remoting/host/gcd_rest_client.cc
@@ -82,7 +82,7 @@
   resource_request_->method = "POST";
 
   token_getter_->CallWithToken(
-      base::Bind(&GcdRestClient::OnTokenReceived, base::Unretained(this)));
+      base::BindOnce(&GcdRestClient::OnTokenReceived, base::Unretained(this)));
 }
 
 void GcdRestClient::SetClockForTest(base::Clock* clock) {
diff --git a/remoting/host/signaling_connector.cc b/remoting/host/signaling_connector.cc
index 530bfa6..397ea44 100644
--- a/remoting/host/signaling_connector.cc
+++ b/remoting/host/signaling_connector.cc
@@ -175,7 +175,7 @@
 
   if (signal_strategy_->GetState() == SignalStrategy::DISCONNECTED) {
     HOST_LOG << "Attempting to connect signaling.";
-    oauth_token_getter_->CallWithToken(base::Bind(
+    oauth_token_getter_->CallWithToken(base::BindOnce(
         &SignalingConnector::OnAccessToken, weak_factory_.GetWeakPtr()));
   }
 }
diff --git a/remoting/ios/facade/ios_oauth_token_getter.h b/remoting/ios/facade/ios_oauth_token_getter.h
index 7ad1fa8..684f25d 100644
--- a/remoting/ios/facade/ios_oauth_token_getter.h
+++ b/remoting/ios/facade/ios_oauth_token_getter.h
@@ -20,7 +20,7 @@
   ~IosOauthTokenGetter() override;
 
   // OAuthTokenGetter overrides.
-  void CallWithToken(const TokenCallback& on_access_token) override;
+  void CallWithToken(TokenCallback on_access_token) override;
   void InvalidateCache() override;
 
   base::WeakPtr<IosOauthTokenGetter> GetWeakPtr();
diff --git a/remoting/ios/facade/ios_oauth_token_getter.mm b/remoting/ios/facade/ios_oauth_token_getter.mm
index 1f60af2..d9d542f 100644
--- a/remoting/ios/facade/ios_oauth_token_getter.mm
+++ b/remoting/ios/facade/ios_oauth_token_getter.mm
@@ -20,9 +20,8 @@
 
 IosOauthTokenGetter::~IosOauthTokenGetter() {}
 
-void IosOauthTokenGetter::CallWithToken(const TokenCallback& on_access_token) {
-  // This forces the block to copy the callback instead of just the reference.
-  TokenCallback on_access_token_copied = on_access_token;
+void IosOauthTokenGetter::CallWithToken(TokenCallback on_access_token) {
+  __block TokenCallback block_callback = std::move(on_access_token);
   [RemotingService.instance.authentication
       callbackWithAccessToken:^(RemotingAuthenticationStatus status,
                                 NSString* userEmail, NSString* accessToken) {
@@ -40,9 +39,9 @@
           default:
             NOTREACHED();
         }
-        on_access_token_copied.Run(oauth_status,
-                                   base::SysNSStringToUTF8(userEmail),
-                                   base::SysNSStringToUTF8(accessToken));
+        std::move(block_callback)
+            .Run(oauth_status, base::SysNSStringToUTF8(userEmail),
+                 base::SysNSStringToUTF8(accessToken));
       }];
 }
 
diff --git a/remoting/ios/facade/remoting_oauth_authentication.mm b/remoting/ios/facade/remoting_oauth_authentication.mm
index 7f25698..a33a7c02 100644
--- a/remoting/ios/facade/remoting_oauth_authentication.mm
+++ b/remoting/ios/facade/remoting_oauth_authentication.mm
@@ -170,7 +170,7 @@
   // Be careful here since a failure to reset onAccessToken will end up with
   // retain cycle and memory leakage.
   if (_tokenGetter) {
-    _tokenGetter->CallWithToken(base::BindRepeating(
+    _tokenGetter->CallWithToken(base::BindOnce(
         ^(remoting::OAuthTokenGetter::Status status,
           const std::string& user_email, const std::string& access_token) {
           onAccessToken(oauthStatusToRemotingAuthenticationStatus(status),
diff --git a/remoting/protocol/http_ice_config_request.cc b/remoting/protocol/http_ice_config_request.cc
index 13f02b5..241b9055 100644
--- a/remoting/protocol/http_ice_config_request.cc
+++ b/remoting/protocol/http_ice_config_request.cc
@@ -75,7 +75,7 @@
   on_ice_config_callback_ = callback;
 
   if (oauth_token_getter_) {
-    oauth_token_getter_->CallWithToken(base::Bind(
+    oauth_token_getter_->CallWithToken(base::BindOnce(
         &HttpIceConfigRequest::OnOAuthToken, weak_factory_.GetWeakPtr()));
   } else {
     SendRequest();