Chromium Code Reviews| Index: chrome/browser/signin/android_profile_oauth2_token_service.cc |
| diff --git a/chrome/browser/signin/android_profile_oauth2_token_service.cc b/chrome/browser/signin/android_profile_oauth2_token_service.cc |
| index f79eb630dfb3a5b5be7c22ed0a578209491be7ec..d0f458e112dd3391bca2aa0375485b2efc2e35e7 100644 |
| --- a/chrome/browser/signin/android_profile_oauth2_token_service.cc |
| +++ b/chrome/browser/signin/android_profile_oauth2_token_service.cc |
| @@ -36,6 +36,16 @@ std::string CombineScopes(const OAuth2TokenService::ScopeSet& scopes) { |
| return scope; |
| } |
| +// Callback from FetchOAuth2TokenWithUsername(). |
| +// Arguments: |
| +// - the error, or NONE if the token fetch was successful. |
| +// - the OAuth2 access token. |
| +// - the expiry time of the token (may be null, indicating that the expiry |
| +// time is unknown. |
| +typedef base::Callback<void( |
| + const GoogleServiceAuthError&, const std::string&, const base::Time&)> |
|
awong
2013/08/16 17:53:16
nit: passing base::Time by value is oft preferred
Andrew T Wilson (Slow)
2013/08/19 12:15:56
This callback basically matches OAuth2TokenService
|
| + FetchOAuth2TokenCallback; |
| + |
| } // namespace |
| AndroidProfileOAuth2TokenService::AndroidProfileOAuth2TokenService() { |
| @@ -45,18 +55,6 @@ AndroidProfileOAuth2TokenService::~AndroidProfileOAuth2TokenService() { |
| } |
| scoped_ptr<OAuth2TokenService::Request> |
| - AndroidProfileOAuth2TokenService::StartRequest( |
| - const OAuth2TokenService::ScopeSet& scopes, |
| - OAuth2TokenService::Consumer* consumer) { |
| - const std::string& sync_username = |
| - SigninManagerFactory::GetForProfile(profile())-> |
| - GetAuthenticatedUsername(); |
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| - DCHECK(!sync_username.empty()); |
| - return StartRequestForUsername(sync_username, scopes, consumer); |
| -} |
| - |
| -scoped_ptr<OAuth2TokenService::Request> |
| AndroidProfileOAuth2TokenService::StartRequestForUsername( |
| const std::string& username, |
| const OAuth2TokenService::ScopeSet& scopes, |
| @@ -64,10 +62,9 @@ scoped_ptr<OAuth2TokenService::Request> |
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| scoped_ptr<RequestImpl> request(new RequestImpl(consumer)); |
| - FetchOAuth2Token( |
| - username, |
| - CombineScopes(scopes), |
| - base::Bind(&RequestImpl::InformConsumer, request->AsWeakPtr())); |
| + FetchOAuth2TokenWithUsername(request.get(), |
| + username, |
| + scopes); |
| return request.PassAs<Request>(); |
| } |
| @@ -91,20 +88,37 @@ void AndroidProfileOAuth2TokenService::InvalidateToken( |
| } |
| void AndroidProfileOAuth2TokenService::FetchOAuth2Token( |
| + RequestImpl* request, |
| + net::URLRequestContextGetter* getter, |
| + const std::string& client_id, |
| + const std::string& client_secret, |
| + const OAuth2TokenService::ScopeSet& scopes) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + const std::string& username = |
|
awong
2013/08/16 17:53:16
nit: you rely on RVO on line 110 but use a const &
Andrew T Wilson (Slow)
2013/08/19 12:15:56
Done.
|
| + SigninManagerFactory::GetForProfile(profile())-> |
| + GetAuthenticatedUsername(); |
| + DCHECK(!username.empty()); |
| + // Just ignore client_id, getter, etc since we don't use them on Android. |
| + FetchOAuth2TokenWithUsername(request, username, scopes); |
| +} |
| + |
| +void AndroidProfileOAuth2TokenService::FetchOAuth2TokenWithUsername( |
| + RequestImpl* request, |
| const std::string& username, |
| - const std::string& scope, |
| - const FetchOAuth2TokenCallback& callback) { |
| + const OAuth2TokenService::ScopeSet& scopes) { |
| JNIEnv* env = AttachCurrentThread(); |
| + std::string scope = CombineScopes(scopes); |
| ScopedJavaLocalRef<jstring> j_username = |
| ConvertUTF8ToJavaString(env, username); |
| ScopedJavaLocalRef<jstring> j_scope = |
| ConvertUTF8ToJavaString(env, scope); |
| - // Allocate a copy of the callback on the heap, because the callback |
| + // Allocate a copy of the request WeakPtr on the heap, because the object |
| // needs to be passed through JNI as an int. |
| // It will be passed back to OAuth2TokenFetched(), where it will be freed. |
| scoped_ptr<FetchOAuth2TokenCallback> heap_callback( |
| - new FetchOAuth2TokenCallback(callback)); |
| + new FetchOAuth2TokenCallback(base::Bind(&RequestImpl::InformConsumer, |
| + request->AsWeakPtr()))); |
| // Call into Java to get a new token. |
| Java_AndroidProfileOAuth2TokenServiceHelper_getOAuth2AuthToken( |
| @@ -121,11 +135,8 @@ void OAuth2TokenFetched(JNIEnv* env, jclass clazz, |
| jboolean result, |
| jint nativeCallback) { |
| std::string token = ConvertJavaStringToUTF8(env, authToken); |
| - scoped_ptr<AndroidProfileOAuth2TokenService::FetchOAuth2TokenCallback> |
| - heap_callback( |
| - reinterpret_cast< |
| - AndroidProfileOAuth2TokenService::FetchOAuth2TokenCallback*>( |
| - nativeCallback)); |
| + scoped_ptr<FetchOAuth2TokenCallback> heap_callback( |
| + reinterpret_cast<FetchOAuth2TokenCallback*>(nativeCallback)); |
| GoogleServiceAuthError err(result ? |
| GoogleServiceAuthError::NONE : |
| GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |