sync_setup_flow.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 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 "app/gfx/font_util.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/json/json_reader.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/json/json_writer.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_list.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/cocoa/html_dialog_window_controller_cppsafe.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/dom_ui/dom_ui_util.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/platform_util.h"
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/profile.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/renderer_host/render_view_host.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/profile_sync_service.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_contents.h"
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/net/gaia/google_service_auth_error.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "gfx/font.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// XPath expression for finding specific iframes.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const wchar_t* kLoginIFrameXPath = L"//iframe[@id='login']";
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const wchar_t* kChooseDataTypesIFrameXPath =
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    L"//iframe[@id='configure']";
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const wchar_t* kPassphraseIFrameXPath =
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    L"//iframe[@id='passphrase']";
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const wchar_t* kDoneIframeXPath = L"//iframe[@id='done']";
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::RegisterMessages() {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dom_ui_->RegisterMessageCallback("SubmitAuth",
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &FlowHandler::HandleSubmitAuth));
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  dom_ui_->RegisterMessageCallback("Configure",
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NewCallback(this, &FlowHandler::HandleConfigure));
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  dom_ui_->RegisterMessageCallback("Passphrase",
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NewCallback(this, &FlowHandler::HandlePassphraseEntry));
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic bool GetAuthData(const std::string& json,
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        std::string* username,
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        std::string* password,
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        std::string* captcha,
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        std::string* access_code) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false));
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY))
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get());
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetString("user", username) ||
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      !result->GetString("pass", password) ||
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !result->GetString("captcha", captcha) ||
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !result->GetString("access_code", access_code)) {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic bool GetPassphrase(const std::string& json, std::string* passphrase) {
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false));
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY))
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get());
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return result->GetString("passphrase", passphrase);
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic bool GetConfiguration(const std::string& json,
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             SyncConfiguration* config) {
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false));
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY))
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get());
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!result->GetBoolean("keepEverythingSynced", &config->sync_everything))
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These values need to be kept in sync with where they are written in
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // choose_datatypes.html.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_bookmarks;
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncBookmarks", &sync_bookmarks))
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_bookmarks)
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::BOOKMARKS);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_preferences;
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncPreferences", &sync_preferences))
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_preferences)
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::PREFERENCES);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_themes;
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncThemes", &sync_themes))
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_themes)
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::THEMES);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_passwords;
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncPasswords", &sync_passwords))
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_passwords)
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::PASSWORDS);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_autofill;
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncAutofill", &sync_autofill))
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_autofill)
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::AUTOFILL);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_extensions;
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncExtensions", &sync_extensions))
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_extensions)
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::EXTENSIONS);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool sync_typed_urls;
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncTypedUrls", &sync_typed_urls))
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_typed_urls)
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::TYPED_URLS);
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool sync_sessions;
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!result->GetBoolean("syncSessions", &sync_sessions))
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (sync_sessions)
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::SESSIONS);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool sync_apps;
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!result->GetBoolean("syncApps", &sync_apps))
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return false;
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (sync_apps)
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    config->data_types.insert(syncable::APPS);
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Encyption settings.
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!result->GetBoolean("usePassphrase", &config->use_secondary_passphrase))
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FlowHandler::HandleSubmitAuth(const ListValue* args) {
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string json(dom_ui_util::GetJsonResponseFromFirstArgumentInList(args));
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string username, password, captcha, access_code;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (json.empty())
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!GetAuthData(json, &username, &password, &captcha, &access_code)) {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The page sent us something that we didn't understand.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This probably indicates a programming error.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (flow_)
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    flow_->OnUserSubmittedAuth(username, password, captcha, access_code);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FlowHandler::HandleConfigure(const ListValue* args) {
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string json(dom_ui_util::GetJsonResponseFromFirstArgumentInList(args));
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SyncConfiguration configuration;
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (json.empty())
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!GetConfiguration(json, &configuration)) {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The page sent us something that we didn't understand.
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This probably indicates a programming error.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(flow_);
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  flow_->OnUserConfigured(configuration);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FlowHandler::HandlePassphraseEntry(const ListValue* args) {
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string json(dom_ui_util::GetJsonResponseFromFirstArgumentInList(args));
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (json.empty())
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string passphrase;
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!GetPassphrase(json, &passphrase)) {
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Couldn't understand what the page sent.  Indicates a programming error.
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    NOTREACHED();
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(flow_);
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  flow_->OnPassphraseEntry(passphrase);
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called by SyncSetupFlow::Advance.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::ShowGaiaLogin(const DictionaryValue& args) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whenever you start a wizard, you pass in an arg so it starts on the right
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // iframe (see setup_flow.html's showTheRightIframe() method).  But when you
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // transition from one flow to another, you have to explicitly call the JS
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // function to show the next iframe.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // So if you ever made a wizard that involved a gaia login as not the first
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // frame, this call would be necessary to ensure that this method actually
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shows the gaia login.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (dom_ui_)
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    dom_ui_->CallJavascriptFunction(L"showGaiaLoginIframe");
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string json;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::JSONWriter::Write(&args, false, &json);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring javascript = std::wstring(L"showGaiaLogin") +
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"(" + UTF8ToWide(json) + L");";
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kLoginIFrameXPath, javascript);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::ShowGaiaSuccessAndClose() {
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kLoginIFrameXPath, L"showGaiaSuccessAndClose();");
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::ShowGaiaSuccessAndSettingUp() {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kLoginIFrameXPath,
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            L"showGaiaSuccessAndSettingUp();");
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called by SyncSetupFlow::Advance.
233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FlowHandler::ShowConfigure(const DictionaryValue& args) {
234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If you're starting the wizard at the configure screen (i.e. from
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // "Customize Sync"), this will be redundant.  However, if you're coming from
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // another wizard state, this will make sure Choose Data Types is on top.
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (dom_ui_)
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    dom_ui_->CallJavascriptFunction(L"showConfigure");
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string json;
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::JSONWriter::Write(&args, false, &json);
242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::wstring javascript = std::wstring(L"initializeConfigureDialog") +
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"(" + UTF8ToWide(json) + L");";
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kChooseDataTypesIFrameXPath, javascript);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FlowHandler::ShowPassphraseEntry(const DictionaryValue& args) {
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (dom_ui_)
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    dom_ui_->CallJavascriptFunction(L"showPassphrase");
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string json;
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::JSONWriter::Write(&args, false, &json);
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::wstring script = std::wstring(L"setupPassphraseDialog") +
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      L"(" + UTF8ToWide(json) + L");";
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ExecuteJavascriptInIFrame(kPassphraseIFrameXPath, script);
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FlowHandler::ShowSettingUp() {
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (dom_ui_)
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    dom_ui_->CallJavascriptFunction(L"showSettingUp");
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::ShowSetupDone(const std::wstring& user) {
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  StringValue synced_to_string(l10n_util::GetStringFUTF8(
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      IDS_SYNC_NTP_SYNCED_TO, WideToUTF16Hack(user)));
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string json;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::JSONWriter::Write(&synced_to_string, false, &json);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring javascript = std::wstring(L"setSyncedToUser") +
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"(" + UTF8ToWide(json) + L");";
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kDoneIframeXPath, javascript);
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (dom_ui_)
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    dom_ui_->CallJavascriptFunction(L"showSetupDone", synced_to_string);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kDoneIframeXPath,
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            L"onPageShown();");
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::ShowFirstTimeDone(const std::wstring& user) {
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteJavascriptInIFrame(kDoneIframeXPath,
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            L"setShowFirstTimeSetupSummary();");
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowSetupDone(user);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FlowHandler::ExecuteJavascriptInIFrame(const std::wstring& iframe_xpath,
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const std::wstring& js) {
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (dom_ui_) {
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RenderViewHost* rvh = dom_ui_->tab_contents()->render_view_host();
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rvh->ExecuteJavascriptInWebFrame(iframe_xpath, js);
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use static Run method to get an instance.
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSyncSetupFlow::SyncSetupFlow(SyncSetupWizard::State start_state,
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             SyncSetupWizard::State end_state,
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const std::string& args,
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             SyncSetupFlowContainer* container,
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             ProfileSyncService* service)
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : container_(container),
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      dialog_start_args_(args),
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      current_state_(start_state),
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      end_state_(end_state),
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      login_start_time_(base::TimeTicks::Now()),
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      flow_handler_(new FlowHandler()),
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      owns_flow_handler_(true),
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      configuration_pending_(false),
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service_(service),
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      html_dialog_window_(NULL) {
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  flow_handler_->set_flow(this);
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSyncSetupFlow::~SyncSetupFlow() {
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  flow_handler_->set_flow(NULL);
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (owns_flow_handler_) {
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete flow_handler_;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::GetDialogSize(gfx::Size* size) const {
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* prefs = service_->profile()->GetPrefs();
3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::Font approximate_web_font = gfx::Font(
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UTF8ToWide(prefs->GetString(prefs::kWebKitSansSerifFontFamily)),
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      prefs->GetInteger(prefs::kWebKitDefaultFontSize));
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *size = gfx::GetLocalizedContentsSizeForFont(
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IDS_SYNC_SETUP_WIZARD_WIDTH_CHARS,
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IDS_SYNC_SETUP_WIZARD_HEIGHT_LINES,
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      approximate_web_font);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE(akalin): This is a hack to work around a problem with font height on
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // windows.  Basically font metrics are incorrectly returned in logical units
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // instead of pixels on Windows.  Logical units are very commonly 96 DPI
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // so our localized char/line counts are too small by a factor of 96/72.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // So we compensate for this on non-windows platform.
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(akalin): Remove this hack once we fix the windows font problem (or at
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // least work around it in some other place).
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  float scale_hack = 96.f/72.f;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size->set_width(size->width() * scale_hack);
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size->set_height(size->height() * scale_hack);
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A callback to notify the delegate that the dialog closed.
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::OnDialogClosed(const std::string& json_retval) {
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(json_retval.empty());
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  container_->set_flow(NULL);  // Sever ties from the wizard.
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (current_state_ == SyncSetupWizard::DONE ||
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      current_state_ == SyncSetupWizard::DONE_FIRST_TIME) {
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    service_->SetSyncSetupCompleted();
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Record the state at which the user cancelled the signon dialog.
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (current_state_) {
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::GAIA_LOGIN:
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ProfileSyncService::SyncEvent(
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ProfileSyncService::CANCEL_FROM_SIGNON_WITHOUT_AUTH);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::GAIA_SUCCESS:
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ProfileSyncService::SyncEvent(
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          ProfileSyncService::CANCEL_DURING_SIGNON);
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::CONFIGURE:
365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::ENTER_PASSPHRASE:
366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::SETTING_UP:
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ProfileSyncService::SyncEvent(
368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          ProfileSyncService::CANCEL_DURING_CONFIGURE);
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::DONE_FIRST_TIME:
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::DONE:
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // TODO(sync): rename this histogram; it's tracking authorization AND
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // initial sync download time.
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UMA_HISTOGRAM_MEDIUM_TIMES("Sync.UserPerceivedAuthorizationTime",
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 base::TimeTicks::Now() - login_start_time_);
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service_->OnUserCancelledDialog();
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete this;
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service,
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        DictionaryValue* args) {
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetString("iframeToShow", "login");
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GoogleServiceAuthError& error = service->GetAuthError();
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!service->last_attempted_user_email().empty()) {
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->SetString("user", service->last_attempted_user_email());
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->SetInteger("error", error.state());
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->SetBoolean("editable_user", true);
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    string16 user(service->GetAuthenticatedUsername());
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->SetString("user", user);
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->SetInteger("error", 0);
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->SetBoolean("editable_user", user.empty());
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetString("captchaUrl", error.captcha().image_url.spec());
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SyncSetupFlow::GetArgsForEnterPassphrase(
406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const ProfileSyncService* service, DictionaryValue* args) {
407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  args->SetString("iframeToShow", "passphrase");
408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (service->IsUsingSecondaryPassphrase())
409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    args->SetString("mode", "enter");
410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else
411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    args->SetString("mode", "gaia");
412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SyncSetupFlow::GetArgsForConfigure(ProfileSyncService* service,
416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        DictionaryValue* args) {
417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  args->SetString("iframeToShow", "configure");
418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // By default start on the data types tab.
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  args->SetString("initialTab", "data-type");
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("keepEverythingSynced",
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kKeepEverythingSynced));
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Bookmarks, Preferences, and Themes are launched for good, there's no
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // going back now.  Check if the other data types are registered though.
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  syncable::ModelTypeSet registered_types;
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service->GetRegisteredDataTypes(&registered_types);
4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("passwordsRegistered",
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      registered_types.count(syncable::PASSWORDS) > 0);
4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("autofillRegistered",
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      registered_types.count(syncable::AUTOFILL) > 0);
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("extensionsRegistered",
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      registered_types.count(syncable::EXTENSIONS) > 0);
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("typedUrlsRegistered",
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      registered_types.count(syncable::TYPED_URLS) > 0);
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("appsRegistered",
4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      registered_types.count(syncable::APPS) > 0);
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("sessionsRegistered",
4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      registered_types.count(syncable::SESSIONS) > 0);
4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncBookmarks",
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncBookmarks));
4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncPreferences",
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncPreferences));
4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncThemes",
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncThemes));
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncPasswords",
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncPasswords));
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncAutofill",
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncAutofill));
4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncExtensions",
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncExtensions));
4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncSessions",
4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncSessions));
4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncTypedUrls",
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncTypedUrls));
4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  args->SetBoolean("syncApps",
4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      service->profile()->GetPrefs()->GetBoolean(prefs::kSyncApps));
459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Load the parameters for the encryption tab.
461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  args->SetBoolean("usePassphrase", service->IsUsingSecondaryPassphrase());
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::GetDOMMessageHandlers(
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<DOMMessageHandler*>* handlers) const {
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  handlers->push_back(flow_handler_);
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We don't own flow_handler_ anymore, but it sticks around until at least
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // right after OnDialogClosed() is called (and this object is destroyed).
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  owns_flow_handler_ = false;
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Returns true if the flow should advance to |state| based on |current_state_|.
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SyncSetupFlow::ShouldAdvance(SyncSetupWizard::State state) {
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (state) {
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::GAIA_LOGIN:
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return current_state_ == SyncSetupWizard::FATAL_ERROR ||
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             current_state_ == SyncSetupWizard::GAIA_LOGIN;
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::GAIA_SUCCESS:
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return current_state_ == SyncSetupWizard::GAIA_LOGIN;
480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::CONFIGURE:
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return current_state_ == SyncSetupWizard::GAIA_SUCCESS;
482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::CREATE_PASSPHRASE:
483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return current_state_ == SyncSetupWizard::CONFIGURE;
484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::ENTER_PASSPHRASE:
485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return current_state_ == SyncSetupWizard::CONFIGURE ||
486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             current_state_ == SyncSetupWizard::SETTING_UP;
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR:
488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return current_state_ == SyncSetupWizard::CONFIGURE;
489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::SETTING_UP:
490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return current_state_ == SyncSetupWizard::CONFIGURE ||
491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             current_state_ == SyncSetupWizard::CREATE_PASSPHRASE ||
492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             current_state_ == SyncSetupWizard::ENTER_PASSPHRASE;
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::FATAL_ERROR:
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;  // You can always hit the panic button.
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::DONE_FIRST_TIME:
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::DONE:
497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return current_state_ == SyncSetupWizard::SETTING_UP ||
498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             current_state_ == SyncSetupWizard::ENTER_PASSPHRASE;
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "Unhandled State: " << state;
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::Advance(SyncSetupWizard::State advance_state) {
506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!ShouldAdvance(advance_state)) {
507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    LOG(WARNING) << "Invalid state change from "
508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                 << current_state_ << " to " << advance_state;
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
510731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (advance_state) {
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::GAIA_LOGIN: {
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DictionaryValue args;
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SyncSetupFlow::GetArgsForGaiaLogin(service_, &args);
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      flow_handler_->ShowGaiaLogin(args);
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::GAIA_SUCCESS:
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (end_state_ == SyncSetupWizard::GAIA_SUCCESS) {
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        flow_handler_->ShowGaiaSuccessAndClose();
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        break;
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      advance_state = SyncSetupWizard::CONFIGURE;
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      //  Fall through.
526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::CONFIGURE: {
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DictionaryValue args;
528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SyncSetupFlow::GetArgsForConfigure(service_, &args);
529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      args.SetString("initialTab", "data-type");
530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      flow_handler_->ShowConfigure(args);
531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::CREATE_PASSPHRASE: {
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      DictionaryValue args;
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      args.SetString("mode", "new");
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      flow_handler_->ShowPassphraseEntry(args);
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::ENTER_PASSPHRASE: {
540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      DictionaryValue args;
541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SyncSetupFlow::GetArgsForEnterPassphrase(service_, &args);
542731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      flow_handler_->ShowPassphraseEntry(args);
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::SETUP_ABORTED_BY_PENDING_CLEAR: {
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DictionaryValue args;
547731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SyncSetupFlow::GetArgsForConfigure(service_, &args);
5483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      args.SetBoolean("was_aborted", true);
549731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      flow_handler_->ShowConfigure(args);
550731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case SyncSetupWizard::SETTING_UP: {
553731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      flow_handler_->ShowSettingUp();
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::FATAL_ERROR: {
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // This shows the user the "Could not connect to server" error.
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // TODO(sync): Update this error messaging.
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DictionaryValue args;
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SyncSetupFlow::GetArgsForGaiaLogin(service_, &args);
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      args.SetInteger("error", GoogleServiceAuthError::CONNECTION_FAILED);
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      flow_handler_->ShowGaiaLogin(args);
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::DONE_FIRST_TIME:
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      flow_handler_->ShowFirstTimeDone(
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          UTF16ToWide(service_->GetAuthenticatedUsername()));
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SyncSetupWizard::DONE:
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      flow_handler_->ShowSetupDone(
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          UTF16ToWide(service_->GetAuthenticatedUsername()));
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "Invalid advance state: " << advance_state;
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  current_state_ = advance_state;
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupFlow::Focus() {
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (html_dialog_window_) {
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    platform_util::ActivateWindow(html_dialog_window_);
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(csilv): We don't currently have a way to get the reference to the
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dialog on windows/linux.  This can be resolved by a cross platform
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // implementation of HTML dialogs as described by akalin below.
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTIMPLEMENTED();
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_MACOSX)
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service,
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  SyncSetupFlowContainer* container,
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  SyncSetupWizard::State start,
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  SyncSetupWizard::State end,
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  gfx::NativeWindow parent_window) {
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue args;
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (start == SyncSetupWizard::GAIA_LOGIN)
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SyncSetupFlow::GetArgsForGaiaLogin(service, &args);
601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else if (start == SyncSetupWizard::CONFIGURE)
602731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SyncSetupFlow::GetArgsForConfigure(service, &args);
603731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else if (start == SyncSetupWizard::ENTER_PASSPHRASE)
604731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SyncSetupFlow::GetArgsForEnterPassphrase(service, &args);
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string json_args;
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::JSONWriter::Write(&args, false, &json_args);
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SyncSetupFlow* flow = new SyncSetupFlow(start, end, json_args,
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      container, service);
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(akalin): Figure out a cleaner way to do this than to have this
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // gross per-OS behavior, i.e. have a cross-platform ShowHtmlDialog()
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // function that is not tied to a browser instance.  Note that if we do
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that, we'll have to fix sync_setup_wizard_unittest.cc as it relies on
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // being able to intercept ShowHtmlDialog() calls.
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  flow->html_dialog_window_ =
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      html_dialog_window_controller::ShowHtmlDialog(
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          flow, service->profile());
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* b = BrowserList::GetLastActive();
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (b) {
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    b->BrowserShowHtmlDialog(flow, parent_window);
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete flow;
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_MACOSX)
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return flow;
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
631731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SyncSetupFlow::OnUserSubmittedAuth(const std::string& username,
632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        const std::string& password,
633731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        const std::string& captcha,
634731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        const std::string& access_code) {
635731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  service_->OnUserSubmittedAuth(username, password, captcha, access_code);
636731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SyncSetupFlow::OnUserConfigured(const SyncConfiguration& configuration) {
639731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Store the configuration in case we need more information.
640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  configuration_ = configuration;
641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  configuration_pending_ = true;
642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If the user is activating secondary passphrase for the first time,
644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // we need to prompt them to enter one.
645731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (configuration.use_secondary_passphrase &&
646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !service_->IsUsingSecondaryPassphrase()) {
647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Advance(SyncSetupWizard::CREATE_PASSPHRASE);
648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  OnConfigurationComplete();
652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SyncSetupFlow::OnConfigurationComplete() {
655731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!configuration_pending_)
656731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
657731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
658731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Go to the "loading..." screen."
659731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Advance(SyncSetupWizard::SETTING_UP);
660731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
661731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we are activating the passphrase, we need to have one supplied.
662731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(service_->IsUsingSecondaryPassphrase() ||
663731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         !configuration_.use_secondary_passphrase ||
664731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick         configuration_.secondary_passphrase.length() > 0);
665731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
666731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (configuration_.use_secondary_passphrase &&
667731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      !service_->IsUsingSecondaryPassphrase())
668731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    service_->SetSecondaryPassphrase(configuration_.secondary_passphrase);
669731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
670731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  service_->OnUserChoseDatatypes(configuration_.sync_everything,
671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                 configuration_.data_types);
672731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  configuration_pending_ = false;
674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid SyncSetupFlow::OnPassphraseEntry(const std::string& passphrase) {
677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (current_state_ == SyncSetupWizard::ENTER_PASSPHRASE) {
678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    service_->SetSecondaryPassphrase(passphrase);
679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Advance(SyncSetupWizard::SETTING_UP);
680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else if (configuration_pending_) {
681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    configuration_.secondary_passphrase = passphrase;
682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    OnConfigurationComplete();
683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
685