Index: chrome/browser/chromeos/login/oauth2_token_fetcher.cc |
diff --git a/chrome/browser/chromeos/login/oauth2_token_fetcher.cc b/chrome/browser/chromeos/login/oauth2_token_fetcher.cc |
index 7161eaacc4978a8d6efe66cdad3608cc338887a9..a83a5ed1ea7d8e5e6ed86e61af4743318cd837c0 100644 |
--- a/chrome/browser/chromeos/login/oauth2_token_fetcher.cc |
+++ b/chrome/browser/chromeos/login/oauth2_token_fetcher.cc |
@@ -42,7 +42,7 @@ OAuth2TokenFetcher::OAuth2TokenFetcher( |
OAuth2TokenFetcher::~OAuth2TokenFetcher() { |
} |
-void OAuth2TokenFetcher::Start() { |
+void OAuth2TokenFetcher::StartExchangeFromCookies() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Delay the verification if the network is not connected or on a captive |
@@ -53,13 +53,35 @@ void OAuth2TokenFetcher::Start() { |
VLOG(1) << "Network is offline. Deferring OAuth2 token fetch."; |
BrowserThread::PostDelayedTask( |
BrowserThread::UI, FROM_HERE, |
- base::Bind(&OAuth2TokenFetcher::Start, AsWeakPtr()), |
+ base::Bind(&OAuth2TokenFetcher::StartExchangeFromCookies, |
+ AsWeakPtr()), |
base::TimeDelta::FromMilliseconds(kRequestRestartDelay)); |
return; |
} |
auth_fetcher_.StartCookieForOAuthLoginTokenExchange(EmptyString()); |
} |
+void OAuth2TokenFetcher::StartExchangeFromAuthCode( |
+ const std::string& auth_code) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ auth_code_ = auth_code; |
+ // Delay the verification if the network is not connected or on a captive |
+ // portal. |
+ ConnectivityStateHelper* csh = ConnectivityStateHelper::Get(); |
+ if (!csh->DefaultNetworkOnline()) { |
+ // If network is offline, defer the token fetching until online. |
+ VLOG(1) << "Network is offline. Deferring OAuth2 token fetch."; |
+ BrowserThread::PostDelayedTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&OAuth2TokenFetcher::StartExchangeFromAuthCode, |
+ AsWeakPtr(), |
+ auth_code), |
+ base::TimeDelta::FromMilliseconds(kRequestRestartDelay)); |
+ return; |
+ } |
+ auth_fetcher_.StartAuthCodeForOAuth2TokenExchange(auth_code); |
+} |
+ |
void OAuth2TokenFetcher::OnClientOAuthSuccess( |
const GaiaAuthConsumer::ClientOAuthResult& oauth_tokens) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -72,10 +94,15 @@ void OAuth2TokenFetcher::OnClientOAuthSuccess( |
void OAuth2TokenFetcher::OnClientOAuthFailure( |
const GoogleServiceAuthError& error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- RetryOnError(error, |
- base::Bind(&OAuth2TokenFetcher::Start, AsWeakPtr()), |
- base::Bind(&Delegate::OnOAuth2TokensFetchFailed, |
- base::Unretained(delegate_))); |
+ RetryOnError( |
+ error, |
+ auth_code_.empty() ? |
+ base::Bind(&OAuth2TokenFetcher::StartExchangeFromCookies, |
+ AsWeakPtr()) : |
+ base::Bind(&OAuth2TokenFetcher::StartExchangeFromAuthCode, |
+ AsWeakPtr(), auth_code_), |
+ base::Bind(&Delegate::OnOAuth2TokensFetchFailed, |
+ base::Unretained(delegate_))); |
} |
void OAuth2TokenFetcher::RetryOnError(const GoogleServiceAuthError& error, |