Files
tubestation/browser/components/sidebar/sidebar-customize.mjs
Sandor Molnar 34e807bc63 Backed out 5 changesets (bug 1897529, bug 1901336, bug 1900126) for causing bc failures @ browser_a11y_sidebar.js CLOSED TREE
Backed out changeset 334b820a4c19 (bug 1897529)
Backed out changeset 70350abadcba (bug 1900126)
Backed out changeset 3d631de2ce01 (bug 1897529)
Backed out changeset 1d654154d5ea (bug 1897529)
Backed out changeset a8f7b541a548 (bug 1901336)
2024-06-14 22:41:48 +03:00

207 lines
6.0 KiB
JavaScript

/* 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 } from "chrome://global/content/vendor/lit.all.mjs";
import { SidebarPage } from "./sidebar-page.mjs";
// eslint-disable-next-line import/no-unassigned-import
import "chrome://global/content/elements/moz-button.mjs";
const l10nMap = new Map([
["viewHistorySidebar", "sidebar-menu-history-label"],
["viewTabsSidebar", "sidebar-menu-synced-tabs-label"],
["viewBookmarksSidebar", "sidebar-menu-bookmarks-label"],
]);
export class SidebarCustomize extends SidebarPage {
constructor() {
super();
this.activeExtIndex = 0;
}
static properties = {
activeExtIndex: { type: Number },
};
static queries = {
toolInputs: { all: ".customize-firefox-tools input" },
extensionLinks: { all: ".extension-link" },
};
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 sidebarLauncher() {
return this.getWindow().document.querySelector("sidebar-launcher");
}
getWindow() {
return window.browsingContext.embedderWindowGlobal.browsingContext.window;
}
closeCustomizeView(e) {
e.preventDefault();
let view = e.target.getAttribute("view");
this.getWindow().SidebarController.toggle(view);
}
handleEvent(e) {
switch (e.type) {
case "SidebarItemAdded":
case "SidebarItemChanged":
case "SidebarItemRemoved":
this.requestUpdate();
break;
}
}
async onToggleInput(e) {
e.preventDefault();
this.getWindow().SidebarController.toggleTool(e.target.id);
}
getInputL10nId(view) {
return l10nMap.get(view);
}
openFirefoxSettings(e) {
e.preventDefault();
if (e.type == "click" || (e.type == "keydown" && e.code == "Enter")) {
this.getWindow().openPreferences();
}
}
inputTemplate(tool) {
return html`<div class="input-wrapper">
<input
type="checkbox"
id=${tool.view}
name=${tool.view}
@change=${this.onToggleInput}
?checked=${!tool.disabled}
/>
<label for=${tool.view}>
<img src=${tool.iconUrl} class="icon" role="presentation" />
<span data-l10n-id=${this.getInputL10nId(tool.view)} />
</label>
</div>`;
}
async manageAddon(extensionId) {
await this.getWindow().BrowserAddonUI.manageAddon(
extensionId,
"unifiedExtensions"
);
}
handleKeydown(e) {
if (e.code == "ArrowUp") {
if (this.activeExtIndex >= 0) {
this.focusIndex(this.activeExtIndex - 1);
}
} else if (e.code == "ArrowDown") {
if (this.activeExtIndex < this.extensionLinks.length) {
this.focusIndex(this.activeExtIndex + 1);
}
} else if (
(e.type == "keydown" && e.code == "Enter") ||
(e.type == "keydown" && e.code == "Space")
) {
this.manageAddon(e.target.getAttribute("extensionId"));
}
}
focusIndex(index) {
let extLinkList = Array.from(
this.shadowRoot.querySelectorAll(".extension-link")
);
extLinkList[index].focus();
this.activeExtIndex = index;
}
extensionTemplate(extension, index) {
return html` <div class="extension-item">
<img src=${extension.iconUrl} class="icon" role="presentation" />
<div
class="extension-link"
extensionId=${extension.extensionId}
tabindex=${index === this.activeExtIndex ? 0 : -1}
role="list-item"
@click=${() => this.manageAddon(extension.extensionId)}
@keydown=${this.handleKeydown}
>
<a
href="about:addons"
tabindex="-1"
target="_blank"
@click=${e => e.preventDefault()}
>${extension.tooltiptext}
</a>
</div>
</div>`;
}
render() {
let extensions = this.getWindow().SidebarController.getExtensions();
return html`
${this.stylesheet()}
<link rel="stylesheet" href="chrome://browser/content/sidebar/sidebar-customize.css"></link>
<div class="container">
<div class="customize-header">
<h2 data-l10n-id="sidebar-menu-customize-label"></h2>
<moz-button
class="customize-close-button"
@click=${this.closeCustomizeView}
view="viewCustomizeSidebar"
size="default"
type="icon ghost"
>
</moz-button>
</div>
<div class="customize-firefox-tools">
<h5 data-l10n-id="sidebar-customize-firefox-tools"></h5>
<div class="inputs">
${this.getWindow()
.SidebarController.getTools()
.map(tool => this.inputTemplate(tool))}
</div>
</div>
${when(
extensions.length,
() => html`<div class="customize-extensions">
<h5 data-l10n-id="sidebar-customize-extensions"></h5>
<div role="list" class="extensions">
${extensions.map((extension, index) =>
this.extensionTemplate(extension, index)
)}
</div>
</div>`
)}
<div id="manage-settings">
<span class="icon ghost-icon" role="presentation"></span>
<a
href="about:preferences"
@click=${this.openFirefoxSettings}
@keydown=${this.openFirefoxSettings}
data-l10n-id="sidebar-customize-firefox-settings"
>
</a>
</div>
</div>
`;
}
}
customElements.define("sidebar-customize", SidebarCustomize);