/* 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, ifDefined, styleMap, } from "chrome://global/content/vendor/lit.all.mjs"; import { MozLitElement } from "chrome://global/content/lit-utils.mjs"; // eslint-disable-next-line import/no-unassigned-import import "chrome://global/content/elements/moz-button.mjs"; /** * Vertical strip attached to the launcher that provides an entry point * to various sidebar panels. * */ export default class SidebarLauncher extends MozLitElement { static properties = { topActions: { type: Array }, extensionActions: { type: Array }, bottomActions: { type: Array }, selectedView: { type: String }, open: { type: Boolean }, }; static queries = { extensionButtons: { all: ".extension-actions > moz-button" }, }; constructor() { super(); this.topActions = [ { icon: `url("chrome://browser/skin/insights.svg")`, view: null, l10nId: "sidebar-launcher-insights", }, ]; this.extensionActions = []; this.bottomActions = [ { l10nId: "sidebar-menu-history", icon: `url("chrome://browser/content/firefoxview/view-history.svg")`, view: "viewHistorySidebar", }, { l10nId: "sidebar-menu-bookmarks", icon: `url("chrome://browser/skin/bookmark-hollow.svg")`, view: "viewBookmarksSidebar", }, { l10nId: "sidebar-menu-synced-tabs", icon: `url("chrome://browser/skin/device-phone.svg")`, view: "viewTabsSidebar", }, ]; this.selectedView = window.SidebarUI.currentID; this.open = window.SidebarUI.isOpen; } connectedCallback() { super.connectedCallback(); this._sidebarBox = document.getElementById("sidebar-box"); this._sidebarBox.addEventListener("sidebar-show", this); this._sidebarBox.addEventListener("sidebar-hide", this); window.addEventListener("SidebarItemAdded", this); window.addEventListener("SidebarItemChanged", this); window.addEventListener("SidebarItemRemoved", this); this.setExtensionItems(); } disconnectedCallback() { super.disconnectedCallback(); this._sidebarBox.removeEventListener("sidebar-show", this); this._sidebarBox.removeEventListener("sidebar-hide", this); window.removeEventListener("SidebarItemAdded", this); window.removeEventListener("SidebarItemChanged", this); window.removeEventListener("SidebarItemRemoved", this); } getImageUrl(icon, targetURI) { if (window.IS_STORYBOOK) { return `chrome://global/skin/icons/defaultFavicon.svg`; } if (!icon) { if (targetURI?.startsWith("moz-extension")) { return "chrome://mozapps/skin/extensions/extension.svg"; } return `chrome://global/skin/icons/defaultFavicon.svg`; } // If the icon is not for website (doesn't begin with http), we // display it directly. Otherwise we go through the page-icon // protocol to try to get a cached version. We don't load // favicons directly. if (icon.startsWith("http")) { return `page-icon:${targetURI}`; } return icon; } setExtensionItems() { this.extensionActions = window.SidebarUI.getExtensions().map( ({ commandID, icon, label }) => ({ tooltiptext: label, icon, view: commandID, }) ); } handleEvent(e) { switch (e.type) { case "sidebar-show": this.selectedView = e.detail.viewId; this.open = true; break; case "sidebar-hide": this.open = false; break; case "SidebarItemAdded": case "SidebarItemChanged": case "SidebarItemRemoved": this.setExtensionItems(); break; } } showView(e) { let view = e.target.getAttribute("view"); window.SidebarUI.toggle(view); } buttonType(action) { return this.open && action.view == this.selectedView ? "icon" : "icon ghost"; } entrypointTemplate(action) { return html` `; } render() { return html`
${this.topActions.map(action => this.entrypointTemplate(action))}
${this.extensionActions.map(action => this.entrypointTemplate(action) )}
${this.bottomActions.map(action => this.entrypointTemplate(action))}
`; } } customElements.define("sidebar-launcher", SidebarLauncher);