| 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..7886054a7bf5e7173a2ebbfc326a3b1a484fd69e 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.
|
| @@ -362,9 +366,9 @@ void OAuth2TokenService::Shutdown() {
|
| // static
|
| void OAuth2TokenService::InformConsumer(
|
| base::WeakPtr<OAuth2TokenService::RequestImpl> request,
|
| - GoogleServiceAuthError error,
|
| - std::string access_token,
|
| - base::Time expiration_date) {
|
| + const GoogleServiceAuthError& error,
|
| + const std::string& access_token,
|
| + const base::Time& expiration_date) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
|
|
| if (request)
|
| @@ -378,6 +382,7 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
|
|
|
| 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 +393,7 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
|
| base::Time()));
|
| return request.PassAs<Request>();
|
| }
|
| +#endif
|
|
|
| const CacheEntry* cache_entry = GetCacheEntry(scopes);
|
| if (cache_entry && cache_entry->access_token.length()) {
|
| @@ -400,6 +406,17 @@ 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(),
|
| + 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 +442,22 @@ 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::InvalidateToken(const ScopeSet& scopes,
|
| + const std::string& invalid_token) {
|
| + RemoveCacheEntry(scopes, invalid_token);
|
| +
|
| +#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->InvalidateOAuth2Token(
|
| + scope_list.front(),
|
| + invalid_token);
|
| +#endif
|
| }
|
|
|
| void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) {
|
| @@ -482,6 +515,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 +535,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 +546,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;
|
|
|