Index: chrome/browser/signin/oauth2_token_service.cc |
diff --git a/chrome/browser/signin/oauth2_token_service.cc b/chrome/browser/signin/oauth2_token_service.cc |
index a0392973e75af8b59e79b4aa44f5846f764cb029..dc1003401b8c792623f4b3ff7ce7bdbac2dad95d 100644 |
--- a/chrome/browser/signin/oauth2_token_service.cc |
+++ b/chrome/browser/signin/oauth2_token_service.cc |
@@ -29,6 +29,10 @@ |
#include "google_apis/gaia/oauth2_access_token_consumer.h" |
#include "google_apis/gaia/oauth2_access_token_fetcher.h" |
+#if defined(OS_ANDROID) |
+#include "chrome/browser/sync/profile_sync_service_android.h" |
+#endif |
+ |
namespace { |
// Maximum number of retries in fetching an OAuth2 access token. |
@@ -374,10 +378,19 @@ void OAuth2TokenService::InformConsumer( |
scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( |
const OAuth2TokenService::ScopeSet& scopes, |
OAuth2TokenService::Consumer* consumer) { |
+ return InvalidateTokenAndStartRequest(scopes, consumer, std::string()); |
+} |
+ |
+scoped_ptr<OAuth2TokenService::Request> |
+OAuth2TokenService::InvalidateTokenAndStartRequest( |
+ const OAuth2TokenService::ScopeSet& scopes, |
+ OAuth2TokenService::Consumer* consumer, |
+ const std::string& invalid_token) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
scoped_ptr<RequestImpl> request(new RequestImpl(consumer)); |
+#if !defined(OS_ANDROID) |
TokenService* token_service = TokenServiceFactory::GetForProfile(profile_); |
if (!token_service || !token_service->HasOAuthLoginToken()) { |
MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
@@ -388,6 +401,10 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( |
base::Time())); |
return request.PassAs<Request>(); |
} |
+#endif |
+ |
+ if (!invalid_token.empty()) |
+ RemoveCacheEntry(scopes, invalid_token); |
const CacheEntry* cache_entry = GetCacheEntry(scopes); |
if (cache_entry && cache_entry->access_token.length()) { |
@@ -400,6 +417,18 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( |
return request.PassAs<Request>(); |
} |
+#if defined(OS_ANDROID) |
+ DCHECK_EQ(scopes.size(), 1U); |
+ std::vector<std::string> scope_list(scopes.begin(), scopes.end()); |
+ ProfileSyncServiceAndroid* sync_service = |
+ ProfileSyncServiceAndroid::GetProfileSyncServiceAndroid(); |
+ sync_service->FetchOAuth2Token( |
+ scope_list.front(), |
+ invalid_token, |
+ base::Bind(&OAuth2TokenService::InformConsumer, |
+ request->AsWeakPtr())); |
+ return request.PassAs<Request>(); |
+#else |
std::string refresh_token = token_service->GetOAuth2LoginRefreshToken(); |
if (!refresh_token.length()) { |
MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
@@ -425,6 +454,7 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( |
pending_fetchers_[fetch_parameters] = Fetcher::CreateAndStart( |
profile_, getter_, refresh_token, scopes, request->AsWeakPtr()); |
return request.PassAs<Request>(); |
+#endif // defined(OS_ANDROID) |
} |
void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { |
@@ -482,6 +512,19 @@ const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry( |
return &token_iterator->second; |
} |
+bool OAuth2TokenService::RemoveCacheEntry( |
+ const OAuth2TokenService::ScopeSet& scopes, |
+ const std::string& token_to_remove) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ TokenCache::iterator token_iterator = token_cache_.find(scopes); |
+ if (token_iterator == token_cache_.end() && |
+ token_iterator->second.access_token == token_to_remove) { |
+ token_cache_.erase(token_iterator); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
void OAuth2TokenService::RegisterCacheEntry( |
const std::string& refresh_token, |
const OAuth2TokenService::ScopeSet& scopes, |
@@ -489,6 +532,7 @@ void OAuth2TokenService::RegisterCacheEntry( |
const base::Time& expiration_date) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+#if !defined(OS_ANDROID) |
// Only register OAuth2 access tokens for the refresh token held by |
// TokenService. |
TokenService* token_service = TokenServiceFactory::GetForProfile(profile_); |
@@ -499,6 +543,7 @@ void OAuth2TokenService::RegisterCacheEntry( |
"Received a token with a refresh token not maintained by TokenService."; |
return; |
} |
+#endif |
CacheEntry& token = token_cache_[scopes]; |
token.access_token = access_token; |