/* 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/. */
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
SyncedTabsController: "resource:///modules/SyncedTabsController.sys.mjs",
});
import {
html,
ifDefined,
when,
} from "chrome://global/content/vendor/lit.all.mjs";
import {
escapeHtmlEntities,
navigateToLink,
} from "chrome://browser/content/firefoxview/helpers.mjs";
import { SidebarPage } from "./sidebar-page.mjs";
class SyncedTabsInSidebar extends SidebarPage {
controller = new lazy.SyncedTabsController(this);
static queries = {
cards: { all: "moz-card" },
searchTextbox: "fxview-search-textbox",
};
constructor() {
super();
this.onSearchQuery = this.onSearchQuery.bind(this);
this.onSecondaryAction = this.onSecondaryAction.bind(this);
}
connectedCallback() {
super.connectedCallback();
this.controller.addSyncObservers();
this.controller.updateStates().then(() =>
Glean.syncedTabs.sidebarToggle.record({
opened: true,
synced_tabs_loaded: this.controller.isSyncedTabsLoaded,
version: "new",
})
);
this.addContextMenuListeners();
this.addSidebarFocusedListeners();
}
disconnectedCallback() {
super.disconnectedCallback();
this.controller.removeSyncObservers();
Glean.syncedTabs.sidebarToggle.record({
opened: false,
synced_tabs_loaded: this.controller.isSyncedTabsLoaded,
version: "new",
});
this.removeContextMenuListeners();
this.removeSidebarFocusedListeners();
}
handleContextMenuEvent(e) {
this.triggerNode = this.findTriggerNode(e, "sidebar-tab-row");
if (!this.triggerNode) {
e.preventDefault();
return;
}
const contextMenu = this._contextMenu;
const closeTabMenuItem = contextMenu.querySelector(
"#sidebar-context-menu-close-remote-tab"
);
closeTabMenuItem.setAttribute(
"data-l10n-args",
this.triggerNode.secondaryL10nArgs
);
// Enable the feature only if the device supports it
closeTabMenuItem.disabled = !this.triggerNode.canClose;
}
handleCommandEvent(e) {
switch (e.target.id) {
case "sidebar-context-menu-close-remote-tab":
this.requestOrRemoveTabToClose(
this.triggerNode.url,
this.triggerNode.fxaDeviceId,
this.triggerNode.secondaryActionClass
);
break;
default:
super.handleCommandEvent(e);
break;
}
}
handleSidebarFocusedEvent() {
this.searchTextbox?.focus();
}
onSecondaryAction(e) {
const { url, fxaDeviceId, secondaryActionClass } = e.originalTarget;
this.requestOrRemoveTabToClose(url, fxaDeviceId, secondaryActionClass);
}
requestOrRemoveTabToClose(url, fxaDeviceId, secondaryActionClass) {
if (secondaryActionClass === "dismiss-button") {
// Set new pending close tab
this.controller.requestCloseRemoteTab(fxaDeviceId, url);
} else if (secondaryActionClass === "undo-button") {
// User wants to undo
this.controller.removePendingTabToClose(fxaDeviceId, url);
}
this.requestUpdate();
}
/**
* The template shown when the list of synced devices is currently
* unavailable.
*
* @param {object} options
* @param {string} options.action
* @param {string} options.buttonLabel
* @param {string[]} options.descriptionArray
* @param {string} options.descriptionLink
* @param {string} options.header
* @param {string} options.mainImageUrl
* @returns {TemplateResult}
*/
messageCardTemplate({
action,
buttonLabel,
descriptionArray,
descriptionLink,
header,
mainImageUrl,
}) {
return html`