diff options
author | Alex Mineer <amineer@google.com> | 2015-09-02 17:28:26 -0700 |
---|---|---|
committer | Alex Mineer <amineer@google.com> | 2015-09-03 00:29:22 +0000 |
commit | 2d2a30204f6f6a62380b117c4c9594659fd2e59f (patch) | |
tree | 0ecbcae891355c84d1558852528b5784f3e201eb | |
parent | 8cbd1d62ba8325313f5c74ea34b4cda7be5ebfee (diff) | |
download | chromium_src-2d2a30204f6f6a62380b117c4c9594659fd2e59f.zip chromium_src-2d2a30204f6f6a62380b117c4c9594659fd2e59f.tar.gz chromium_src-2d2a30204f6f6a62380b117c4c9594659fd2e59f.tar.bz2 |
A canceled request for a profile download is causing the token service to remember this as an error for the account.
BUG=520400,524478
Review URL: https://codereview.chromium.org/1317873002
Cr-Commit-Position: refs/heads/master@{#347007}
(cherry picked from commit 4ccab513683dd36fcffa2b3eca9f4803d9243d25)
Correctly migrate different architectures of installed NPAPI Flash.
BUG=510114
TEST=Manual, see bug.
Review URL: https://codereview.chromium.org/1308313009
(cherry picked from commit 6a4ece1ac9ad20d02ebdd2da713a98e4b3b0df29)
Cr-Original-Commit-Position: refs/heads/master@{#345946}
Cr-Commit-Position: refs/branch-heads/2490@{#142}
Cr-Branched-From: 7790a3535f2a81a03685eca31a32cf69ae0c114f-refs/heads/master@{#344925}
7 files changed, 66 insertions, 40 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java index 46e07f9..2307742 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java @@ -46,7 +46,7 @@ public class InvalidationGcmUpstreamSender extends GcmUpstreamSenderService { SyncConstants.CHROME_SYNC_OAUTH2_SCOPE, new AccountManagerHelper.GetAuthTokenCallback() { @Override - public void tokenAvailable(String token) { + public void tokenAvailable(String token, boolean isTransientError) { sendUpstreamMessage(to, data, token); } }); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java index 7f6737d..2ca4be9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java @@ -136,7 +136,7 @@ public final class OAuth2TokenService { ThreadUtils.postOnUiThread(new Runnable() { @Override public void run() { - nativeOAuth2TokenFetched(null, nativeCallback); + nativeOAuth2TokenFetched(null, false, nativeCallback); } }); return; @@ -147,8 +147,8 @@ public final class OAuth2TokenService { accountManagerHelper.getAuthTokenFromForeground( null, account, oauth2Scope, new AccountManagerHelper.GetAuthTokenCallback() { @Override - public void tokenAvailable(String token) { - nativeOAuth2TokenFetched(token, nativeCallback); + public void tokenAvailable(String token, boolean isTransientError) { + nativeOAuth2TokenFetched(token, isTransientError, nativeCallback); } }); } @@ -192,7 +192,7 @@ public final class OAuth2TokenService { context, activity, account, scope, new AccountManagerHelper.GetAuthTokenCallback() { @Override - public void tokenAvailable(String token) { + public void tokenAvailable(String token, boolean isTransientError) { result.set(token); semaphore.release(); } @@ -314,7 +314,7 @@ public final class OAuth2TokenService { private static native Object nativeGetForProfile(Profile profile); private static native void nativeOAuth2TokenFetched( - String authToken, long nativeCallback); + String authToken, boolean isTransientError, long nativeCallback); private native void nativeValidateAccounts(long nativeOAuth2TokenServiceDelegateAndroid, String currentlySignedInAccount, boolean forceNotifications); private native void nativeFireRefreshTokenAvailableFromJava( diff --git a/chrome/browser/plugins/plugin_prefs.cc b/chrome/browser/plugins/plugin_prefs.cc index 0b9c387..a754c32 100644 --- a/chrome/browser/plugins/plugin_prefs.cc +++ b/chrome/browser/plugins/plugin_prefs.cc @@ -57,6 +57,24 @@ bool IsComponentUpdatedPepperFlash(const base::FilePath& plugin) { return false; } +// Returns true if |path| looks like the path to an NPAPI Flash plugin. +bool IsNpapiFlashPath(const base::FilePath& path) { + base::FilePath npapi_flash; + // Check NPAPI Flash is installed. + if (!PathService::Get(chrome::FILE_FLASH_SYSTEM_PLUGIN, &npapi_flash)) + return false; + // Check for same architecture NPAPI Flash. + if (base::FilePath::CompareEqualIgnoreCase(path.value(), npapi_flash.value())) + return true; +#if defined(OS_WIN) + // Fuzzy check for NPAPI Flash on Windows. + base::FilePath::StringType kSwfPrefix = FILE_PATH_LITERAL("NPSWF"); + if (path.BaseName().value().compare(0, kSwfPrefix.size(), kSwfPrefix) == 0) + return true; +#endif + return false; +} + } // namespace PluginPrefs::PluginState::PluginState() { @@ -345,12 +363,10 @@ void PluginPrefs::SetPrefs(PrefService* prefs) { if (saved_plugins_list && !saved_plugins_list->empty()) { // The following four variables are only valid when // |migrate_to_pepper_flash| is set to true. - base::FilePath npapi_flash; base::FilePath pepper_flash; base::DictionaryValue* pepper_flash_node = NULL; bool npapi_flash_enabled = false; if (migrate_to_pepper_flash) { - PathService::Get(chrome::FILE_FLASH_SYSTEM_PLUGIN, &npapi_flash); PathService::Get(chrome::FILE_PEPPER_FLASH_PLUGIN, &pepper_flash); } @@ -415,8 +431,7 @@ void PluginPrefs::SetPrefs(PrefService* prefs) { } } - if (migrate_to_pepper_flash && base::FilePath::CompareEqualIgnoreCase( - path, npapi_flash.value())) { + if (migrate_to_pepper_flash && IsNpapiFlashPath(plugin_path)) { npapi_flash_enabled = enabled; } else if (migrate_to_pepper_flash && base::FilePath::CompareEqualIgnoreCase( diff --git a/chrome/browser/signin/oauth2_token_service_delegate_android.cc b/chrome/browser/signin/oauth2_token_service_delegate_android.cc index 8bd13bc..e164f83 100644 --- a/chrome/browser/signin/oauth2_token_service_delegate_android.cc +++ b/chrome/browser/signin/oauth2_token_service_delegate_android.cc @@ -199,6 +199,9 @@ bool OAuth2TokenServiceDelegateAndroid::RefreshTokenHasError( void OAuth2TokenServiceDelegateAndroid::UpdateAuthError( const std::string& account_id, const GoogleServiceAuthError& error) { + DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::UpdateAuthError" + << " account=" << account_id + << " error=" << error.ToString(); if (error.state() == GoogleServiceAuthError::NONE) { errors_.erase(account_id); } else { @@ -264,6 +267,10 @@ void OAuth2TokenServiceDelegateAndroid::ValidateAccounts( signed_in_account = ConvertJavaStringToUTF8(env, j_current_acc); if (!signed_in_account.empty()) signed_in_account = gaia::CanonicalizeEmail(signed_in_account); + + // Clear any auth errors so that client can retry to get access tokens. + errors_.clear(); + ValidateAccounts(signed_in_account, j_force_notifications != JNI_FALSE); } @@ -456,17 +463,19 @@ void OAuth2TokenServiceDelegateAndroid::RevokeAllCredentials() { void OAuth2TokenFetched(JNIEnv* env, jclass clazz, jstring authToken, + jboolean isTransientError, jlong nativeCallback) { std::string token; if (authToken) token = ConvertJavaStringToUTF8(env, authToken); scoped_ptr<FetchOAuth2TokenCallback> heap_callback( reinterpret_cast<FetchOAuth2TokenCallback*>(nativeCallback)); - // Android does not provide enough information to know if the credentials are - // wrong, so assume any error is transient by using CONNECTION_FAILED. - GoogleServiceAuthError err(authToken - ? GoogleServiceAuthError::NONE - : GoogleServiceAuthError::CONNECTION_FAILED); + GoogleServiceAuthError + err(authToken + ? GoogleServiceAuthError::NONE + : isTransientError + ? GoogleServiceAuthError::CONNECTION_FAILED + : GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); heap_callback->Run(err, token, base::Time()); } diff --git a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java index 50e04d8..ba5a8b4 100644 --- a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java +++ b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java @@ -211,7 +211,7 @@ public class InvalidationClientService extends AndroidListener { account, invalidAuthToken, getOAuth2ScopeWithType(), new AccountManagerHelper.GetAuthTokenCallback() { @Override - public void tokenAvailable(String token) { + public void tokenAvailable(String token, boolean isTransientError) { if (token != null) { setAuthToken(InvalidationClientService.this.getApplicationContext(), pendingIntent, token, getOAuth2ScopeWithType()); diff --git a/google_apis/gaia/oauth2_token_service_delegate.cc b/google_apis/gaia/oauth2_token_service_delegate.cc index 2f97614..aed5db8 100644 --- a/google_apis/gaia/oauth2_token_service_delegate.cc +++ b/google_apis/gaia/oauth2_token_service_delegate.cc @@ -48,8 +48,7 @@ void OAuth2TokenServiceDelegate::RemoveObserver( // static bool OAuth2TokenServiceDelegate::IsError(const GoogleServiceAuthError& error) { - // TODO(rogerta): should we distinguish between transient and persistent? - return error.state() != GoogleServiceAuthError::NONE; + return error.IsPersistentError(); } void OAuth2TokenServiceDelegate::StartBatchChanges() { diff --git a/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java b/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java index dbe1638..d10991c 100644 --- a/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java +++ b/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java @@ -77,8 +77,11 @@ public class AccountManagerHelper { * Invoked on the UI thread once a token has been provided by the AccountManager. * @param token Auth token, or null if no token is available (bad credentials, * permission denied, etc). + * @param isTransientError If the token is null, then this parameter indicates + * if the error is transient or persistent. If token is non-null, this + * parameter is not used. */ - void tokenAvailable(String token); + void tokenAvailable(String token, boolean isTransientError); } /** @@ -233,8 +236,8 @@ public class AccountManagerHelper { public String getAuthTokenFromBackground(Account account, String authTokenType) { AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken( account, authTokenType, true, null, null); - AtomicBoolean errorEncountered = new AtomicBoolean(false); - return getAuthTokenInner(future, errorEncountered); + AtomicBoolean isTransientError = new AtomicBoolean(false); + return getAuthTokenInner(future, isTransientError); } /** @@ -247,9 +250,9 @@ public class AccountManagerHelper { public void getAuthTokenFromForeground(Activity activity, Account account, String authTokenType, GetAuthTokenCallback callback) { AtomicInteger numTries = new AtomicInteger(0); - AtomicBoolean errorEncountered = new AtomicBoolean(false); + AtomicBoolean isTransientError = new AtomicBoolean(false); getAuthTokenAsynchronously(activity, account, authTokenType, callback, numTries, - errorEncountered, null); + isTransientError, null); } private class ConnectionRetry implements NetworkChangeNotifier.ConnectionTypeObserver { @@ -257,15 +260,15 @@ public class AccountManagerHelper { private final String mAuthTokenType; private final GetAuthTokenCallback mCallback; private final AtomicInteger mNumTries; - private final AtomicBoolean mErrorEncountered; + private final AtomicBoolean mIsTransientError; ConnectionRetry(Account account, String authTokenType, GetAuthTokenCallback callback, - AtomicInteger numTries, AtomicBoolean errorEncountered) { + AtomicInteger numTries, AtomicBoolean isTransientError) { mAccount = account; mAuthTokenType = authTokenType; mCallback = callback; mNumTries = numTries; - mErrorEncountered = errorEncountered; + mIsTransientError = isTransientError; } @Override @@ -278,7 +281,7 @@ public class AccountManagerHelper { if (NetworkChangeNotifier.isOnline()) { NetworkChangeNotifier.removeConnectionTypeObserver(this); getAuthTokenAsynchronously(null, mAccount, mAuthTokenType, mCallback, mNumTries, - mErrorEncountered, this); + mIsTransientError, this); } } } @@ -296,7 +299,7 @@ public class AccountManagerHelper { // Gets the auth token synchronously private String getAuthTokenInner(AccountManagerFuture<Bundle> future, - AtomicBoolean errorEncountered) { + AtomicBoolean isTransientError) { try { Bundle result = future.getResult(); if (result != null) { @@ -310,54 +313,54 @@ public class AccountManagerHelper { Log.w(TAG, "Auth token - authenticator exception", e); } catch (IOException e) { Log.w(TAG, "Auth token - IO exception", e); - errorEncountered.set(true); + isTransientError.set(true); } return null; } private void getAuthTokenAsynchronously(@Nullable Activity activity, final Account account, final String authTokenType, final GetAuthTokenCallback callback, - final AtomicInteger numTries, final AtomicBoolean errorEncountered, + final AtomicInteger numTries, final AtomicBoolean isTransientError, final ConnectionRetry retry) { // Return null token for no USE_CREDENTIALS permission. if (!hasUseCredentialsPermission()) { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - callback.tokenAvailable(null); + callback.tokenAvailable(null, false); } }); return; } final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken( account, authTokenType, true, null, null); - errorEncountered.set(false); + isTransientError.set(false); new AsyncTask<Void, Void, String>() { @Override public String doInBackground(Void... params) { - return getAuthTokenInner(future, errorEncountered); + return getAuthTokenInner(future, isTransientError); } @Override public void onPostExecute(String authToken) { onGotAuthTokenResult(account, authTokenType, authToken, callback, numTries, - errorEncountered, retry); + isTransientError, retry); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } private void onGotAuthTokenResult(Account account, String authTokenType, String authToken, - GetAuthTokenCallback callback, AtomicInteger numTries, AtomicBoolean errorEncountered, + GetAuthTokenCallback callback, AtomicInteger numTries, AtomicBoolean isTransientError, ConnectionRetry retry) { - if (authToken != null || !errorEncountered.get() + if (authToken != null || !isTransientError.get() || numTries.incrementAndGet() == MAX_TRIES || !NetworkChangeNotifier.isInitialized()) { - callback.tokenAvailable(authToken); + callback.tokenAvailable(authToken, isTransientError.get()); return; } if (retry == null) { ConnectionRetry newRetry = new ConnectionRetry(account, authTokenType, callback, - numTries, errorEncountered); + numTries, isTransientError); NetworkChangeNotifier.addConnectionTypeObserver(newRetry); } else { NetworkChangeNotifier.addConnectionTypeObserver(retry); @@ -373,9 +376,9 @@ public class AccountManagerHelper { String authTokenType, GetAuthTokenCallback callback) { invalidateAuthToken(authToken); AtomicInteger numTries = new AtomicInteger(0); - AtomicBoolean errorEncountered = new AtomicBoolean(false); + AtomicBoolean isTransientError = new AtomicBoolean(false); getAuthTokenAsynchronously( - null, account, authTokenType, callback, numTries, errorEncountered, null); + null, account, authTokenType, callback, numTries, isTransientError, null); } /** |