172 lines
5 KiB
JavaScript
172 lines
5 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
|
|
* 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/. */
|
|
|
|
/* eslint-env mozilla/browser-window */
|
|
|
|
var NonBrowserWindow = {
|
|
delayedStartupTimeoutId: null,
|
|
MAC_HIDDEN_WINDOW: "chrome://browser/content/hiddenWindowMac.xhtml",
|
|
|
|
openBrowserWindowFromDockMenu(options = {}) {
|
|
let existingWindow = BrowserWindowTracker.getTopWindow();
|
|
options.openerWindow = existingWindow || window;
|
|
let win = OpenBrowserWindow(options);
|
|
win.addEventListener(
|
|
"load",
|
|
() => this.dockSupport.activateApplication(true),
|
|
{ once: true }
|
|
);
|
|
|
|
return win;
|
|
},
|
|
|
|
startup() {
|
|
// Disable inappropriate commands / submenus
|
|
var disabledItems = [
|
|
"Browser:SavePage",
|
|
"Browser:SendLink",
|
|
"cmd_pageSetup",
|
|
"cmd_print",
|
|
"cmd_find",
|
|
"cmd_findAgain",
|
|
"viewToolbarsMenu",
|
|
"viewSidebarMenuMenu",
|
|
"Browser:Reload",
|
|
"viewFullZoomMenu",
|
|
"pageStyleMenu",
|
|
"repair-text-encoding",
|
|
"View:PageSource",
|
|
"View:FullScreen",
|
|
"enterFullScreenItem",
|
|
"viewHistorySidebar",
|
|
"Browser:AddBookmarkAs",
|
|
"Browser:BookmarkAllTabs",
|
|
"View:PageInfo",
|
|
"History:UndoCloseTab",
|
|
"menu_openFirefoxView",
|
|
];
|
|
var element;
|
|
|
|
for (let disabledItem of disabledItems) {
|
|
element = document.getElementById(disabledItem);
|
|
if (element) {
|
|
element.setAttribute("disabled", "true");
|
|
}
|
|
}
|
|
|
|
// Show menus that are only visible in non-browser windows
|
|
let shownItems = ["menu_openLocation"];
|
|
for (let shownItem of shownItems) {
|
|
element = document.getElementById(shownItem);
|
|
if (element) {
|
|
element.removeAttribute("hidden");
|
|
}
|
|
}
|
|
|
|
if (window.location.href == this.MAC_HIDDEN_WINDOW) {
|
|
// If no windows are active (i.e. we're the hidden window), disable the
|
|
// close, minimize and zoom menu commands as well.
|
|
var hiddenWindowDisabledItems = [
|
|
"cmd_close",
|
|
"cmd_minimizeWindow",
|
|
"zoomWindow",
|
|
];
|
|
for (let hiddenWindowDisabledItem of hiddenWindowDisabledItems) {
|
|
element = document.getElementById(hiddenWindowDisabledItem);
|
|
if (element) {
|
|
element.setAttribute("disabled", "true");
|
|
}
|
|
}
|
|
|
|
// Also hide the window-list separator.
|
|
element = document.getElementById("sep-window-list");
|
|
element.hidden = true;
|
|
|
|
// Setup the dock menu.
|
|
let dockMenuElement = document.getElementById("menu_mac_dockmenu");
|
|
if (dockMenuElement != null) {
|
|
let nativeMenu = Cc[
|
|
"@mozilla.org/widget/standalonenativemenu;1"
|
|
].createInstance(Ci.nsIStandaloneNativeMenu);
|
|
|
|
try {
|
|
nativeMenu.init(dockMenuElement);
|
|
this.dockSupport.dockMenu = nativeMenu;
|
|
} catch (e) {}
|
|
}
|
|
|
|
dockMenuElement.addEventListener("command", this);
|
|
|
|
// Hide menuitems that don't apply to private contexts.
|
|
if (PrivateBrowsingUtils.permanentPrivateBrowsing) {
|
|
document.getElementById("macDockMenuNewWindow").hidden = true;
|
|
}
|
|
if (!PrivateBrowsingUtils.enabled) {
|
|
document.getElementById("macDockMenuNewPrivateWindow").hidden = true;
|
|
}
|
|
if (BrowserUIUtils.quitShortcutDisabled) {
|
|
document.getElementById("key_quitApplication").remove();
|
|
document.getElementById("menu_FileQuitItem").removeAttribute("key");
|
|
}
|
|
}
|
|
|
|
this.delayedStartupTimeoutId = setTimeout(() => this.delayedStartup(), 0);
|
|
},
|
|
|
|
delayedStartup() {
|
|
this.delayedStartupTimeoutId = null;
|
|
|
|
// initialise the offline listener
|
|
BrowserOffline.init();
|
|
|
|
// initialize the private browsing UI
|
|
gPrivateBrowsingUI.init();
|
|
},
|
|
|
|
shutdown() {
|
|
// If this is the hidden window being closed, release our reference to
|
|
// the dock menu element to prevent leaks on shutdown
|
|
if (window.location.href == this.MAC_HIDDEN_WINDOW) {
|
|
this.dockSupport.dockMenu = null;
|
|
}
|
|
|
|
// If nonBrowserWindowDelayedStartup hasn't run yet, we have no work to do -
|
|
// just cancel the pending timeout and return;
|
|
if (this.delayedStartupTimeoutId) {
|
|
clearTimeout(this.delayedStartupTimeoutId);
|
|
return;
|
|
}
|
|
|
|
BrowserOffline.uninit();
|
|
},
|
|
|
|
handleEvent(event) {
|
|
switch (event.type) {
|
|
case "load":
|
|
this.startup();
|
|
break;
|
|
case "unload":
|
|
this.shutdown();
|
|
break;
|
|
case "command":
|
|
if (event.target.id.startsWith("macDockMenuNew")) {
|
|
let wantPrivate = event.target.id == "macDockMenuNewPrivateWindow";
|
|
this.openBrowserWindowFromDockMenu(
|
|
wantPrivate ? { private: true } : {}
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
};
|
|
|
|
addEventListener("load", NonBrowserWindow, false);
|
|
addEventListener("unload", NonBrowserWindow, false);
|
|
XPCOMUtils.defineLazyServiceGetter(
|
|
NonBrowserWindow,
|
|
"dockSupport",
|
|
"@mozilla.org/widget/macdocksupport;1",
|
|
Ci.nsIMacDockSupport
|
|
);
|