Bug 1492950 - Get login prompter off of getBrowserForContentWindow. r=MattN

Depends on D6711

Differential Revision: https://phabricator.services.mozilla.com/D6712

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Mike Conley 2018-10-02 17:52:54 +00:00
parent 441aadf5f8
commit adf587dde0
4 changed files with 48 additions and 38 deletions

View File

@ -970,16 +970,20 @@ var LoginManagerContent = {
value: oldPasswordField.value } :
null;
// Make sure to pass the opener's top in case it was in a frame.
let openerTopWindow = win.opener ? win.opener.top : null;
// Make sure to pass the opener's top ID in case it was in a frame.
let openerTopWindowID = null;
if (win.opener) {
openerTopWindowID = win.opener.top.windowUtils.outerWindowID;
}
messageManager.sendAsyncMessage("RemoteLogins:onFormSubmit",
{ hostname,
formSubmitURL,
usernameField: mockUsername,
newPasswordField: mockPassword,
oldPasswordField: mockOldPassword },
{ openerTopWindow });
oldPasswordField: mockOldPassword,
openerTopWindowID,
});
},
/**

View File

@ -92,7 +92,7 @@ var LoginManagerParent = {
data.usernameField,
data.newPasswordField,
data.oldPasswordField,
msg.objects.openerTopWindow,
data.openerTopWindowID,
msg.target);
break;
}
@ -288,14 +288,29 @@ var LoginManagerParent = {
onFormSubmit(hostname, formSubmitURL,
usernameField, newPasswordField,
oldPasswordField, openerTopWindow,
oldPasswordField, openerTopWindowID,
target) {
function getPrompter() {
var prompterSvc = Cc["@mozilla.org/login-manager/prompter;1"].
createInstance(Ci.nsILoginManagerPrompter);
prompterSvc.init(target.ownerGlobal);
prompterSvc.browser = target;
prompterSvc.opener = openerTopWindow;
for (let win of Services.wm.getEnumerator(null)) {
if (!win.gBrowser && !win.getBrowser) {
continue;
}
let tabbrowser = win.gBrowser || win.getBrowser();
if (tabbrowser) {
let browser = tabbrowser.getBrowserForOuterWindowID(openerTopWindowID);
if (browser) {
prompterSvc.openerBrowser = browser;
break;
}
}
}
return prompterSvc;
}

View File

@ -38,12 +38,11 @@ interface nsILoginManagerPrompter : nsISupports {
attribute Element browser;
/**
* The opener that was used to open the window passed to init.
* The opener browser that was used to open the window passed to init.
* The opener can be used to determine in which window the prompt
* should be shown. Must be a content window that is not a frame window,
* make sure to pass the top window using e.g. window.top.
* should be shown.
*/
attribute nsIDOMWindow opener;
attribute Element openerBrowser;
/**
* Ask the user if they want to save a login (Yes, Never, Not Now)

View File

@ -247,7 +247,7 @@ LoginManagerPrompter.prototype = {
_factory: null,
_chromeWindow: null,
_browser: null,
_opener: null,
_openerBrowser: null,
__strBundle: null, // String bundle for L10N
get _strBundle() {
@ -723,7 +723,7 @@ LoginManagerPrompter.prototype = {
this._chromeWindow = win;
this._browser = browser;
}
this._opener = null;
this._openerBrowser = null;
this._factory = aFactory || null;
this.log("===== initialized =====");
@ -733,17 +733,18 @@ LoginManagerPrompter.prototype = {
this._browser = aBrowser;
},
set opener(aOpener) {
this._opener = aOpener;
set openerBrowser(aOpenerBrowser) {
this._openerBrowser = aOpenerBrowser;
},
promptToSavePassword(aLogin) {
this.log("promptToSavePassword");
var notifyObj = this._getPopupNote() || this._getNotifyBox();
if (notifyObj)
if (notifyObj) {
this._showSaveLoginNotification(notifyObj, aLogin);
else
} else {
this._showSaveLoginDialog(aLogin);
}
},
/**
@ -1397,31 +1398,19 @@ LoginManagerPrompter.prototype = {
_getChromeWindow(aWindow) {
// Handle non-e10s toolkit consumers.
if (!Cu.isCrossProcessWrapper(aWindow)) {
let chromeWin = aWindow.docShell.chromeEventHandler.ownerGlobal;
let browser = aWindow.docShell.chromeEventHandler;
if (!browser) {
return null;
}
let chromeWin = browser.ownerGlobal;
if (!chromeWin) {
return null;
}
// gBrowser only exists on some apps, like Firefox.
let tabbrowser = chromeWin.gBrowser ||
(typeof chromeWin.getBrowser == "function" ? chromeWin.getBrowser() : null);
// At least serve the chrome window if getBrowser()
// or getBrowserForContentWindow() are not supported.
if (!tabbrowser || typeof tabbrowser.getBrowserForContentWindow != "function") {
return { win: chromeWin };
}
let browser = tabbrowser.getBrowserForContentWindow(aWindow);
return { win: chromeWin, browser };
}
for (let win of Services.wm.getEnumerator(null)) {
let tabbrowser = win.gBrowser || win.getBrowser();
let browser = tabbrowser.getBrowserForContentWindow(aWindow);
if (browser) {
return { win, browser };
}
}
return null;
},
@ -1429,7 +1418,7 @@ LoginManagerPrompter.prototype = {
// Some sites pop up a temporary login window, which disappears
// upon submission of credentials. We want to put the notification
// bar in the opener window if this seems to be happening.
if (this._opener) {
if (this._openerBrowser) {
let chromeDoc = this._chromeWindow.document.documentElement;
// Check to see if the current window was opened with chrome
@ -1438,11 +1427,14 @@ LoginManagerPrompter.prototype = {
// assume it'll stick around and *don't* use the opener.
if (chromeDoc.getAttribute("chromehidden") && !this._browser.canGoBack) {
this.log("Using opener window for notification bar.");
return this._getChromeWindow(this._opener);
return { win: this._openerBrowser.ownerGlobal, browser: this._openerBrowser };
}
}
return { win: this._chromeWindow, browser: this._browser };
return {
win: this._chromeWindow,
browser: this._browser,
};
},
/**