1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 // This file is loaded into the browser window scope.
6 /* eslint-env mozilla/browser-window */
8 ChromeUtils.defineESModuleGetters(this, {
9 TabsPanel: "resource:///modules/TabsList.sys.mjs",
14 allTabsButton: "alltabs-button",
15 allTabsView: "allTabsMenu-allTabsView",
16 allTabsViewTabs: "allTabsMenu-allTabsView-tabs",
17 dropIndicator: "allTabsMenu-dropIndicator",
18 containerTabsView: "allTabsMenu-containerTabsView",
19 hiddenTabsButton: "allTabsMenu-hiddenTabsButton",
20 hiddenTabsView: "allTabsMenu-hiddenTabsView",
23 _initializedElements: false,
26 if (this._initializedElements) {
29 let template = document.getElementById("allTabsMenu-container");
30 template.replaceWith(template.content);
32 for (let [name, id] of Object.entries(this.kElements)) {
33 this[name] = document.getElementById(id);
35 this._initializedElements = true;
39 if (this._initialized) {
45 this.hiddenAudioTabsPopup = new TabsPanel({
46 view: this.allTabsView,
47 insertBefore: document.getElementById("allTabsMenu-tabsSeparator"),
48 filterFn: tab => tab.hidden && tab.soundPlaying,
50 let showPinnedTabs = Services.prefs.getBoolPref(
51 "browser.tabs.tabmanager.enabled"
53 this.allTabsPanel = new TabsPanel({
54 view: this.allTabsView,
55 containerNode: this.allTabsViewTabs,
57 !tab.hidden && (!tab.pinned || (showPinnedTabs && tab.pinned)),
58 dropIndicator: this.dropIndicator,
61 this.allTabsView.addEventListener("ViewShowing", () => {
62 PanelUI._ensureShortcutsShown(this.allTabsView);
64 let containersEnabled =
65 Services.prefs.getBoolPref("privacy.userContext.enabled") &&
66 !PrivateBrowsingUtils.isWindowPrivate(window);
67 document.getElementById("allTabsMenu-containerTabsButton").hidden =
70 let hasHiddenTabs = gBrowser.visibleTabs.length < gBrowser.tabs.length;
71 document.getElementById("allTabsMenu-hiddenTabsButton").hidden =
73 document.getElementById("allTabsMenu-hiddenTabsSeparator").hidden =
77 this.allTabsView.addEventListener("ViewShown", () =>
79 .querySelector(".all-tabs-item[selected]")
80 ?.scrollIntoView({ block: "center" })
83 let containerTabsMenuSeparator =
84 this.containerTabsView.querySelector("toolbarseparator");
85 this.containerTabsView.addEventListener("ViewShowing", e => {
87 let frag = document.createDocumentFragment();
89 ContextualIdentityService.getPublicIdentities().forEach(identity => {
90 let menuitem = document.createXULElement("toolbarbutton");
91 menuitem.setAttribute("class", "subviewbutton subviewbutton-iconic");
93 menuitem.setAttribute("label", identity.name);
95 document.l10n.setAttributes(menuitem, identity.l10nId);
97 // The styles depend on this.
98 menuitem.setAttribute("usercontextid", identity.userContextId);
99 // The command handler depends on this.
100 menuitem.setAttribute("data-usercontextid", identity.userContextId);
101 menuitem.classList.add("identity-icon-" + identity.icon);
102 menuitem.classList.add("identity-color-" + identity.color);
104 menuitem.setAttribute("command", "Browser:NewUserContextTab");
106 frag.appendChild(menuitem);
107 elements.push(menuitem);
110 e.target.addEventListener(
113 for (let element of elements) {
119 containerTabsMenuSeparator.parentNode.insertBefore(
121 containerTabsMenuSeparator
125 this.hiddenTabsPopup = new TabsPanel({
126 view: this.hiddenTabsView,
127 filterFn: tab => tab.hidden,
130 this._initialized = true;
135 return isElementVisible(this.allTabsButton);
138 showAllTabsPanel(event, entrypoint = "unknown") {
139 // Note that event may be null.
141 // Only space and enter should open the popup, ignore other keypresses:
142 if (event?.type == "keypress" && event.key != "Enter" && event.key != " ") {
147 Services.telemetry.keyedScalarAdd(
148 "browser.ui.interaction.all_tabs_panel_entrypoint",
153 this.kElements.allTabsView,
161 if (this.allTabsView) {
162 PanelMultiView.hidePopup(this.allTabsView.closest("panel"));
166 showHiddenTabsPanel(event, entrypoint = "unknown") {
171 this.allTabsView.addEventListener(
175 this.kElements.hiddenTabsView,
176 this.hiddenTabsButton
181 this.showAllTabsPanel(event, entrypoint);
185 gURLBar.search(UrlbarTokenizer.RESTRICT.OPENPAGE, {
186 searchModeEntry: "tabmenu",