/* 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 { html, when, ifDefined, } from "chrome://global/content/vendor/lit.all.mjs"; import { SidebarPage } from "./sidebar-page.mjs"; const { XPCOMUtils } = ChromeUtils.importESModule( "resource://gre/modules/XPCOMUtils.sys.mjs" ); const l10nMap = new Map([ ["viewGenaiChatSidebar", "sidebar-menu-genai-chat-label"], ["viewGenaiPageAssistSidebar", "sidebar-menu-genai-page-assist-label"], ["viewGenaiSmartAssistSidebar", "sidebar-menu-genai-smart-assist-label"], ["viewHistorySidebar", "sidebar-menu-history-label"], ["viewTabsSidebar", "sidebar-menu-synced-tabs-label"], ["viewBookmarksSidebar", "sidebar-menu-bookmarks-label"], ["viewCPMSidebar", "sidebar-menu-contextual-password-manager-label"], ]); const VISIBILITY_SETTING_PREF = "sidebar.visibility"; const EXPAND_ON_HOVER_PREF = "sidebar.expandOnHover"; const POSITION_SETTING_PREF = "sidebar.position_start"; const TAB_DIRECTION_SETTING_PREF = "sidebar.verticalTabs"; export class SidebarCustomize extends SidebarPage { constructor() { super(); XPCOMUtils.defineLazyPreferenceGetter( this.#prefValues, "visibility", VISIBILITY_SETTING_PREF, "always-show", (_aPreference, _previousValue, newValue) => { this.visibility = newValue; } ); XPCOMUtils.defineLazyPreferenceGetter( this.#prefValues, "isPositionStart", POSITION_SETTING_PREF, true, (_aPreference, _previousValue, newValue) => { this.isPositionStart = newValue; } ); XPCOMUtils.defineLazyPreferenceGetter( this.#prefValues, "verticalTabsEnabled", TAB_DIRECTION_SETTING_PREF, false, (_aPreference, _previousValue, newValue) => { this.verticalTabsEnabled = newValue; } ); XPCOMUtils.defineLazyPreferenceGetter( this.#prefValues, "expandOnHoverEnabled", EXPAND_ON_HOVER_PREF, false, (_aPreference, _previousValue, newValue) => { this.expandOnHoverEnabled = newValue; } ); this.visibility = this.#prefValues.visibility; this.isPositionStart = this.#prefValues.isPositionStart; this.verticalTabsEnabled = this.#prefValues.verticalTabsEnabled; this.expandOnHoverEnabled = this.#prefValues.expandOnHoverEnabled; this.boundObserve = (...args) => this.observe(...args); } #prefValues = {}; static properties = { visibility: { type: String }, isPositionStart: { type: Boolean }, verticalTabsEnabled: { type: Boolean }, expandOnHoverEnabled: { type: Boolean }, }; static queries = { toolInputs: { all: ".tools > .tool" }, extensionInputs: { all: ".extensions > .tool" }, extensionLink: ".extension-item a", positionInput: "#position", visibilityInput: "#hide-sidebar", verticalTabsInput: "#vertical-tabs", expandOnHoverInput: "#expand-on-hover", }; connectedCallback() { super.connectedCallback(); this.getWindow().addEventListener("SidebarItemAdded", this); this.getWindow().addEventListener("SidebarItemChanged", this); this.getWindow().addEventListener("SidebarItemRemoved", this); } disconnectedCallback() { super.disconnectedCallback(); this.getWindow().removeEventListener("SidebarItemAdded", this); this.getWindow().removeEventListener("SidebarItemChanged", this); this.getWindow().removeEventListener("SidebarItemRemoved", this); } get fluentStrings() { if (!this._fluentStrings) { this._fluentStrings = new Localization(["browser/sidebar.ftl"], true); } return this._fluentStrings; } getWindow() { return window.browsingContext.embedderWindowGlobal.browsingContext.window; } handleEvent(e) { switch (e.type) { case "SidebarItemAdded": case "SidebarItemChanged": case "SidebarItemRemoved": this.requestUpdate(); break; } } async onToggleToolInput(e, commandID) { e.preventDefault(); this.getWindow().SidebarController.toggleTool(commandID); switch (commandID) { case "viewGenaiChatSidebar": Glean.sidebarCustomize.chatbotEnabled.record({ checked: e.target.checked, }); break; case "viewTabsSidebar": Glean.sidebarCustomize.syncedTabsEnabled.record({ checked: e.target.checked, }); break; case "viewHistorySidebar": Glean.sidebarCustomize.historyEnabled.record({ checked: e.target.checked, }); break; case "viewBookmarksSidebar": Glean.sidebarCustomize.bookmarksEnabled.record({ checked: e.target.checked, }); break; case "viewCPMSidebar": Glean.contextualManager.passwordsEnabled.record({ checked: e.target.checked, }); break; } } getInputL10nId(view) { return l10nMap.get(view); } openFirefoxSettings(e) { if (e.type == "click" || (e.type == "keydown" && e.code == "Enter")) { e.preventDefault(); this.getWindow().openPreferences(); Glean.sidebarCustomize.firefoxSettingsClicked.record(); } } toolInputTemplate(tool) { if (tool.hidden) { return null; } return html` this.onToggleToolInput(e, tool.commandID)} ?checked=${!tool.disabled} > `; } manageAddons(e) { if (e.type == "click" || (e.type == "keydown" && e.code == "Enter")) { e.preventDefault(); this.getWindow().BrowserAddonUI.openAddonsMgr("addons://list/extension"); Glean.sidebarCustomize.extensionsClicked.record(); } } reversePosition() { const { SidebarController } = this.getWindow(); SidebarController.reversePosition(); Glean.sidebarCustomize.sidebarPosition.record({ position: this.isPositionStart !== this.getWindow().RTL_UI ? "left" : "right", }); } render() { let extensions = this.getWindow().SidebarController.getExtensions(); return html` ${this.stylesheet()} `; } #handleVisibilityChange(e) { e.stopPropagation(); this.visibility = e.target.checked ? "hide-sidebar" : "always-show"; Services.prefs.setStringPref( VISIBILITY_SETTING_PREF, e.target.checked ? "hide-sidebar" : "always-show" ); Glean.sidebarCustomize.sidebarDisplay.record({ preference: e.target.checked ? "hide" : "always", }); } #toggleExpandOnHover(e) { e.stopPropagation(); if (e.target.checked) { Services.prefs.setStringPref("sidebar.visibility", "expand-on-hover"); Glean.sidebarCustomize.expandOnHoverEnabled.record({ checked: true, }); } else { Services.prefs.setStringPref("sidebar.visibility", "always-show"); } } #handleTabDirectionChange({ target: { checked } }) { const verticalTabsEnabled = checked; Services.prefs.setBoolPref(TAB_DIRECTION_SETTING_PREF, verticalTabsEnabled); Glean.sidebarCustomize.tabsLayout.record({ orientation: verticalTabsEnabled ? "vertical" : "horizontal", }); } } customElements.define("sidebar-customize", SidebarCustomize);