Bug 1337959 - fix BrowserOpenAddonsMgr to always resolve the promise with a window, r=aswan
MozReview-Commit-ID: 6kPkmC7mtaz
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -6458,59 +6458,62 @@ var MailIntegration = {
.getService(Ci.nsIExternalProtocolService);
if (extProtocolSvc)
extProtocolSvc.loadUrl(aURL);
}
};
function BrowserOpenAddonsMgr(aView) {
return new Promise(resolve => {
- if (aView) {
- let emWindow;
- let browserWindow;
-
- var receivePong = function(aSubject, aTopic, aData) {
- let browserWin = aSubject.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIWebNavigation)
- .QueryInterface(Ci.nsIDocShellTreeItem)
- .rootTreeItem
- .QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDOMWindow);
- if (!emWindow || browserWin == window /* favor the current window */) {
- emWindow = aSubject;
- browserWindow = browserWin;
- }
+ let emWindow;
+ let browserWindow;
+
+ var receivePong = function(aSubject, aTopic, aData) {
+ let browserWin = aSubject.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindow);
+ if (!emWindow || browserWin == window /* favor the current window */) {
+ emWindow = aSubject;
+ browserWindow = browserWin;
}
- Services.obs.addObserver(receivePong, "EM-pong", false);
- Services.obs.notifyObservers(null, "EM-ping", "");
- Services.obs.removeObserver(receivePong, "EM-pong");
-
- if (emWindow) {
+ }
+ Services.obs.addObserver(receivePong, "EM-pong", false);
+ Services.obs.notifyObservers(null, "EM-ping", "");
+ Services.obs.removeObserver(receivePong, "EM-pong");
+
+ if (emWindow) {
+ if (aView) {
emWindow.loadView(aView);
- browserWindow.gBrowser.selectedTab =
- browserWindow.gBrowser._getTabForContentWindow(emWindow);
- emWindow.focus();
- resolve(emWindow);
- return;
}
- }
-
- switchToTabHavingURI("about:addons", true);
-
- if (aView) {
- // This must be a new load, else the ping/pong would have
- // found the window above.
- Services.obs.addObserver(function observer(aSubject, aTopic, aData) {
- Services.obs.removeObserver(observer, aTopic);
+ browserWindow.gBrowser.selectedTab =
+ browserWindow.gBrowser._getTabForContentWindow(emWindow);
+ emWindow.focus();
+ resolve(emWindow);
+ return;
+ }
+
+ // This must be a new load, else the ping/pong would have
+ // found the window above.
+ let whereToOpen = (window.gBrowser && isTabEmpty(gBrowser.selectedTab)) ?
+ "current" :
+ "tab";
+ openUILinkIn("about:addons", whereToOpen);
+
+ Services.obs.addObserver(function observer(aSubject, aTopic, aData) {
+ Services.obs.removeObserver(observer, aTopic);
+ if (aView) {
aSubject.loadView(aView);
- resolve(aSubject);
- }, "EM-loaded", false);
- } else {
- resolve();
- }
+ }
+ aSubject.QueryInterface(Ci.nsIDOMWindow);
+ aSubject.focus();
+ resolve(aSubject);
+ }, "EM-loaded", false);
});
}
function AddKeywordForSearchField() {
let mm = gBrowser.selectedBrowser.messageManager;
let onMessage = (message) => {
mm.removeMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage);