summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Mineer <amineer@google.com>2015-09-02 17:28:26 -0700
committerAlex Mineer <amineer@google.com>2015-09-03 00:29:22 +0000
commit2d2a30204f6f6a62380b117c4c9594659fd2e59f (patch)
tree0ecbcae891355c84d1558852528b5784f3e201eb
parent8cbd1d62ba8325313f5c74ea34b4cda7be5ebfee (diff)
downloadchromium_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}
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java2
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java10
-rw-r--r--chrome/browser/plugins/plugin_prefs.cc23
-rw-r--r--chrome/browser/signin/oauth2_token_service_delegate_android.cc19
-rw-r--r--components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java2
-rw-r--r--google_apis/gaia/oauth2_token_service_delegate.cc3
-rw-r--r--sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java47
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);
}
/**