Index: chrome/browser/ui/webui/sync_setup_handler.cc |
diff --git a/chrome/browser/ui/webui/sync_setup_handler.cc b/chrome/browser/ui/webui/sync_setup_handler.cc |
index dffb73940cebbb809bbd940a8f6b9da36ce90b6a..8171786c2e1ba3f4a2cf2ee7fe4511b8d67c02cc 100644 |
--- a/chrome/browser/ui/webui/sync_setup_handler.cc |
+++ b/chrome/browser/ui/webui/sync_setup_handler.cc |
@@ -65,6 +65,7 @@ struct SyncConfigInfo { |
bool encrypt_all; |
bool sync_everything; |
+ bool sync_nothing; |
syncer::ModelTypeSet data_types; |
std::string passphrase; |
bool passphrase_is_gaia; |
@@ -73,6 +74,7 @@ struct SyncConfigInfo { |
SyncConfigInfo::SyncConfigInfo() |
: encrypt_all(false), |
sync_everything(false), |
+ sync_nothing(false), |
passphrase_is_gaia(false) { |
} |
@@ -145,6 +147,11 @@ bool GetConfiguration(const std::string& json, SyncConfigInfo* config) { |
return false; |
} |
+ if (!result->GetBoolean("syncNothing", &config->sync_nothing)) { |
+ DLOG(ERROR) << "GetConfiguration() not passed a syncNothing value"; |
+ return false; |
+ } |
+ |
Andrew T Wilson (Slow)
2013/05/15 15:01:24
Add a DCHECK(!(sync_nothing && sync_everything)) s
Raghu Simha
2013/05/16 02:13:20
Done.
|
ModelTypeNameMap type_names = GetSelectableTypeNameMap(); |
for (ModelTypeNameMap::const_iterator it = type_names.begin(); |
@@ -356,6 +363,7 @@ void SyncSetupHandler::GetStaticLocalizedValues( |
{ "getOtpURL", IDS_SYNC_GET_OTP_URL }, |
{ "syncAllDataTypes", IDS_SYNC_EVERYTHING }, |
{ "chooseDataTypes", IDS_SYNC_CHOOSE_DATATYPES }, |
+ { "syncNothing", IDS_SYNC_NOTHING }, |
{ "bookmarks", IDS_SYNC_DATATYPE_BOOKMARKS }, |
{ "preferences", IDS_SYNC_DATATYPE_PREFERENCES }, |
{ "autofill", IDS_SYNC_DATATYPE_AUTOFILL }, |
@@ -441,6 +449,7 @@ void SyncSetupHandler::DisplayConfigureSync(bool show_advanced, |
// Setup args for the sync configure screen: |
// showSyncEverythingPage: false to skip directly to the configure screen |
// syncAllDataTypes: true if the user wants to sync everything |
+ // syncNothing: true if the user wants to sync nothing |
// <data_type>Registered: true if the associated data type is supported |
// <data_type>Synced: true if the user wants to sync that specific data type |
// encryptionEnabled: true if sync supports encryption |
@@ -468,6 +477,7 @@ void SyncSetupHandler::DisplayConfigureSync(bool show_advanced, |
args.SetBoolean("passphraseFailed", passphrase_failed); |
args.SetBoolean("showSyncEverythingPage", !show_advanced); |
args.SetBoolean("syncAllDataTypes", sync_prefs.HasKeepEverythingSynced()); |
+ args.SetBoolean("syncNothing", false); // Always false during initial setup. |
args.SetBoolean("encryptAllData", service->EncryptEverythingEnabled()); |
// We call IsPassphraseRequired() here, instead of calling |
@@ -558,6 +568,7 @@ void SyncSetupHandler::ConfigureSyncDone() { |
// We're done configuring, so notify ProfileSyncService that it is OK to |
// start syncing. |
+ service->SetSetupInProgress(false); |
service->SetSyncSetupCompleted(); |
} |
} |
@@ -892,17 +903,22 @@ void SyncSetupHandler::SigninFailed(const GoogleServiceAuthError& error) { |
last_signin_error_ = error; |
- // If using web-based sign in flow, don't show the gaia sign in page again |
- // since there is no way to show the user an error message. |
- if (SyncPromoUI::UseWebBasedSigninFlow()) { |
+ if (!retry_on_signin_failure_ && |
+ error.state() == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) { |
Andrew T Wilson (Slow)
2013/05/15 15:01:24
Why would we only do this on INVALID_GAIA_CREDENTI
Raghu Simha
2013/05/16 02:13:20
Good catch. I've added those cases, and we now mat
|
+ // The user received an auth error while re-enabling sync after having |
+ // chosen to "Sync nothing", and the gaia password has been changed since |
+ // the user last signed in. Leave the sync backend initialized, and close |
+ // the setup dialog. An error message will be shown on the settings page. |
+ web_ui()->CallJavascriptFunction("OptionsPage.closeOverlay"); |
+ } else if (SyncPromoUI::UseWebBasedSigninFlow()) { |
+ // If using web-based sign in flow, don't show the gaia sign in page again |
+ // since there is no way to show the user an error message. |
CloseSyncSetup(); |
} else if (retry_on_signin_failure_) { |
// Got a failed signin - this is either just a typical auth error, or a |
// sync error (treat sync errors as "fatal errors" - i.e. non-auth errors). |
// On ChromeOS, this condition can happen when auth token is invalid and |
// cannot start sync backend. |
- // If using web-based sign in flow, don't show the gaia sign in page again |
- // since there is no way to show the user an error message. |
ProfileSyncService* service = GetSyncService(); |
DisplayGaiaLogin(service && service->HasUnrecoverableError()); |
} else { |
@@ -967,6 +983,17 @@ void SyncSetupHandler::HandleConfigure(const ListValue* args) { |
return; |
} |
+ // Disable sync, but remain signed in if the user selected "Sync nothing" in |
+ // the advanced settings dialog. |
+ if (configuration.sync_nothing) { |
+ ProfileSyncService::SyncEvent( |
+ ProfileSyncService::STOP_FROM_ADVANCED_DIALOG); |
+ CloseOverlay(); |
+ service->DisableForUser(); |
+ service->SetSetupInProgress(false); |
+ return; |
+ } |
+ |
// Note: Data encryption will not occur until configuration is complete |
// (when the PSS receives its CONFIGURE_DONE notification from the sync |
// backend), so the user still has a chance to cancel out of the operation |
@@ -1102,7 +1129,9 @@ void SyncSetupHandler::HandleCloseTimeout(const ListValue* args) { |
void SyncSetupHandler::CloseSyncSetup() { |
// TODO(atwilson): Move UMA tracking of signin events out of sync module. |
ProfileSyncService* sync_service = GetSyncService(); |
- if (IsActiveLogin()) { |
+ // If there was a sign in error, do not log a cancel event. |
+ if (IsActiveLogin() && |
+ last_signin_error_.state() == GoogleServiceAuthError::NONE) { |
if (!sync_service || !sync_service->HasSyncSetupCompleted()) { |
if (signin_tracker_.get()) { |
ProfileSyncService::SyncEvent( |
@@ -1123,38 +1152,20 @@ void SyncSetupHandler::CloseSyncSetup() { |
GetLoginUIService()->LoginUIClosed(this); |
} |
- if (sync_service) { |
- // Make sure user isn't left half-logged-in (signed in, but without sync |
- // started up). If the user hasn't finished setting up sync, then sign out |
- // and shut down sync. |
- if (!sync_service->HasSyncSetupCompleted()) { |
- DVLOG(1) << "Signin aborted by user action"; |
- // We can get here on Chrome OS (e.g dashboard clear), but "do nothing" |
- // is the correct behavior. |
-#if !defined(OS_CHROMEOS) |
- if (signin_tracker_.get() || sync_service->FirstSetupInProgress()) { |
- // User was still in the process of signing in, so sign him out again. |
- // This makes sure that the user isn't left signed in but with sync |
- // un-configured. |
- // |
- // This has the side-effect of signing out the user in the following |
- // scenario: |
- // * User signs in while sync is disabled by policy. |
- // * Sync is re-enabled by policy. |
- // * User brings up sync setup dialog to do initial sync config. |
- // * User cancels out of the dialog. |
- // |
- // This case is indistinguishable from the "one click signin" case where |
- // the user checks the "advanced setup" checkbox, then cancels out of |
- // the setup box, which is a much more common scenario, so we do the |
- // right thing for the one-click case. |
- SigninManagerFactory::GetForProfile(GetProfile())->SignOut(); |
- } |
-#endif |
- sync_service->DisableForUser(); |
- browser_sync::SyncPrefs sync_prefs(GetProfile()->GetPrefs()); |
- sync_prefs.SetStartSuppressed(true); |
- } |
+ // If the setup dialog is being closed during configuration, and sync setup is |
+ // incomplete, and there is no signin error, it's because the user clicked |
+ // "Cancel" while setting up sync. In this case, we don't want the sync |
+ // backend to remain in the initialized state. |
+ // Note: If we get here and there is a signin error, it's because a signed in |
+ // user is trying to set up sync, and their gaia password has been changed |
+ // since they last signed in. In this case, we leave the backend initialized |
+ // and allow the user to respond to the error message via the settings page. |
+ if (sync_service && |
+ !sync_service->HasSyncSetupCompleted() && |
+ configuring_sync_ && |
Andrew T Wilson (Slow)
2013/05/15 15:01:24
You can't really rely on configuring_sync_ - it's
Raghu Simha
2013/05/16 02:13:20
If the user clicks cancel, we want to disable sync
|
+ last_signin_error_.state() == GoogleServiceAuthError::NONE) { |
+ DVLOG(1) << "Sync setup aborted by user action"; |
+ sync_service->DisableForUser(); |
sync_service->SetSetupInProgress(false); |
} |
@@ -1186,13 +1197,10 @@ void SyncSetupHandler::OpenSyncSetup() { |
// logged in. |
// 6) One-click signin (credentials are already available, so should display |
// sync configure UI, not login UI). |
- // 7) ChromeOS re-enable after disabling sync. |
+ // 7) User re-enables sync after disabling it via advanced settings. |
SigninManagerBase* signin = |
SigninManagerFactory::GetForProfile(GetProfile()); |
if (signin->GetAuthenticatedUsername().empty() || |
-#if !defined(OS_CHROMEOS) |
- (GetSyncService() && GetSyncService()->IsStartSuppressed()) || |
-#endif |
signin->signin_global_error()->HasMenuItem()) { |
// User is not logged in, or login has been specially requested - need to |
// display login UI (cases 1-3). |
@@ -1207,7 +1215,7 @@ void SyncSetupHandler::OpenSyncSetup() { |
// User is already logged in. They must have brought up the config wizard |
// via the "Advanced..." button or through One-Click signin (cases 4-6), or |
- // they are re-enabling sync on Chrome OS. |
+ // they are re-enabling sync after having disabled it (case 7). |
DisplayConfigureSync(true, false); |
} |