From 01238ca16a9a5ef99b08055ccfb722d58d7f09d4 Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Tue, 24 Apr 2018 11:17:00 +1000 Subject: [PATCH] Bug 1409208 (part 1) - Create a functional disconnect dialog. r=eoger,gandalf MozReview-Commit-ID: GyGzB6pI0vU --HG-- extra : rebase_source : cdbafbf484ae1aa451132b2c3a31b7210d48c0c4 --- .../components/preferences/in-content/jar.mn | 2 + .../components/preferences/in-content/sync.js | 42 +++++------- .../preferences/in-content/syncDisconnect.js | 45 +++++++++++++ .../preferences/in-content/syncDisconnect.xul | 67 +++++++++++++++++++ .../browser/preferences/syncDisconnect.ftl | 36 ++++++++++ .../en-US/chrome/browser/syncSetup.properties | 8 --- .../shared/incontentprefs/syncDisconnect.css | 33 +++++++++ browser/themes/shared/jar.inc.mn | 1 + 8 files changed, 200 insertions(+), 34 deletions(-) create mode 100644 browser/components/preferences/in-content/syncDisconnect.js create mode 100644 browser/components/preferences/in-content/syncDisconnect.xul create mode 100644 browser/locales/en-US/browser/preferences/syncDisconnect.ftl create mode 100644 browser/themes/shared/incontentprefs/syncDisconnect.css diff --git a/browser/components/preferences/in-content/jar.mn b/browser/components/preferences/in-content/jar.mn index f5620697b7c6..326bc4670a09 100644 --- a/browser/components/preferences/in-content/jar.mn +++ b/browser/components/preferences/in-content/jar.mn @@ -14,4 +14,6 @@ browser.jar: content/browser/preferences/in-content/privacy.js content/browser/preferences/in-content/containers.js content/browser/preferences/in-content/sync.js + content/browser/preferences/in-content/syncDisconnect.xul + content/browser/preferences/in-content/syncDisconnect.js content/browser/preferences/in-content/findInPage.js diff --git a/browser/components/preferences/in-content/sync.js b/browser/components/preferences/in-content/sync.js index 3adf0575a23f..2e9821e99187 100644 --- a/browser/components/preferences/in-content/sync.js +++ b/browser/components/preferences/in-content/sync.js @@ -448,34 +448,24 @@ var gSyncPane = { }, unlinkFirefoxAccount(confirm) { + let doUnlink = () => { + fxAccounts.signOut().then(() => { + this.updateWeavePrefs(); + }); + }; if (confirm) { - let sb = Services.strings.createBundle("chrome://browser/locale/syncSetup.properties"); - let disconnectLabel = sb.GetStringFromName("disconnect.label"); - let title = sb.GetStringFromName("disconnect.verify.title"); - let body = sb.GetStringFromName("disconnect.verify.bodyHeading") + - "\n\n" + - sb.GetStringFromName("disconnect.verify.bodyText"); - let ps = Services.prompt; - let buttonFlags = (ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING) + - (ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL) + - ps.BUTTON_POS_1_DEFAULT; - - let factory = Cc["@mozilla.org/prompter;1"] - .getService(Ci.nsIPromptFactory); - let prompt = factory.getPrompt(window, Ci.nsIPrompt); - let bag = prompt.QueryInterface(Ci.nsIWritablePropertyBag2); - bag.setPropertyAsBool("allowTabModal", true); - - let pressed = prompt.confirmEx(title, body, buttonFlags, - disconnectLabel, null, null, null, {}); - - if (pressed != 0) { // 0 is the "continue" button - return; - } + gSubDialog.open("chrome://browser/content/preferences/in-content/syncDisconnect.xul", + "resizable=no", /* aFeatures */ + null, /* aParams */ + event => { /* aClosingCallback */ + if (event.detail.button == "accept") { + doUnlink(); + } + }); + return; } - fxAccounts.signOut().then(() => { - this.updateWeavePrefs(); - }); + // no confirmation implies no data removal, so just disconnect. + doUnlink(); }, _populateComputerName(value) { diff --git a/browser/components/preferences/in-content/syncDisconnect.js b/browser/components/preferences/in-content/syncDisconnect.js new file mode 100644 index 000000000000..3857b0b1fc1e --- /dev/null +++ b/browser/components/preferences/in-content/syncDisconnect.js @@ -0,0 +1,45 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +let gSyncDisconnectDialog = { + init() { + }, + + // when either of the checkboxes are changed. + onDeleteOptionChange() { + let eitherChecked = document.getElementById("deleteRemoteSyncData").checked || + document.getElementById("deleteRemoteOtherData").checked; + let newTitle = eitherChecked ? "sync-disconnect-confirm-disconnect-delete" : + "sync-disconnect-confirm-disconnect"; + let butDisconnect = document.getElementById("butDisconnect"); + document.l10n.setAttributes(butDisconnect, newTitle); + }, + + accept(event) { + // * Check the check-boxes + // * Start the disconnect and get the completion promise. + this.waitForCompletion(Promise.resolve()); + }, + + waitForCompletion(promiseComplete) { + // Change the dialog to show we are waiting for completion. + document.getElementById("deleteOptionsContent").hidden = true; + document.getElementById("deletingContent").hidden = false; + + // And do the santize. + promiseComplete.catch(ex => { + console.error("Failed to sanitize", ex); + }).then(() => { + // We dispatch a custom event so the caller knows how we were closed + // (if we were a dialog we'd get this for free, but we'd also lose the + // ability to keep the dialog open while the sanitize was running) + let closingEvent = new CustomEvent("dialogclosing", { + bubbles: true, + detail: {button: "accept"}, + }); + document.documentElement.dispatchEvent(closingEvent); + close(); + }); + } +}; diff --git a/browser/components/preferences/in-content/syncDisconnect.xul b/browser/components/preferences/in-content/syncDisconnect.xul new file mode 100644 index 000000000000..a79f316232f5 --- /dev/null +++ b/browser/components/preferences/in-content/syncDisconnect.xul @@ -0,0 +1,67 @@ + + + + + + + + + + + + +