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(®istered_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