diff --git a/browser/base/content/aboutaccounts/aboutaccounts.js b/browser/base/content/aboutaccounts/aboutaccounts.js index 2a77dec702bd..76f861225a65 100644 --- a/browser/base/content/aboutaccounts/aboutaccounts.js +++ b/browser/base/content/aboutaccounts/aboutaccounts.js @@ -81,6 +81,15 @@ function promptForRelink(acctName) { return pressed == 0; // 0 is the "continue" button } +// If the last fxa account used for sync isn't this account, we display +// a modal dialog checking they really really want to do this... +// (This is sync-specific, so ideally would be in sync's identity module, +// but it's a little more seamless to do here, and sync is currently the +// only fxa consumer, so... +function shouldAllowRelink(acctName) { + return !needRelinkWarning(acctName) || promptForRelink(acctName); +} + let wrapper = { iframe: null, @@ -132,20 +141,20 @@ let wrapper = { delete accountData.customizeSync; } - // If the last fxa account used for sync isn't this account, we display - // a modal dialog checking they really really want to do this... - // (This is sync-specific, so ideally would be in sync's identity module, - // but it's a little more seamless to do here, and sync is currently the - // only fxa consumer, so... + // We need to confirm a relink - see shouldAllowRelink for more let newAccountEmail = accountData.email; - if (needRelinkWarning(newAccountEmail) && !promptForRelink(newAccountEmail)) { + // The hosted code may have already checked for the relink situation + // by sending the can_link_account command. If it did, then + // it will indicate we don't need to ask twice. + if (!accountData.verifiedCanLinkAccount && !shouldAllowRelink(newAccountEmail)) { // we need to tell the page we successfully received the message, but // then bail without telling fxAccounts this.injectData("message", { status: "login" }); - // and reload the page or else it remains in a "signed in" state. - window.location.reload(); + // and re-init the page by navigating to about:accounts + window.location = "about:accounts"; return; } + delete accountData.verifiedCanLinkAccount; // Remember who it was so we can log out next time. setPreviousAccountNameHash(newAccountEmail); @@ -175,6 +184,12 @@ let wrapper = { ); }, + onCanLinkAccount: function(accountData) { + // We need to confirm a relink - see shouldAllowRelink for more + let ok = shouldAllowRelink(accountData.email); + this.injectData("message", { status: "can_link_account", data: { ok: ok } }); + }, + /** * onSessionStatus sends the currently signed in user's credentials * to the jelly. @@ -208,6 +223,9 @@ let wrapper = { case "login": this.onLogin(data); break; + case "can_link_account": + this.onCanLinkAccount(data); + break; case "session_status": this.onSessionStatus(data); break;