OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/sync/one_click_signin_helper.h" | 5 #include "chrome/browser/ui/sync/one_click_signin_helper.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 | 221 |
222 // Add a specific email to the list of emails rejected for one-click | 222 // Add a specific email to the list of emails rejected for one-click |
223 // sign-in, for this profile. | 223 // sign-in, for this profile. |
224 void AddEmailToOneClickRejectedList(Profile* profile, | 224 void AddEmailToOneClickRejectedList(Profile* profile, |
225 const std::string& email) { | 225 const std::string& email) { |
226 ListPrefUpdate updater(profile->GetPrefs(), | 226 ListPrefUpdate updater(profile->GetPrefs(), |
227 prefs::kReverseAutologinRejectedEmailList); | 227 prefs::kReverseAutologinRejectedEmailList); |
228 updater->AppendIfNotPresent(new base::StringValue(email)); | 228 updater->AppendIfNotPresent(new base::StringValue(email)); |
229 } | 229 } |
230 | 230 |
231 void RedirectToNtpOrAppsPageWithIds(int child_id, | |
232 int route_id, | |
233 signin_metrics::Source source) { | |
234 content::WebContents* web_contents = tab_util::GetWebContentsByID(child_id, | |
235 route_id); | |
236 if (!web_contents) | |
237 return; | |
238 | |
239 OneClickSigninHelper::RedirectToNtpOrAppsPage(web_contents, source); | |
240 } | |
241 | |
242 // Start syncing with the given user information. | 231 // Start syncing with the given user information. |
243 void StartSync(const OneClickSigninHelper::StartSyncArgs& args, | 232 void StartSync(const OneClickSigninHelper::StartSyncArgs& args, |
244 OneClickSigninSyncStarter::StartSyncMode start_mode) { | 233 OneClickSigninSyncStarter::StartSyncMode start_mode) { |
245 if (start_mode == OneClickSigninSyncStarter::UNDO_SYNC) { | 234 if (start_mode == OneClickSigninSyncStarter::UNDO_SYNC) { |
246 OneClickSigninHelper::LogHistogramValue(signin_metrics::HISTOGRAM_UNDO); | 235 OneClickSigninHelper::LogHistogramValue(signin_metrics::HISTOGRAM_UNDO); |
247 return; | 236 return; |
248 } | 237 } |
249 | 238 |
250 // The wrapper deletes itself once it's done. | 239 // The wrapper deletes itself once it's done. |
251 OneClickSigninHelper::SyncStarterWrapper* wrapper = | 240 OneClickSigninHelper::SyncStarterWrapper* wrapper = |
(...skipping 19 matching lines...) Expand all Loading... |
271 break; | 260 break; |
272 } | 261 } |
273 if (action != signin_metrics::HISTOGRAM_MAX) | 262 if (action != signin_metrics::HISTOGRAM_MAX) |
274 OneClickSigninHelper::LogHistogramValue(action); | 263 OneClickSigninHelper::LogHistogramValue(action); |
275 } | 264 } |
276 | 265 |
277 void StartExplicitSync(const OneClickSigninHelper::StartSyncArgs& args, | 266 void StartExplicitSync(const OneClickSigninHelper::StartSyncArgs& args, |
278 content::WebContents* contents, | 267 content::WebContents* contents, |
279 OneClickSigninSyncStarter::StartSyncMode start_mode, | 268 OneClickSigninSyncStarter::StartSyncMode start_mode, |
280 ConfirmEmailDialogDelegate::Action action) { | 269 ConfirmEmailDialogDelegate::Action action) { |
281 bool enable_inline = !switches::IsEnableWebBasedSignin(); | |
282 if (action == ConfirmEmailDialogDelegate::START_SYNC) { | 270 if (action == ConfirmEmailDialogDelegate::START_SYNC) { |
283 StartSync(args, start_mode); | 271 StartSync(args, start_mode); |
284 if (!enable_inline) { | |
285 // Redirect/tab closing for inline flow is handled by the sync callback. | |
286 OneClickSigninHelper::RedirectToNtpOrAppsPageIfNecessary( | |
287 contents, args.source); | |
288 } | |
289 } else { | 272 } else { |
290 // Perform a redirection to the NTP/Apps page to hide the blank page when | 273 // Perform a redirection to the NTP/Apps page to hide the blank page when |
291 // the action is CLOSE or CREATE_NEW_USER. The redirection is useful when | 274 // the action is CLOSE or CREATE_NEW_USER. The redirection is useful when |
292 // the action is CREATE_NEW_USER because the "Create new user" page might | 275 // the action is CREATE_NEW_USER because the "Create new user" page might |
293 // be opened in a different tab that is already showing settings. | 276 // be opened in a different tab that is already showing settings. |
294 if (enable_inline) { | 277 args.callback.Run(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); |
295 // Redirect/tab closing for inline flow is handled by the sync callback. | |
296 args.callback.Run(OneClickSigninSyncStarter::SYNC_SETUP_FAILURE); | |
297 } else { | |
298 // Redirect, but don't do so immediately; otherwise there might be two | |
299 // nested navigations, which would cause a crash: http://crbug.com/293261 | |
300 // Instead, post a task to the current thread. | |
301 base::MessageLoopProxy::current()->PostNonNestableTask( | |
302 FROM_HERE, | |
303 base::Bind(RedirectToNtpOrAppsPageWithIds, | |
304 contents->GetRenderProcessHost()->GetID(), | |
305 contents->GetRoutingID(), | |
306 args.source)); | |
307 } | |
308 if (action == ConfirmEmailDialogDelegate::CREATE_NEW_USER) { | 278 if (action == ConfirmEmailDialogDelegate::CREATE_NEW_USER) { |
309 chrome::ShowSettingsSubPage(args.browser, | 279 chrome::ShowSettingsSubPage(args.browser, |
310 std::string(chrome::kCreateProfileSubPage)); | 280 std::string(chrome::kCreateProfileSubPage)); |
311 } | 281 } |
312 } | 282 } |
313 } | 283 } |
314 | 284 |
315 void ClearPendingEmailOnIOThread(content::ResourceContext* context) { | 285 void ClearPendingEmailOnIOThread(content::ResourceContext* context) { |
316 ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); | 286 ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); |
317 DCHECK(io_data); | 287 DCHECK(io_data); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 CurrentHistoryCleaner::~CurrentHistoryCleaner() { | 418 CurrentHistoryCleaner::~CurrentHistoryCleaner() { |
449 } | 419 } |
450 | 420 |
451 void CurrentHistoryCleaner::DidCommitProvisionalLoadForFrame( | 421 void CurrentHistoryCleaner::DidCommitProvisionalLoadForFrame( |
452 content::RenderFrameHost* render_frame_host, | 422 content::RenderFrameHost* render_frame_host, |
453 const GURL& url, | 423 const GURL& url, |
454 ui::PageTransition transition_type) { | 424 ui::PageTransition transition_type) { |
455 // Return early if this is not top-level navigation. | 425 // Return early if this is not top-level navigation. |
456 if (render_frame_host->GetParent()) | 426 if (render_frame_host->GetParent()) |
457 return; | 427 return; |
458 | |
459 content::NavigationController* nc = &web_contents()->GetController(); | |
460 HistoryService* hs = HistoryServiceFactory::GetForProfile( | |
461 Profile::FromBrowserContext(web_contents()->GetBrowserContext()), | |
462 ServiceAccessType::IMPLICIT_ACCESS); | |
463 | |
464 // Have to wait until something else gets added to history before removal. | |
465 if (history_index_to_remove_ < nc->GetLastCommittedEntryIndex()) { | |
466 content::NavigationEntry* entry = | |
467 nc->GetEntryAtIndex(history_index_to_remove_); | |
468 if (signin::IsContinueUrlForWebBasedSigninFlow(entry->GetURL())) { | |
469 hs->DeleteURL(entry->GetURL()); | |
470 nc->RemoveEntryAtIndex(history_index_to_remove_); | |
471 delete this; // Success. | |
472 } | |
473 } | |
474 } | 428 } |
475 | 429 |
476 void CurrentHistoryCleaner::WebContentsDestroyed() { | 430 void CurrentHistoryCleaner::WebContentsDestroyed() { |
477 delete this; // Failure. | 431 delete this; // Failure. |
478 } | 432 } |
479 | 433 |
480 } // namespace | 434 } // namespace |
481 | 435 |
482 | 436 |
483 // StartSyncArgs -------------------------------------------------------------- | 437 // StartSyncArgs -------------------------------------------------------------- |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1042 // complete. | 996 // complete. |
1043 if (helper->original_continue_url_.is_empty()) | 997 if (helper->original_continue_url_.is_empty()) |
1044 helper->original_continue_url_ = continue_url; | 998 helper->original_continue_url_ = continue_url; |
1045 helper->continue_url_ = continue_url; | 999 helper->continue_url_ = continue_url; |
1046 } | 1000 } |
1047 } | 1001 } |
1048 | 1002 |
1049 // static | 1003 // static |
1050 void OneClickSigninHelper::RemoveSigninRedirectURLHistoryItem( | 1004 void OneClickSigninHelper::RemoveSigninRedirectURLHistoryItem( |
1051 content::WebContents* web_contents) { | 1005 content::WebContents* web_contents) { |
1052 // Only actually remove the item if it's the blank.html continue url. | |
1053 if (signin::IsContinueUrlForWebBasedSigninFlow( | |
1054 web_contents->GetLastCommittedURL())) { | |
1055 new CurrentHistoryCleaner(web_contents); // will self-destruct when done | |
1056 } | |
1057 } | 1006 } |
1058 | 1007 |
1059 // static | 1008 // static |
1060 bool OneClickSigninHelper::HandleCrossAccountError( | 1009 bool OneClickSigninHelper::HandleCrossAccountError( |
1061 Profile* profile, | 1010 Profile* profile, |
1062 const std::string& session_index, | 1011 const std::string& session_index, |
1063 const std::string& email, | 1012 const std::string& email, |
1064 const std::string& password, | 1013 const std::string& password, |
1065 const std::string& refresh_token, | 1014 const std::string& refresh_token, |
1066 OneClickSigninHelper::AutoAccept auto_accept, | 1015 OneClickSigninHelper::AutoAccept auto_accept, |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1385 LogHistogramValue(signin_metrics::HISTOGRAM_WITH_DEFAULTS); | 1334 LogHistogramValue(signin_metrics::HISTOGRAM_WITH_DEFAULTS); |
1386 SigninManager::DisableOneClickSignIn(profile->GetPrefs()); | 1335 SigninManager::DisableOneClickSignIn(profile->GetPrefs()); |
1387 // Start syncing with the default settings - prompt the user to sign in | 1336 // Start syncing with the default settings - prompt the user to sign in |
1388 // first. | 1337 // first. |
1389 if (!do_not_start_sync_for_testing_) { | 1338 if (!do_not_start_sync_for_testing_) { |
1390 StartSync( | 1339 StartSync( |
1391 StartSyncArgs(profile, browser, auto_accept_, | 1340 StartSyncArgs(profile, browser, auto_accept_, |
1392 session_index_, email_, password_, "", | 1341 session_index_, email_, password_, "", |
1393 NULL /* don't force sync setup in same tab */, | 1342 NULL /* don't force sync setup in same tab */, |
1394 true /* confirmation_required */, source_, | 1343 true /* confirmation_required */, source_, |
1395 CreateSyncStarterCallback()), | 1344 OneClickSigninSyncStarter::Callback()), |
1396 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); | 1345 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); |
1397 } | 1346 } |
1398 break; | 1347 break; |
1399 case AUTO_ACCEPT_CONFIGURE: | 1348 case AUTO_ACCEPT_CONFIGURE: |
1400 LogHistogramValue(signin_metrics::HISTOGRAM_ACCEPTED); | 1349 LogHistogramValue(signin_metrics::HISTOGRAM_ACCEPTED); |
1401 LogHistogramValue(signin_metrics::HISTOGRAM_WITH_ADVANCED); | 1350 LogHistogramValue(signin_metrics::HISTOGRAM_WITH_ADVANCED); |
1402 SigninManager::DisableOneClickSignIn(profile->GetPrefs()); | 1351 SigninManager::DisableOneClickSignIn(profile->GetPrefs()); |
1403 // Display the extra confirmation (even in the SAML case) in case this | 1352 // Display the extra confirmation (even in the SAML case) in case this |
1404 // was an untrusted renderer. | 1353 // was an untrusted renderer. |
1405 if (!do_not_start_sync_for_testing_) { | 1354 if (!do_not_start_sync_for_testing_) { |
1406 StartSync( | 1355 StartSync( |
1407 StartSyncArgs(profile, browser, auto_accept_, | 1356 StartSyncArgs(profile, browser, auto_accept_, |
1408 session_index_, email_, password_, "", | 1357 session_index_, email_, password_, "", |
1409 NULL /* don't force sync setup in same tab */, | 1358 NULL /* don't force sync setup in same tab */, |
1410 true /* confirmation_required */, source_, | 1359 true /* confirmation_required */, source_, |
1411 CreateSyncStarterCallback()), | 1360 OneClickSigninSyncStarter::Callback()), |
1412 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); | 1361 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); |
1413 } | 1362 } |
1414 break; | 1363 break; |
1415 case AUTO_ACCEPT_EXPLICIT: { | 1364 case AUTO_ACCEPT_EXPLICIT: { |
1416 signin_metrics::Source original_source = | 1365 signin_metrics::Source original_source = |
1417 signin::GetSourceForPromoURL(original_continue_url_); | 1366 signin::GetSourceForPromoURL(original_continue_url_); |
1418 if (switched_to_advanced_) { | 1367 if (switched_to_advanced_) { |
1419 LogHistogramValue(signin_metrics::HISTOGRAM_WITH_ADVANCED); | 1368 LogHistogramValue(signin_metrics::HISTOGRAM_WITH_ADVANCED); |
1420 LogHistogramValue(signin_metrics::HISTOGRAM_ACCEPTED); | 1369 LogHistogramValue(signin_metrics::HISTOGRAM_ACCEPTED); |
1421 } else { | 1370 } else { |
(...skipping 15 matching lines...) Expand all Loading... |
1437 OneClickSigninSyncStarter::StartSyncMode start_mode = | 1386 OneClickSigninSyncStarter::StartSyncMode start_mode = |
1438 source_ == signin_metrics::SOURCE_SETTINGS ? | 1387 source_ == signin_metrics::SOURCE_SETTINGS ? |
1439 (error_controller->HasError() && | 1388 (error_controller->HasError() && |
1440 sync_service && sync_service->HasSyncSetupCompleted()) ? | 1389 sync_service && sync_service->HasSyncSetupCompleted()) ? |
1441 OneClickSigninSyncStarter::SHOW_SETTINGS_WITHOUT_CONFIGURE : | 1390 OneClickSigninSyncStarter::SHOW_SETTINGS_WITHOUT_CONFIGURE : |
1442 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST : | 1391 OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST : |
1443 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS; | 1392 OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS; |
1444 | 1393 |
1445 if (!HandleCrossAccountError(profile, session_index_, email_, password_, | 1394 if (!HandleCrossAccountError(profile, session_index_, email_, password_, |
1446 "", auto_accept_, source_, start_mode, | 1395 "", auto_accept_, source_, start_mode, |
1447 CreateSyncStarterCallback())) { | 1396 OneClickSigninSyncStarter::Callback())) { |
1448 if (!do_not_start_sync_for_testing_) { | 1397 if (!do_not_start_sync_for_testing_) { |
1449 StartSync( | 1398 StartSync( |
1450 StartSyncArgs(profile, browser, auto_accept_, | 1399 StartSyncArgs(profile, browser, auto_accept_, |
1451 session_index_, email_, password_, "", | 1400 session_index_, email_, password_, "", |
1452 contents, | 1401 contents, |
1453 untrusted_confirmation_required_, source_, | 1402 untrusted_confirmation_required_, source_, |
1454 CreateSyncStarterCallback()), | 1403 OneClickSigninSyncStarter::Callback()), |
1455 start_mode); | 1404 start_mode); |
1456 } | 1405 } |
1457 | 1406 |
1458 // If this explicit sign in is not from settings page/webstore, show | 1407 // If this explicit sign in is not from settings page/webstore, show |
1459 // the NTP/Apps page after sign in completes. In the case of the | 1408 // the NTP/Apps page after sign in completes. In the case of the |
1460 // settings page, it will get auto-closed after sync setup. In the case | 1409 // settings page, it will get auto-closed after sync setup. In the case |
1461 // of webstore, it will redirect back to webstore. | 1410 // of webstore, it will redirect back to webstore. |
1462 RedirectToNtpOrAppsPageIfNecessary(web_contents(), source_); | 1411 RedirectToNtpOrAppsPageIfNecessary(web_contents(), source_); |
1463 } | 1412 } |
1464 | 1413 |
(...skipping 10 matching lines...) Expand all Loading... |
1475 AddEmailToOneClickRejectedList(profile, email_); | 1424 AddEmailToOneClickRejectedList(profile, email_); |
1476 LogHistogramValue(signin_metrics::HISTOGRAM_REJECTED); | 1425 LogHistogramValue(signin_metrics::HISTOGRAM_REJECTED); |
1477 break; | 1426 break; |
1478 default: | 1427 default: |
1479 NOTREACHED() << "Invalid auto_accept=" << auto_accept_; | 1428 NOTREACHED() << "Invalid auto_accept=" << auto_accept_; |
1480 break; | 1429 break; |
1481 } | 1430 } |
1482 | 1431 |
1483 CleanTransientState(); | 1432 CleanTransientState(); |
1484 } | 1433 } |
1485 | |
1486 OneClickSigninSyncStarter::Callback | |
1487 OneClickSigninHelper::CreateSyncStarterCallback() { | |
1488 // The callback will only be invoked if this object is still alive when sync | |
1489 // setup is completed. This is correct because this object is only deleted | |
1490 // when the web contents that potentially shows a blank page is deleted. | |
1491 return base::Bind(&OneClickSigninHelper::SyncSetupCompletedCallback, | |
1492 weak_pointer_factory_.GetWeakPtr()); | |
1493 } | |
1494 | |
1495 void OneClickSigninHelper::SyncSetupCompletedCallback( | |
1496 OneClickSigninSyncStarter::SyncSetupResult result) { | |
1497 if (result == OneClickSigninSyncStarter::SYNC_SETUP_FAILURE && | |
1498 web_contents()) { | |
1499 GURL current_url = web_contents()->GetVisibleURL(); | |
1500 | |
1501 // If the web contents is showing a blank page and not about to be closed, | |
1502 // redirect to the NTP or apps page. | |
1503 if (signin::IsContinueUrlForWebBasedSigninFlow(current_url) && | |
1504 !signin::IsAutoCloseEnabledInURL(original_continue_url_)) { | |
1505 RedirectToNtpOrAppsPage( | |
1506 web_contents(), | |
1507 signin::GetSourceForPromoURL(original_continue_url_)); | |
1508 } | |
1509 } | |
1510 } | |
OLD | NEW |