// 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/. import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; import { ZenLittleWindow } from "resource:///modules/zen/ZenLittleWindow.sys.mjs"; export const ZenCustomizableUI = new (class { constructor() {} TYPE_TOOLBAR = "toolbar"; defaultSidebarIcons = [ "downloads-button", "zen-workspaces-button", "zen-create-new-button", ]; startup(CustomizableUIInternal) { CustomizableUIInternal.registerArea( "zen-sidebar-top-buttons", { type: this.TYPE_TOOLBAR, defaultPlacements: ["zen-toggle-compact-mode"], defaultCollapsed: null, overflowable: true, }, true ); CustomizableUIInternal.registerArea( "zen-sidebar-foot-buttons", { type: this.TYPE_TOOLBAR, defaultPlacements: this.defaultSidebarIcons, defaultCollapsed: null, }, true ); } // We do not have access to the window object here init(window) { this.#initLittleWindow(window); this.#addSidebarButtons(window); this.#modifyToolbarButtons(window); } #initLittleWindow(window) { ZenLittleWindow.onLittleWindow(window); } #addSidebarButtons(window) { const kDefaultSidebarWidth = AppConstants.platform === "macosx" ? "230px" : "186px"; const toolbox = window.gNavToolbox; // Set a splitter to navigator-toolbox const splitter = window.document.createXULElement("splitter"); splitter.setAttribute("id", "zen-sidebar-splitter"); splitter.setAttribute("orient", "horizontal"); splitter.setAttribute("resizebefore", "sibling"); splitter.setAttribute("resizeafter", "none"); toolbox.insertAdjacentElement("afterend", splitter); const sidebarBox = window.MozXULElement.parseXULToFragment(` `); toolbox.prepend(sidebarBox); new window.MutationObserver(e => { if (e[0].type !== "attributes" || e[0].attributeName !== "width") { return; } this._dispatchResizeEvent(window); }).observe(toolbox, { attributes: true, //configure it to listen to attribute changes }); // remove all styles except for the width, since we are xulstoring the complet style list const width = toolbox.style.width || kDefaultSidebarWidth; toolbox.removeAttribute("style"); toolbox.style.width = width; toolbox.setAttribute("width", width); splitter.addEventListener("dblclick", e => { if (e.button !== 0) { return; } toolbox.style.width = kDefaultSidebarWidth; toolbox.setAttribute("width", kDefaultSidebarWidth); }); const newTab = window.document.getElementById( "vertical-tabs-newtab-button" ); newTab.classList.add("zen-sidebar-action-button"); for (let id of this.defaultSidebarIcons) { const elem = window.document.getElementById(id); if (!elem || elem.id === "zen-workspaces-button") { continue; } elem.setAttribute("removable", "true"); } this.#initCreateNewButton(window); this.#moveWindowButtons(window); } #initCreateNewButton(window) { const button = window.document.getElementById("zen-create-new-button"); // If we use "mousedown" event for private windows (which open a new tab on "click"), we might end up with // the urlbar flicking and therefore we use "command" event to avoid that. let isPrivateMode = window.gZenWorkspaces.privateWindowOrDisabled; button.addEventListener(isPrivateMode ? "command" : "mousedown", event => { if (isPrivateMode) { window.document.getElementById("cmd_newNavigatorTab").doCommand(); return; } if (button.hasAttribute("open")) { return; } const popup = window.document.getElementById("zenCreateNewPopup"); popup.openPopup( button, "before_start", 0, 0, true /* isContextMenu */, false /* attributesOverride */, event ); }); } #moveWindowButtons(window) { const windowControls = window.document.getElementsByClassName( "titlebar-buttonbox-container" ); const toolboxIcons = window.document.getElementById( "zen-sidebar-top-buttons-customization-target" ); if ( window.AppConstants.platform === "macosx" || window.matchMedia("(-moz-gtk-csd-reversed-placement)").matches ) { for (let i = 0; i < windowControls.length; i++) { if (i === 0) { toolboxIcons.prepend(windowControls[i]); continue; } windowControls[i].remove(); } } } #modifyToolbarButtons(window) { const wrapper = window.document.getElementById("zen-sidebar-foot-buttons"); const elementsToHide = ["new-tab-button"]; for (let id of elementsToHide) { const elem = window.document.getElementById(id); if (elem) { wrapper.prepend(elem); } } window.document .getElementById("stop-reload-button") .removeAttribute("overflows"); } _dispatchResizeEvent(window) { window.dispatchEvent(new window.Event("resize")); } registerToolbarNodes(window) { window.CustomizableUI.registerToolbarNode( window.document.getElementById("zen-sidebar-top-buttons") ); window.CustomizableUI.registerToolbarNode( window.document.getElementById("zen-sidebar-foot-buttons") ); } })();