mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 16:25:38 +00:00
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:
parent
441aadf5f8
commit
adf587dde0
@ -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,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user