diff --git a/src/ZenPinnedTabManager.mjs b/src/ZenPinnedTabManager.mjs index e4e7dc9..285e56b 100644 --- a/src/ZenPinnedTabManager.mjs +++ b/src/ZenPinnedTabManager.mjs @@ -9,7 +9,7 @@ constructor() { XPCOMUtils.defineLazyPreferenceGetter(lazy, 'zenPinnedTabRestorePinnedTabsToPinnedUrl', 'zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false); XPCOMUtils.defineLazyPreferenceGetter(lazy, 'zenPinnedTabCloseShortcutBehavior', 'zen.pinned-tab-manager.close-shortcut-behavior', 'switch'); - + ChromeUtils.defineESModuleGetters(lazy, {E10SUtils: "resource://gre/modules/E10SUtils.sys.mjs"}); this.#listenPinnedTabEvents(); } @@ -49,9 +49,15 @@ switch (action) { case "TabPinned": this._setPinnedAttributes(tab); + tab._zenClickEventListener = this._onTabClick.bind(this, tab); + tab.addEventListener("click", tab._zenClickEventListener); break; case "TabUnpinned": this._removePinnedAttributes(tab); + if (tab._zenClickEventListener) { + tab.removeEventListener("click", tab._zenClickEventListener); + delete tab._zenClickEventListener; + } break; default: console.warn('ZenPinnedTabManager: Unhandled tab event', action); @@ -59,6 +65,12 @@ } } + _onTabClick(tab, e) { + if (e.button === 1) { + this._onCloseTabShortcut(e, tab); + } + } + resetPinnedTab(tab) { if (!tab) { @@ -85,12 +97,14 @@ tab.setAttribute("zen-pinned-url", tab.linkedBrowser.currentURI.spec); tab.setAttribute("zen-pinned-title", tab.getAttribute("label")); tab.setAttribute("zen-pinned-icon", tab.linkedBrowser.mIconURL); + tab.setAttribute("zen-pinned-triggering-principal", lazy.E10SUtils.serializePrincipal(tab.linkedBrowser.contentPrincipal)); } _removePinnedAttributes(tab) { tab.removeAttribute("zen-pinned-url"); tab.removeAttribute("zen-pinned-title"); tab.removeAttribute("zen-pinned-icon"); + tab.removeAttribute("zen-pinned-triggering-principal"); } _initClosePinnedTabShortcut() { @@ -105,25 +119,25 @@ tabData.zenPinnedUrl = tab.getAttribute("zen-pinned-url"); tabData.zenPinnedTitle = tab.getAttribute("zen-pinned-title"); tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon"); + tabData.zenPinnedTriggeringPrincipal = tab.getAttribute("zen-pinned-triggering-principal"); } updatePinnedTabForSessionRestore(tabData, tab) { !!tabData.zenPinnedUrl ? tab.setAttribute("zen-pinned-url", tabData.zenPinnedUrl) : tab.removeAttribute("zen-pinned-url"); !!tabData.zenPinnedTitle ? tab.setAttribute("zen-pinned-title", tabData.zenPinnedTitle) : tab.removeAttribute("zen-pinned-title"); !!tabData.zenPinnedIcon ? tab.setAttribute("zen-pinned-icon", tabData.zenPinnedIcon) : tab.removeAttribute("zen-pinned-icon"); + !!tabData.zenPinnedTriggeringPrincipal ? tab.setAttribute("zen-pinned-triggering-principal", tabData.zenPinnedTriggeringPrincipal) : tab.removeAttribute("zen-pinned-triggering-principal"); } - _onCloseTabShortcut(event) { + _onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab) { if ( - !event || - !(event.ctrlKey || event.metaKey || event.altKey) || - !gBrowser.selectedTab?.pinned + !selectedTab?.pinned ) { return; } - const selectedTab = gBrowser.selectedTab; - if (!selectedTab) return; + event.stopPropagation(); + event.preventDefault(); const behavior = lazy.zenPinnedTabCloseShortcutBehavior; @@ -150,11 +164,13 @@ return; } - event.stopPropagation(); - event.preventDefault(); + } _handleTabSwitch(selectedTab) { + if(selectedTab !== gBrowser.selectedTab) { + return; + } const findNextTab = (direction) => gBrowser.tabContainer.findNextTab(selectedTab, { direction, @@ -171,12 +187,13 @@ const url = tab.getAttribute("zen-pinned-url"); const title = tab.getAttribute("zen-pinned-title"); const icon = tab.getAttribute("zen-pinned-icon"); + const triggeringPrincipal_base64 = tab.getAttribute("zen-pinned-triggering-principal"); if (url) { const tabState = SessionStore.getTabState(tab); const state = JSON.parse(tabState); - state.entries = [{url, title}]; + state.entries = [{url, title, triggeringPrincipal_base64}]; state.image = icon; state.index = 0; @@ -200,7 +217,7 @@ resetPinnedTabData(tabData) { if (lazy.zenPinnedTabRestorePinnedTabsToPinnedUrl && tabData.pinned && tabData.zenPinnedUrl) { - tabData.entries = [{url: tabData.zenPinnedUrl, title: tabData.zenPinnedTitle}]; + tabData.entries = [{url: tabData.zenPinnedUrl, title: tabData.zenPinnedTitle, triggeringPrincipal_base64: tabData.zenPinnedTriggeringPrincipal}]; tabData.image = tabData.zenPinnedIcon; tabData.index = 0; }