172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/sync_setup_flow.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/json/json_reader.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/json/json_writer.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/platform_util.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/profile_sync_service.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/sync_setup_flow_handler.h" 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_dialogs.h" 214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_list.h" 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/net/gaia/google_service_auth_error.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/url_constants.h" 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h" 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_font_util.h" 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/font.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Helper function to disable password sync. 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DisablePasswordSync(ProfileSyncService* service) { 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen syncable::ModelTypeSet types; 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->GetPreferredDataTypes(&types); 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen types.erase(syncable::PASSWORDS); 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->OnUserChoseDatatypes(false, types); 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncConfiguration::SyncConfiguration() 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : sync_everything(false), 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen use_secondary_passphrase(false) { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncConfiguration::~SyncConfiguration() {} 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncSetupFlow::~SyncSetupFlow() { 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen flow_handler_->SetFlow(NULL); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service, 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlowContainer* container, 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupWizard::State start, 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupWizard::State end) { 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue args; 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (start == SyncSetupWizard::GAIA_LOGIN) 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow::GetArgsForGaiaLogin(service, &args); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else if (start == SyncSetupWizard::CONFIGURE) 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow::GetArgsForConfigure(service, &args); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else if (start == SyncSetupWizard::ENTER_PASSPHRASE) 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow::GetArgsForEnterPassphrase(false, false, &args); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else if (start == SyncSetupWizard::PASSPHRASE_MIGRATION) 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args.SetString("iframeToShow", "firstpassphrase"); 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string json_args; 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::JSONWriter::Write(&args, false, &json_args); 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow* flow = new SyncSetupFlow(start, end, json_args, 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen container, service); 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Browser* b = BrowserList::GetLastActive(); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen b->ShowOptionsTab(chrome::kSyncSetupSubPage); 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return flow; 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service, 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue* args) { 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetString("iframeToShow", "login"); 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GoogleServiceAuthError& error = service->GetAuthError(); 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!service->last_attempted_user_email().empty()) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetString("user", service->last_attempted_user_email()); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetInteger("error", error.state()); 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("editable_user", true); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 user; 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!service->cros_user().empty()) 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen user = UTF8ToUTF16(service->cros_user()); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen user = service->GetAuthenticatedUsername(); 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetString("user", user); 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetInteger("error", 0); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("editable_user", user.empty()); 993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen } 1003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetString("captchaUrl", error.captcha().image_url.spec()); 1023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 1033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::GetArgsForConfigure(ProfileSyncService* service, 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue* args) { 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetString("iframeToShow", "configure"); 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The SYNC_EVERYTHING case will set this to true. 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncEverything", false); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("keepEverythingSynced", 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kKeepEverythingSynced)); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Bookmarks, Preferences, and Themes are launched for good, there's no 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // going back now. Check if the other data types are registered though. 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet registered_types; 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->GetRegisteredDataTypes(®istered_types); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("passwordsRegistered", 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registered_types.count(syncable::PASSWORDS) > 0); 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("autofillRegistered", 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registered_types.count(syncable::AUTOFILL) > 0); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("extensionsRegistered", 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registered_types.count(syncable::EXTENSIONS) > 0); 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("typedUrlsRegistered", 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registered_types.count(syncable::TYPED_URLS) > 0); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("appsRegistered", 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registered_types.count(syncable::APPS) > 0); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("sessionsRegistered", 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen registered_types.count(syncable::SESSIONS) > 0); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncBookmarks", 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncBookmarks)); 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncPreferences", 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncPreferences)); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncThemes", 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncThemes)); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncPasswords", 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncPasswords)); 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncAutofill", 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncAutofill)); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncExtensions", 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncExtensions)); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncSessions", 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncSessions)); 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncTypedUrls", 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncTypedUrls)); 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("syncApps", 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service->profile()->GetPrefs()->GetBoolean(prefs::kSyncApps)); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Load the parameters for the encryption tab. 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("usePassphrase", service->IsUsingSecondaryPassphrase()); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::GetArgsForEnterPassphrase( 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool tried_creating_explicit_passphrase, 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool tried_setting_explicit_passphrase, 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue* args) { 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetString("iframeToShow", "passphrase"); 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("passphrase_creation_rejected", 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_creating_explicit_passphrase); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args->SetBoolean("passphrase_setting_rejected", 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_setting_explicit_passphrase); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::AttachSyncSetupHandler(SyncSetupFlowHandler* handler) { 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen flow_handler_ = handler; 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ActivateState(current_state_); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::Advance(SyncSetupWizard::State advance_state) { 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!ShouldAdvance(advance_state)) { 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(WARNING) << "Invalid state change from " 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << current_state_ << " to " << advance_state; 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ActivateState(advance_state); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::Focus() { 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(jhawkins): Implement this. 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A callback to notify the delegate that the dialog closed. 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::OnDialogClosed(const std::string& json_retval) { 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(json_retval.empty()); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch container_->set_flow(NULL); // Sever ties from the wizard. 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (current_state_ == SyncSetupWizard::DONE || 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch current_state_ == SyncSetupWizard::DONE_FIRST_TIME) { 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch service_->SetSyncSetupCompleted(); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Record the state at which the user cancelled the signon dialog. 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (current_state_) { 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::GAIA_LOGIN: 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileSyncService::SyncEvent( 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileSyncService::CANCEL_FROM_SIGNON_WITHOUT_AUTH); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::GAIA_SUCCESS: 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileSyncService::SyncEvent( 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileSyncService::CANCEL_DURING_SIGNON); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::CONFIGURE: 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::ENTER_PASSPHRASE: 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::SETTING_UP: 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(atwilson): Treat a close during ENTER_PASSPHRASE like a 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Cancel + Skip (i.e. call OnPassphraseCancel()). http://crbug.com/74645 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileSyncService::SyncEvent( 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ProfileSyncService::CANCEL_DURING_CONFIGURE); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::DONE_FIRST_TIME: 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::DONE: 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(sync): rename this histogram; it's tracking authorization AND 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // initial sync download time. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UMA_HISTOGRAM_MEDIUM_TIMES("Sync.UserPerceivedAuthorizationTime", 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeTicks::Now() - login_start_time_); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch service_->OnUserCancelledDialog(); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete this; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::OnUserSubmittedAuth(const std::string& username, 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& password, 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& captcha, 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& access_code) { 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_->OnUserSubmittedAuth(username, password, captcha, access_code); 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::OnUserConfigured(const SyncConfiguration& configuration) { 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Go to the "loading..." screen. 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Advance(SyncSetupWizard::SETTING_UP); 23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If we are activating the passphrase, we need to have one supplied. 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(service_->IsUsingSecondaryPassphrase() || 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !configuration.use_secondary_passphrase || 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen configuration.secondary_passphrase.length() > 0); 24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (configuration.use_secondary_passphrase && 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen !service_->IsUsingSecondaryPassphrase()) { 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_->SetPassphrase(configuration.secondary_passphrase, true, true); 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_creating_explicit_passphrase_ = true; 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_->OnUserChoseDatatypes(configuration.sync_everything, 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen configuration.data_types); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::OnPassphraseEntry(const std::string& passphrase) { 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Advance(SyncSetupWizard::SETTING_UP); 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_->SetPassphrase(passphrase, true, false); 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_setting_explicit_passphrase_ = true; 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::OnPassphraseCancel() { 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If the user cancels when being asked for the passphrase, 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // just disable encrypted sync and continue setting up. 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (current_state_ == SyncSetupWizard::ENTER_PASSPHRASE) 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DisablePasswordSync(service_); 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Advance(SyncSetupWizard::SETTING_UP); 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(jhawkins): Remove this method. 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::OnFirstPassphraseEntry(const std::string& option, 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& passphrase) { 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(jhawkins): Use this method instead of a direct link in the html. 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::OnGoToDashboard() { 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserList::GetLastActive()->OpenPrivacyDashboardTabAndActivate(); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use static Run method to get an instance. 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncSetupFlow::SyncSetupFlow(SyncSetupWizard::State start_state, 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupWizard::State end_state, 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& args, 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlowContainer* container, 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ProfileSyncService* service) 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : container_(container), 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dialog_start_args_(args), 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_state_(start_state), 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen end_state_(end_state), 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen login_start_time_(base::TimeTicks::Now()), 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen flow_handler_(NULL), 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_(service), 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_creating_explicit_passphrase_(false), 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_setting_explicit_passphrase_(false) { 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns true if the flow should advance to |state| based on |current_state_|. 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SyncSetupFlow::ShouldAdvance(SyncSetupWizard::State state) { 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (state) { 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::GAIA_LOGIN: 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return current_state_ == SyncSetupWizard::FATAL_ERROR || 301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen current_state_ == SyncSetupWizard::GAIA_LOGIN || 302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen current_state_ == SyncSetupWizard::SETTING_UP; 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::GAIA_SUCCESS: 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return current_state_ == SyncSetupWizard::GAIA_LOGIN; 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen case SyncSetupWizard::SYNC_EVERYTHING: 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::CONFIGURE: 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return current_state_ == SyncSetupWizard::GAIA_SUCCESS; 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::ENTER_PASSPHRASE: 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return current_state_ == SyncSetupWizard::SYNC_EVERYTHING || 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_state_ == SyncSetupWizard::CONFIGURE || 311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_state_ == SyncSetupWizard::SETTING_UP; 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case SyncSetupWizard::PASSPHRASE_MIGRATION: 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return current_state_ == SyncSetupWizard::GAIA_LOGIN; 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(current_state_ != SyncSetupWizard::GAIA_LOGIN && 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_state_ != SyncSetupWizard::GAIA_SUCCESS); 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::SETTING_UP: 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return current_state_ == SyncSetupWizard::SYNC_EVERYTHING || 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_state_ == SyncSetupWizard::CONFIGURE || 3213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen current_state_ == SyncSetupWizard::ENTER_PASSPHRASE || 3223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen current_state_ == SyncSetupWizard::PASSPHRASE_MIGRATION; 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::FATAL_ERROR: 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; // You can always hit the panic button. 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::DONE_FIRST_TIME: 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::DONE: 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return current_state_ == SyncSetupWizard::SETTING_UP || 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_state_ == SyncSetupWizard::ENTER_PASSPHRASE; 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Unhandled State: " << state; 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SyncSetupFlow::ActivateState(SyncSetupWizard::State state) { 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen switch (state) { 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::GAIA_LOGIN: { 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue args; 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncSetupFlow::GetArgsForGaiaLogin(service_, &args); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_handler_->ShowGaiaLogin(args); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::GAIA_SUCCESS: 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (end_state_ == SyncSetupWizard::GAIA_SUCCESS) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_handler_->ShowGaiaSuccessAndClose(); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen state = SyncSetupWizard::SYNC_EVERYTHING; 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Fall through. 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen case SyncSetupWizard::SYNC_EVERYTHING: { 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DictionaryValue args; 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow::GetArgsForConfigure(service_, &args); 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen args.SetBoolean("syncEverything", true); 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen flow_handler_->ShowConfigure(args); 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen break; 356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::CONFIGURE: { 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue args; 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SyncSetupFlow::GetArgsForConfigure(service_, &args); 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick flow_handler_->ShowConfigure(args); 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 3633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen case SyncSetupWizard::ENTER_PASSPHRASE: { 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryValue args; 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow::GetArgsForEnterPassphrase( 366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_creating_explicit_passphrase_, 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tried_setting_explicit_passphrase_, 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &args); 369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick flow_handler_->ShowPassphraseEntry(args); 370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 3723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen case SyncSetupWizard::PASSPHRASE_MIGRATION: { 373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryValue args; 3743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen args.SetString("iframeToShow", "firstpassphrase"); 3753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen flow_handler_->ShowFirstPassphrase(args); 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: { 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue args; 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SyncSetupFlow::GetArgsForConfigure(service_, &args); 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick args.SetBoolean("was_aborted", true); 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick flow_handler_->ShowConfigure(args); 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case SyncSetupWizard::SETTING_UP: { 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick flow_handler_->ShowSettingUp(); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::FATAL_ERROR: { 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This shows the user the "Could not connect to server" error. 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(sync): Update this error messaging. 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue args; 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncSetupFlow::GetArgsForGaiaLogin(service_, &args); 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick args.SetInteger("error", GoogleServiceAuthError::CONNECTION_FAILED); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_handler_->ShowGaiaLogin(args); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::DONE_FIRST_TIME: 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_handler_->ShowFirstTimeDone( 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF16ToWide(service_->GetAuthenticatedUsername())); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SyncSetupWizard::DONE: 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_handler_->ShowSetupDone( 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF16ToWide(service_->GetAuthenticatedUsername())); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Invalid advance state: " << state; 4084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_state_ = state; 4103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 411