Index: chrome/browser/ui/sync/one_click_signin_helper.cc |
diff --git a/chrome/browser/ui/sync/one_click_signin_helper.cc b/chrome/browser/ui/sync/one_click_signin_helper.cc |
index eb26b2088fbdf4e2af60563c1df8781131507824..363aa209d8527f4943451260fc36a5033c185774 100644 |
--- a/chrome/browser/ui/sync/one_click_signin_helper.cc |
+++ b/chrome/browser/ui/sync/one_click_signin_helper.cc |
@@ -93,7 +93,7 @@ struct StartSyncArgs { |
const std::string& session_index, |
const std::string& email, |
const std::string& password, |
- bool force_same_tab_navigation, |
+ content::WebContents* web_contents, |
bool untrusted_confirmation_required, |
signin::Source source, |
OneClickSigninSyncStarter::Callback callback); |
@@ -104,7 +104,11 @@ struct StartSyncArgs { |
std::string session_index; |
std::string email; |
std::string password; |
- bool force_same_tab_navigation; |
+ |
+ // Web contents in which the sync setup page should be displayed, |
+ // if necessary. Can be NULL. |
+ content::WebContents* web_contents; |
+ |
OneClickSigninSyncStarter::ConfirmationRequired confirmation_required; |
signin::Source source; |
OneClickSigninSyncStarter::Callback callback; |
@@ -116,7 +120,7 @@ StartSyncArgs::StartSyncArgs(Profile* profile, |
const std::string& session_index, |
const std::string& email, |
const std::string& password, |
- bool force_same_tab_navigation, |
+ content::WebContents* web_contents, |
bool untrusted_confirmation_required, |
signin::Source source, |
OneClickSigninSyncStarter::Callback callback) |
@@ -126,7 +130,7 @@ StartSyncArgs::StartSyncArgs(Profile* profile, |
session_index(session_index), |
email(email), |
password(password), |
- force_same_tab_navigation(force_same_tab_navigation), |
+ web_contents(web_contents), |
source(source), |
callback(callback) { |
if (untrusted_confirmation_required) { |
@@ -243,7 +247,7 @@ void StartSync(const StartSyncArgs& args, |
// The starter deletes itself once its done. |
new OneClickSigninSyncStarter(args.profile, args.browser, args.session_index, |
args.email, args.password, start_mode, |
- args.force_same_tab_navigation, |
+ args.web_contents, |
args.confirmation_required, |
args.source, |
args.callback); |
@@ -1143,8 +1147,9 @@ void OneClickSigninHelper::DidStopLoading( |
// checked, the source parameter will indicate settings. This will only be |
// communicated back to chrome when Gaia redirects to the continue URL, and |
// this is considered here a last minute change to the source. See a little |
- // further below for when this variable is set to true. |
- bool force_same_tab_navigation = false; |
+ // further below for when this variable is set to a web contents that must be |
+ // used to show the sync setup page. |
+ content::WebContents* sync_setup_contents = NULL; |
if (!continue_url_match && IsValidGaiaSigninRedirectOrResponseURL(url)) |
return; |
@@ -1180,8 +1185,10 @@ void OneClickSigninHelper::DidStopLoading( |
signin::Source source = signin::GetSourceForPromoURL(url); |
if (source != source_) { |
source_ = source; |
- force_same_tab_navigation = source == signin::SOURCE_SETTINGS; |
- switched_to_advanced_ = source == signin::SOURCE_SETTINGS; |
+ if (source == signin::SOURCE_SETTINGS) { |
+ sync_setup_contents = web_contents(); |
+ switched_to_advanced_ = true; |
+ } |
} |
} |
@@ -1202,12 +1209,13 @@ void OneClickSigninHelper::DidStopLoading( |
SigninManager::DisableOneClickSignIn(profile); |
// Start syncing with the default settings - prompt the user to sign in |
// first. |
- StartSync(StartSyncArgs(profile, browser, auto_accept_, |
- session_index_, email_, password_, |
- false /* force_same_tab_navigation */, |
- true /* confirmation_required */, source_, |
- CreateSyncStarterCallback()), |
- OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); |
+ StartSync( |
+ StartSyncArgs(profile, browser, auto_accept_, |
+ session_index_, email_, password_, |
+ NULL /* don't force to show sync setup in same tab */, |
+ true /* confirmation_required */, source_, |
+ CreateSyncStarterCallback()), |
+ OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS); |
break; |
case AUTO_ACCEPT_CONFIGURE: |
LogOneClickHistogramValue(one_click_signin::HISTOGRAM_ACCEPTED); |
@@ -1216,8 +1224,9 @@ void OneClickSigninHelper::DidStopLoading( |
// Display the extra confirmation (even in the SAML case) in case this |
// was an untrusted renderer. |
StartSync( |
- StartSyncArgs(profile, browser, auto_accept_, session_index_, email_, |
- password_, false /* force_same_tab_navigation */, |
+ StartSyncArgs(profile, browser, auto_accept_, |
+ session_index_, email_, password_, |
+ NULL /* don't force to show sync setup in same tab */, |
true /* confirmation_required */, source_, |
CreateSyncStarterCallback()), |
OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST); |
@@ -1257,6 +1266,8 @@ void OneClickSigninHelper::DidStopLoading( |
// No need to display a second confirmation so pass false below. |
// TODO(atwilson): Move this into OneClickSigninSyncStarter. |
+ // If |sync_setup_contents| is deleted before the callback execution, |
+ // the tab modal dialog is closed and the callback is never executed. |
ConfirmEmailDialogDelegate::AskForConfirmation( |
contents, |
last_email, |
@@ -1265,7 +1276,7 @@ void OneClickSigninHelper::DidStopLoading( |
&StartExplicitSync, |
StartSyncArgs(profile, browser, auto_accept_, |
session_index_, email_, password_, |
- force_same_tab_navigation, |
+ sync_setup_contents, |
false /* confirmation_required */, source_, |
CreateSyncStarterCallback()), |
contents, |
@@ -1273,7 +1284,7 @@ void OneClickSigninHelper::DidStopLoading( |
} else { |
StartSync( |
StartSyncArgs(profile, browser, auto_accept_, session_index_, |
- email_, password_, force_same_tab_navigation, |
+ email_, password_, sync_setup_contents, |
untrusted_confirmation_required_, source_, |
CreateSyncStarterCallback()), |
start_mode); |