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(&registered_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