summaryrefslogtreecommitdiffstats
path: root/browser/base/content/nonbrowser-mac.js
blob: d2dda363b1b96aeb569513f343a0e7ebf2a06d71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/* -*- 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 */

ChromeUtils.defineESModuleGetters(this, {
  NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs",
});

let delayedStartupTimeoutId = null;

function OpenBrowserWindowFromDockMenu(options) {
  let win = OpenBrowserWindow(options);
  win.addEventListener(
    "load",
    function () {
      let dockSupport = Cc["@mozilla.org/widget/macdocksupport;1"].getService(
        Ci.nsIMacDockSupport
      );
      dockSupport.activateApplication(true);
    },
    { once: true }
  );

  return win;
}

function nonBrowserWindowStartup() {
  // 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 == "chrome://browser/content/hiddenWindowMac.xhtml"
  ) {
    // 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",
      "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);

        let dockSupport = Cc["@mozilla.org/widget/macdocksupport;1"].getService(
          Ci.nsIMacDockSupport
        );
        dockSupport.dockMenu = nativeMenu;
      } catch (e) {}
    }

    // 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");
    }
  }

  delayedStartupTimeoutId = setTimeout(nonBrowserWindowDelayedStartup, 0);
}

function nonBrowserWindowDelayedStartup() {
  delayedStartupTimeoutId = null;

  // initialise the offline listener
  BrowserOffline.init();

  // initialize the private browsing UI
  gPrivateBrowsingUI.init();

  if (!NimbusFeatures.majorRelease2022.getVariable("firefoxView")) {
    document.getElementById("menu_openFirefoxView").hidden = true;
  }
}

function nonBrowserWindowShutdown() {
  // 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 == "chrome://browser/content/hiddenWindowMac.xhtml"
  ) {
    let dockSupport = Cc["@mozilla.org/widget/macdocksupport;1"].getService(
      Ci.nsIMacDockSupport
    );
    dockSupport.dockMenu = null;
  }

  // If nonBrowserWindowDelayedStartup hasn't run yet, we have no work to do -
  // just cancel the pending timeout and return;
  if (delayedStartupTimeoutId) {
    clearTimeout(delayedStartupTimeoutId);
    return;
  }

  BrowserOffline.uninit();
}

addEventListener("load", nonBrowserWindowStartup, false);
addEventListener("unload", nonBrowserWindowShutdown, false);