Bug 1388238 - Implement waitForMasterPasswordDialog helper which handles open dialogs. r=MattN

MozReview-Commit-ID: A8jx8s37f1k

--HG--
extra : rebase_source : 66e5e8427ffe07f3566fc1173522083de2290a95
This commit is contained in:
steveck-chung 2017-08-07 20:43:02 -07:00
parent 6367e31f55
commit cad837ad66
2 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,81 @@
/* 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/. */
/**
* Helpers for the Master Password Dialog.
* In the future the Master Password implementation may move here.
*/
"use strict";
this.EXPORTED_SYMBOLS = [
"MasterPassword",
];
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
this.MasterPassword = {
/**
* Resolve when master password dialogs are closed, immediately if none are open.
*
* An existing MP dialog will be focused and will request attention.
*
* @returns {Promise<bool>}
* Resolves with whether the user is logged in to MP.
*/
async waitForExistingDialog() {
if (!Services.logins.uiBusy) {
log.debug("waitForExistingDialog: Dialog isn't showing. isLoggedIn:",
Services.logins.isLoggedIn);
return Services.logins.isLoggedIn;
}
return new Promise((resolve) => {
log.debug("waitForExistingDialog: Observing the open dialog");
let observer = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
Ci.nsISupportsWeakReference]),
observe(subject, topic, data) {
log.debug("waitForExistingDialog: Got notification:", topic);
// Only run observer once.
Services.obs.removeObserver(this, "passwordmgr-crypto-login");
Services.obs.removeObserver(this, "passwordmgr-crypto-loginCanceled");
if (topic == "passwordmgr-crypto-loginCanceled") {
resolve(false);
return;
}
resolve(true);
},
};
// Possible leak: it's possible that neither of these notifications
// will fire, and if that happens, we'll leak the observer (and
// never return). We should guarantee that at least one of these
// will fire.
// See bug XXX.
Services.obs.addObserver(observer, "passwordmgr-crypto-login");
Services.obs.addObserver(observer, "passwordmgr-crypto-loginCanceled");
// Focus and draw attention to the existing master password dialog for the
// occassions where it's not attached to the current window.
let promptWin = Services.wm.getMostRecentWindow("prompt:promptPassword");
promptWin.focus();
promptWin.getAttention();
});
},
};
XPCOMUtils.defineLazyGetter(this, "log", () => {
let ConsoleAPI = Cu.import("resource://gre/modules/Console.jsm", {}).ConsoleAPI;
return new ConsoleAPI({
maxLogLevelPref: "masterPassword.loglevel",
prefix: "Master Password",
});
});

View File

@ -91,6 +91,10 @@ CommonDialog.prototype = {
throw "unknown dialog type";
}
if (xulDialog) {
xulDialog.setAttribute("windowtype", "prompt:" + this.args.promptType);
}
// set the document title
let title = this.args.title;
// OS X doesn't have a title on modal dialogs, this is hidden on other platforms.