Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: chrome/browser/sync/sync_setup_flow.cc

Issue 2880001: HTML sync setup UI. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/sync/sync_setup_flow.h ('k') | chrome/browser/sync/sync_setup_wizard.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync/sync_setup_flow.h" 5 #include "chrome/browser/sync/sync_setup_flow.h"
6 6
7 #include "app/gfx/font_util.h" 7 #include "app/gfx/font_util.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/histogram.h" 9 #include "base/histogram.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
(...skipping 14 matching lines...) Expand all
25 #include "chrome/browser/renderer_host/render_view_host.h" 25 #include "chrome/browser/renderer_host/render_view_host.h"
26 #include "chrome/browser/sync/profile_sync_service.h" 26 #include "chrome/browser/sync/profile_sync_service.h"
27 #include "chrome/browser/sync/syncable/model_type.h" 27 #include "chrome/browser/sync/syncable/model_type.h"
28 #include "chrome/browser/tab_contents/tab_contents.h" 28 #include "chrome/browser/tab_contents/tab_contents.h"
29 #include "chrome/common/pref_names.h" 29 #include "chrome/common/pref_names.h"
30 #include "gfx/font.h" 30 #include "gfx/font.h"
31 #include "grit/locale_settings.h" 31 #include "grit/locale_settings.h"
32 32
33 // XPath expression for finding specific iframes. 33 // XPath expression for finding specific iframes.
34 static const wchar_t* kLoginIFrameXPath = L"//iframe[@id='login']"; 34 static const wchar_t* kLoginIFrameXPath = L"//iframe[@id='login']";
35 static const wchar_t* kChooseDataTypesIFrameXPath =
36 L"//iframe[@id='choose_data_types']";
35 static const wchar_t* kDoneIframeXPath = L"//iframe[@id='done']"; 37 static const wchar_t* kDoneIframeXPath = L"//iframe[@id='done']";
36 38
37 void FlowHandler::RegisterMessages() { 39 void FlowHandler::RegisterMessages() {
38 dom_ui_->RegisterMessageCallback("ShowCustomize", 40 dom_ui_->RegisterMessageCallback("ShowCustomize",
39 NewCallback(this, &FlowHandler::HandleUserClickedCustomize)); 41 NewCallback(this, &FlowHandler::HandleUserClickedCustomize));
40 // On OS X, the customize dialog is modal to the HTML window so we 42 // On OS X, the customize dialog is modal to the HTML window so we
41 // don't need to hook up the two functions below. 43 // don't need to hook up the two functions below.
42 #if defined(OS_WIN) || defined(OS_LINUX) 44 #if defined(OS_WIN) || defined(OS_LINUX)
43 dom_ui_->RegisterMessageCallback("ClickCustomizeOk", 45 dom_ui_->RegisterMessageCallback("ClickCustomizeOk",
44 NewCallback(this, &FlowHandler::ClickCustomizeOk)); 46 NewCallback(this, &FlowHandler::ClickCustomizeOk));
45 dom_ui_->RegisterMessageCallback("ClickCustomizeCancel", 47 dom_ui_->RegisterMessageCallback("ClickCustomizeCancel",
46 NewCallback(this, &FlowHandler::ClickCustomizeCancel)); 48 NewCallback(this, &FlowHandler::ClickCustomizeCancel));
47 #endif 49 #endif
48 dom_ui_->RegisterMessageCallback("SubmitAuth", 50 dom_ui_->RegisterMessageCallback("SubmitAuth",
49 NewCallback(this, &FlowHandler::HandleSubmitAuth)); 51 NewCallback(this, &FlowHandler::HandleSubmitAuth));
52 dom_ui_->RegisterMessageCallback("ChooseDataTypes",
53 NewCallback(this, &FlowHandler::HandleChooseDataTypes));
50 } 54 }
51 55
52 static bool GetAuthData(const std::string& json, 56 static bool GetAuthData(const std::string& json,
53 std::string* username, std::string* password, std::string* captcha) { 57 std::string* username, std::string* password, std::string* captcha) {
54 scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false)); 58 scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false));
55 if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY)) 59 if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY))
56 return false; 60 return false;
57 61
58 DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get()); 62 DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get());
59 if (!result->GetString(L"user", username) || 63 if (!result->GetString(L"user", username) ||
60 !result->GetString(L"pass", password) || 64 !result->GetString(L"pass", password) ||
61 !result->GetString(L"captcha", captcha)) { 65 !result->GetString(L"captcha", captcha)) {
62 return false; 66 return false;
63 } 67 }
64 return true; 68 return true;
65 } 69 }
66 70
71 static bool GetDataTypeChoiceData(const std::string& json,
72 bool* sync_everything, syncable::ModelTypeSet* data_types) {
73 scoped_ptr<Value> parsed_value(base::JSONReader::Read(json, false));
74 if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY))
75 return false;
76
77 DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get());
78 if (!result->GetBoolean(L"keepEverythingSynced", sync_everything))
79 return false;
80
81 // These values need to be kept in sync with where they are written in
82 // choose_datatypes.html.
83 bool sync_bookmarks;
84 if (!result->GetBoolean(L"syncBookmarks", &sync_bookmarks))
85 return false;
86 if (sync_bookmarks)
87 data_types->insert(syncable::BOOKMARKS);
88
89 bool sync_preferences;
90 if (!result->GetBoolean(L"syncPreferences", &sync_preferences))
91 return false;
92 if (sync_preferences)
93 data_types->insert(syncable::PREFERENCES);
94
95 bool sync_themes;
96 if (!result->GetBoolean(L"syncThemes", &sync_themes))
97 return false;
98 if (sync_themes)
99 data_types->insert(syncable::THEMES);
100
101 bool sync_passwords;
102 if (!result->GetBoolean(L"syncPasswords", &sync_passwords))
103 return false;
104 if (sync_passwords)
105 data_types->insert(syncable::PASSWORDS);
106
107 bool sync_autofill;
108 if (!result->GetBoolean(L"syncAutofill", &sync_autofill))
109 return false;
110 if (sync_autofill)
111 data_types->insert(syncable::AUTOFILL);
112
113 bool sync_extensions;
114 if (!result->GetBoolean(L"syncExtensions", &sync_extensions))
115 return false;
116 if (sync_extensions)
117 data_types->insert(syncable::EXTENSIONS);
118
119 bool sync_typed_urls;
120 if (!result->GetBoolean(L"syncTypedUrls", &sync_typed_urls))
121 return false;
122 if (sync_typed_urls)
123 data_types->insert(syncable::TYPED_URLS);
124
125 return true;
126 }
127
67 void FlowHandler::HandleUserClickedCustomize(const Value* value) { 128 void FlowHandler::HandleUserClickedCustomize(const Value* value) {
68 if (flow_) 129 if (flow_)
69 flow_->OnUserClickedCustomize(); 130 flow_->OnUserClickedCustomize();
70 } 131 }
71 132
72 // To simulate the user clicking "OK" or "Cancel" on the Customize Sync dialog 133 // To simulate the user clicking "OK" or "Cancel" on the Customize Sync dialog
73 void FlowHandler::ClickCustomizeOk(const Value* value) { 134 void FlowHandler::ClickCustomizeOk(const Value* value) {
74 if (flow_) 135 if (flow_)
75 flow_->ClickCustomizeOk(); 136 flow_->ClickCustomizeOk();
76 } 137 }
(...skipping 27 matching lines...) Expand all
104 // The page sent us something that we didn't understand. 165 // The page sent us something that we didn't understand.
105 // This probably indicates a programming error. 166 // This probably indicates a programming error.
106 NOTREACHED(); 167 NOTREACHED();
107 return; 168 return;
108 } 169 }
109 170
110 if (flow_) 171 if (flow_)
111 flow_->OnUserSubmittedAuth(username, password, captcha); 172 flow_->OnUserSubmittedAuth(username, password, captcha);
112 } 173 }
113 174
175
176 void FlowHandler::HandleChooseDataTypes(const Value* value) {
177 std::string json(dom_ui_util::GetJsonResponseFromFirstArgumentInList(value));
178 bool sync_everything;
179 syncable::ModelTypeSet chosen_types;
180 if (json.empty())
181 return;
182
183 if (!GetDataTypeChoiceData(json, &sync_everything, &chosen_types)) {
184 // The page sent us something that we didn't understand.
185 // This probably indicates a programming error.
186 NOTREACHED();
187 return;
188 }
189
190 DCHECK(flow_);
191 flow_->OnUserChoseDataTypes(sync_everything, chosen_types);
192
193 return;
194 }
195
114 // Called by SyncSetupFlow::Advance. 196 // Called by SyncSetupFlow::Advance.
115 void FlowHandler::ShowGaiaLogin(const DictionaryValue& args) { 197 void FlowHandler::ShowGaiaLogin(const DictionaryValue& args) {
198 // Whenever you start a wizard, you pass in an arg so it starts on the right
199 // iframe (see setup_flow.html's showTheRightIframe() method). But when you
200 // transition from one flow to another, you have to explicitly call the JS
201 // function to show the next iframe.
202 // So if you ever made a wizard that involved a gaia login as not the first
203 // frame, this call would be necessary to ensure that this method actually
204 // shows the gaia login.
205 if (dom_ui_)
206 dom_ui_->CallJavascriptFunction(L"showGaiaLoginIframe");
207
116 std::string json; 208 std::string json;
117 base::JSONWriter::Write(&args, false, &json); 209 base::JSONWriter::Write(&args, false, &json);
118 std::wstring javascript = std::wstring(L"showGaiaLogin") + 210 std::wstring javascript = std::wstring(L"showGaiaLogin") +
119 L"(" + UTF8ToWide(json) + L");"; 211 L"(" + UTF8ToWide(json) + L");";
120 ExecuteJavascriptInIFrame(kLoginIFrameXPath, javascript); 212 ExecuteJavascriptInIFrame(kLoginIFrameXPath, javascript);
121 } 213 }
122 214
123 void FlowHandler::ShowGaiaSuccessAndClose() { 215 void FlowHandler::ShowGaiaSuccessAndClose() {
124 ExecuteJavascriptInIFrame(kLoginIFrameXPath, L"showGaiaSuccessAndClose();"); 216 ExecuteJavascriptInIFrame(kLoginIFrameXPath, L"showGaiaSuccessAndClose();");
125 } 217 }
126 218
127 void FlowHandler::ShowGaiaSuccessAndSettingUp() { 219 void FlowHandler::ShowGaiaSuccessAndSettingUp() {
128 ExecuteJavascriptInIFrame(kLoginIFrameXPath, 220 ExecuteJavascriptInIFrame(kLoginIFrameXPath,
129 L"showGaiaSuccessAndSettingUp();"); 221 L"showGaiaSuccessAndSettingUp();");
130 } 222 }
131 223
224 // Called by SyncSetupFlow::Advance.
225 void FlowHandler::ShowChooseDataTypes(const DictionaryValue& args) {
226
227 // If you're starting the wizard at the Choose Data Types screen (i.e. from
228 // "Customize Sync"), this will be redundant. However, if you're coming from
229 // another wizard state, this will make sure Choose Data Types is on top.
230 if (dom_ui_)
231 dom_ui_->CallJavascriptFunction(L"showChooseDataTypes");
232
233 std::string json;
234 base::JSONWriter::Write(&args, false, &json);
235 std::wstring javascript = std::wstring(L"setChooseDataTypesCheckboxes") +
236 L"(" + UTF8ToWide(json) + L");";
237 ExecuteJavascriptInIFrame(kChooseDataTypesIFrameXPath, javascript);
238 }
239
132 void FlowHandler::ShowSetupDone(const std::wstring& user) { 240 void FlowHandler::ShowSetupDone(const std::wstring& user) {
133 StringValue synced_to_string(WideToUTF8(l10n_util::GetStringF( 241 StringValue synced_to_string(WideToUTF8(l10n_util::GetStringF(
134 IDS_SYNC_NTP_SYNCED_TO, user))); 242 IDS_SYNC_NTP_SYNCED_TO, user)));
135 std::string json; 243 std::string json;
136 base::JSONWriter::Write(&synced_to_string, false, &json); 244 base::JSONWriter::Write(&synced_to_string, false, &json);
137 std::wstring javascript = std::wstring(L"setSyncedToUser") + 245 std::wstring javascript = std::wstring(L"setSyncedToUser") +
138 L"(" + UTF8ToWide(json) + L");"; 246 L"(" + UTF8ToWide(json) + L");";
139 ExecuteJavascriptInIFrame(kDoneIframeXPath, javascript); 247 ExecuteJavascriptInIFrame(kDoneIframeXPath, javascript);
140 248
141 if (dom_ui_) 249 if (dom_ui_)
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 // Record the state at which the user cancelled the signon dialog. 330 // Record the state at which the user cancelled the signon dialog.
223 switch (current_state_) { 331 switch (current_state_) {
224 case SyncSetupWizard::GAIA_LOGIN: 332 case SyncSetupWizard::GAIA_LOGIN:
225 ProfileSyncService::SyncEvent( 333 ProfileSyncService::SyncEvent(
226 ProfileSyncService::CANCEL_FROM_SIGNON_WITHOUT_AUTH); 334 ProfileSyncService::CANCEL_FROM_SIGNON_WITHOUT_AUTH);
227 break; 335 break;
228 case SyncSetupWizard::GAIA_SUCCESS: 336 case SyncSetupWizard::GAIA_SUCCESS:
229 ProfileSyncService::SyncEvent( 337 ProfileSyncService::SyncEvent(
230 ProfileSyncService::CANCEL_DURING_SIGNON); 338 ProfileSyncService::CANCEL_DURING_SIGNON);
231 break; 339 break;
340 case SyncSetupWizard::CHOOSE_DATA_TYPES:
341 ProfileSyncService::SyncEvent(
342 ProfileSyncService::CANCEL_FROM_CHOOSE_DATA_TYPES);
232 case SyncSetupWizard::DONE_FIRST_TIME: 343 case SyncSetupWizard::DONE_FIRST_TIME:
233 case SyncSetupWizard::DONE: 344 case SyncSetupWizard::DONE:
345 // TODO(sync): rename this histogram; it's tracking authorization AND
346 // initial sync download time.
234 UMA_HISTOGRAM_MEDIUM_TIMES("Sync.UserPerceivedAuthorizationTime", 347 UMA_HISTOGRAM_MEDIUM_TIMES("Sync.UserPerceivedAuthorizationTime",
235 base::TimeTicks::Now() - login_start_time_); 348 base::TimeTicks::Now() - login_start_time_);
236 break; 349 break;
237 default: 350 default:
238 break; 351 break;
239 } 352 }
240 353
241 service_->OnUserCancelledDialog(); 354 service_->OnUserCancelledDialog();
242 delete this; 355 delete this;
243 } 356 }
244 357
245 // static 358 // static
246 void SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service, 359 void SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service,
247 DictionaryValue* args) { 360 DictionaryValue* args) {
361 args->SetString(L"iframeToShow", "login");
248 const GoogleServiceAuthError& error = service->GetAuthError(); 362 const GoogleServiceAuthError& error = service->GetAuthError();
249 if (!service->last_attempted_user_email().empty()) { 363 if (!service->last_attempted_user_email().empty()) {
250 args->SetString(L"user", service->last_attempted_user_email()); 364 args->SetString(L"user", service->last_attempted_user_email());
251 args->SetInteger(L"error", error.state()); 365 args->SetInteger(L"error", error.state());
252 } else { 366 } else {
253 std::wstring user(UTF16ToWide(service->GetAuthenticatedUsername())); 367 std::wstring user(UTF16ToWide(service->GetAuthenticatedUsername()));
254 args->SetString(L"user", user); 368 args->SetString(L"user", user);
255 args->SetInteger(L"error", user.empty() ? 0 : error.state()); 369 args->SetInteger(L"error", user.empty() ? 0 : error.state());
256 } 370 }
257 371
258 args->SetString(L"captchaUrl", error.captcha().image_url.spec()); 372 args->SetString(L"captchaUrl", error.captcha().image_url.spec());
259 373
260 args->SetBoolean(L"showCustomize", true); 374 args->SetBoolean(L"showCustomize", true);
261 } 375 }
262 376
377 // static
378 void SyncSetupFlow::GetArgsForChooseDataTypes(ProfileSyncService* service,
379 DictionaryValue* args) {
380 args->SetString(L"iframeToShow", "choose_data_types");
381 args->SetBoolean(L"keepEverythingSynced",
382 service->profile()->GetPrefs()->GetBoolean(prefs::kKeepEverythingSynced));
383
384 // Bookmarks, Preferences, and Themes are launched for good, there's no
385 // going back now. Check if the other data types are registered though.
386 syncable::ModelTypeSet registered_types;
387 service->GetRegisteredDataTypes(&registered_types);
388 args->SetBoolean(L"passwordsRegistered",
389 registered_types.count(syncable::PASSWORDS) > 0);
390 args->SetBoolean(L"autofillRegistered",
391 registered_types.count(syncable::AUTOFILL) > 0);
392 args->SetBoolean(L"extensionsRegistered",
393 registered_types.count(syncable::EXTENSIONS) > 0);
394 args->SetBoolean(L"typedUrlsRegistered",
395 registered_types.count(syncable::TYPED_URLS) > 0);
396
397 args->SetBoolean(L"syncBookmarks",
398 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncBookmarks));
399 args->SetBoolean(L"syncPreferences",
400 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncPreferences));
401 args->SetBoolean(L"syncThemes",
402 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncThemes));
403 args->SetBoolean(L"syncPasswords",
404 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncPasswords));
405 args->SetBoolean(L"syncAutofill",
406 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncAutofill));
407 args->SetBoolean(L"syncExtensions",
408 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncExtensions));
409 args->SetBoolean(L"syncTypedUrls",
410 service->profile()->GetPrefs()->GetBoolean(prefs::kSyncTypedUrls));
411 }
412
263 void SyncSetupFlow::GetDOMMessageHandlers( 413 void SyncSetupFlow::GetDOMMessageHandlers(
264 std::vector<DOMMessageHandler*>* handlers) const { 414 std::vector<DOMMessageHandler*>* handlers) const {
265 handlers->push_back(flow_handler_); 415 handlers->push_back(flow_handler_);
266 // We don't own flow_handler_ anymore, but it sticks around until at least 416 // We don't own flow_handler_ anymore, but it sticks around until at least
267 // right after OnDialogClosed() is called (and this object is destroyed). 417 // right after OnDialogClosed() is called (and this object is destroyed).
268 owns_flow_handler_ = false; 418 owns_flow_handler_ = false;
269 } 419 }
270 420
271 bool SyncSetupFlow::ShouldAdvance(SyncSetupWizard::State state) { 421 bool SyncSetupFlow::ShouldAdvance(SyncSetupWizard::State state) {
272 switch (state) { 422 switch (state) {
273 case SyncSetupWizard::GAIA_LOGIN: 423 case SyncSetupWizard::GAIA_LOGIN:
274 return current_state_ == SyncSetupWizard::GAIA_LOGIN; 424 return current_state_ == SyncSetupWizard::FATAL_ERROR ||
425 current_state_ == SyncSetupWizard::GAIA_LOGIN;
275 case SyncSetupWizard::GAIA_SUCCESS: 426 case SyncSetupWizard::GAIA_SUCCESS:
276 return current_state_ == SyncSetupWizard::GAIA_LOGIN; 427 return current_state_ == SyncSetupWizard::GAIA_LOGIN;
428 case SyncSetupWizard::CHOOSE_DATA_TYPES:
429 return current_state_ == SyncSetupWizard::GAIA_SUCCESS;
277 case SyncSetupWizard::FATAL_ERROR: 430 case SyncSetupWizard::FATAL_ERROR:
278 return true; // You can always hit the panic button. 431 return true; // You can always hit the panic button.
279 case SyncSetupWizard::DONE_FIRST_TIME: 432 case SyncSetupWizard::DONE_FIRST_TIME:
280 case SyncSetupWizard::DONE: 433 case SyncSetupWizard::DONE:
281 return current_state_ == SyncSetupWizard::GAIA_SUCCESS; 434 return current_state_ == SyncSetupWizard::CHOOSE_DATA_TYPES;
282 default: 435 default:
283 NOTREACHED() << "Unhandled State: " << state; 436 NOTREACHED() << "Unhandled State: " << state;
284 return false; 437 return false;
285 } 438 }
286 } 439 }
287 440
288 void SyncSetupFlow::Advance(SyncSetupWizard::State advance_state) { 441 void SyncSetupFlow::Advance(SyncSetupWizard::State advance_state) {
289 if (!ShouldAdvance(advance_state)) 442 if (!ShouldAdvance(advance_state))
290 return; 443 return;
444
291 switch (advance_state) { 445 switch (advance_state) {
292 case SyncSetupWizard::GAIA_LOGIN: { 446 case SyncSetupWizard::GAIA_LOGIN: {
293 DictionaryValue args; 447 DictionaryValue args;
294 SyncSetupFlow::GetArgsForGaiaLogin(service_, &args); 448 SyncSetupFlow::GetArgsForGaiaLogin(service_, &args);
295 flow_handler_->ShowGaiaLogin(args); 449 flow_handler_->ShowGaiaLogin(args);
296 break; 450 break;
297 } 451 }
298 case SyncSetupWizard::GAIA_SUCCESS: 452 case SyncSetupWizard::GAIA_SUCCESS:
299 if (end_state_ == SyncSetupWizard::GAIA_SUCCESS) 453 if (end_state_ == SyncSetupWizard::GAIA_SUCCESS) {
300 flow_handler_->ShowGaiaSuccessAndClose(); 454 flow_handler_->ShowGaiaSuccessAndClose();
301 else 455 break;
302 flow_handler_->ShowGaiaSuccessAndSettingUp(); 456 }
457 advance_state = SyncSetupWizard::CHOOSE_DATA_TYPES;
458 // Fall through.
459 case SyncSetupWizard::CHOOSE_DATA_TYPES: {
460 DictionaryValue args;
461 SyncSetupFlow::GetArgsForChooseDataTypes(service_, &args);
462 flow_handler_->ShowChooseDataTypes(args);
303 break; 463 break;
464 }
304 case SyncSetupWizard::FATAL_ERROR: { 465 case SyncSetupWizard::FATAL_ERROR: {
305 // This shows the user the "Could not connect to server" error. 466 // This shows the user the "Could not connect to server" error.
306 // TODO(sync): Update this error messaging. 467 // TODO(sync): Update this error messaging.
307 DictionaryValue args; 468 DictionaryValue args;
308 SyncSetupFlow::GetArgsForGaiaLogin(service_, &args); 469 SyncSetupFlow::GetArgsForGaiaLogin(service_, &args);
309 args.SetInteger(L"error", GoogleServiceAuthError::CONNECTION_FAILED); 470 args.SetInteger(L"error", GoogleServiceAuthError::CONNECTION_FAILED);
310 flow_handler_->ShowGaiaLogin(args); 471 flow_handler_->ShowGaiaLogin(args);
311 break; 472 break;
312 } 473 }
313 case SyncSetupWizard::DONE_FIRST_TIME: 474 case SyncSetupWizard::DONE_FIRST_TIME:
(...skipping 24 matching lines...) Expand all
338 } 499 }
339 500
340 // static 501 // static
341 SyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service, 502 SyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service,
342 SyncSetupFlowContainer* container, 503 SyncSetupFlowContainer* container,
343 SyncSetupWizard::State start, 504 SyncSetupWizard::State start,
344 SyncSetupWizard::State end) { 505 SyncSetupWizard::State end) {
345 DictionaryValue args; 506 DictionaryValue args;
346 if (start == SyncSetupWizard::GAIA_LOGIN) 507 if (start == SyncSetupWizard::GAIA_LOGIN)
347 SyncSetupFlow::GetArgsForGaiaLogin(service, &args); 508 SyncSetupFlow::GetArgsForGaiaLogin(service, &args);
509 else if (start == SyncSetupWizard::CHOOSE_DATA_TYPES)
510 SyncSetupFlow::GetArgsForChooseDataTypes(service, &args);
348 std::string json_args; 511 std::string json_args;
349 base::JSONWriter::Write(&args, false, &json_args); 512 base::JSONWriter::Write(&args, false, &json_args);
350 513
351 SyncSetupFlow* flow = new SyncSetupFlow(start, end, json_args, 514 SyncSetupFlow* flow = new SyncSetupFlow(start, end, json_args,
352 container, service); 515 container, service);
353 #if defined(OS_MACOSX) 516 #if defined(OS_MACOSX)
354 // TODO(akalin): Figure out a cleaner way to do this than to have this 517 // TODO(akalin): Figure out a cleaner way to do this than to have this
355 // gross per-OS behavior, i.e. have a cross-platform ShowHtmlDialog() 518 // gross per-OS behavior, i.e. have a cross-platform ShowHtmlDialog()
356 // function that is not tied to a browser instance. Note that if we do 519 // function that is not tied to a browser instance. Note that if we do
357 // that, we'll have to fix sync_setup_wizard_unittest.cc as it relies on 520 // that, we'll have to fix sync_setup_wizard_unittest.cc as it relies on
358 // being able to intercept ShowHtmlDialog() calls. 521 // being able to intercept ShowHtmlDialog() calls.
359 flow->html_dialog_window_ = 522 flow->html_dialog_window_ =
360 html_dialog_window_controller::ShowHtmlDialog( 523 html_dialog_window_controller::ShowHtmlDialog(
361 flow, service->profile()); 524 flow, service->profile());
362 #else 525 #else
363 Browser* b = BrowserList::GetLastActive(); 526 Browser* b = BrowserList::GetLastActive();
364 if (b) { 527 if (b) {
365 b->BrowserShowHtmlDialog(flow, NULL); 528 b->BrowserShowHtmlDialog(flow, NULL);
366 } else { 529 } else {
367 delete flow; 530 delete flow;
368 return NULL; 531 return NULL;
369 } 532 }
370 #endif // defined(OS_MACOSX) 533 #endif // defined(OS_MACOSX)
371 return flow; 534 return flow;
372 } 535 }
OLDNEW
« no previous file with comments | « chrome/browser/sync/sync_setup_flow.h ('k') | chrome/browser/sync/sync_setup_wizard.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698