From 8724bb20c77069e94c5b76741f5e40379f2f2ea4 Mon Sep 17 00:00:00 2001 From: Alexander Logumanov Date: Sun, 6 Sep 2026 11:56:52 +0500 Subject: [PATCH 1/6] Show sidebar link actions only for link contexts --- README.md | 1 + .../controllers/context_menu_items.mjs | 15 ++++++++++++++- src/second_sidebar/css/context_item.mjs | 6 ------ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 89151e8a..ac481edc 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ https://github.com/user-attachments/assets/cd79d644-ca2c-4a30-ae8e-c265f41768b6 - Actions: `Create` • `Delete` • `Edit` • `Change position and size` • `Reset position and size` • `Unload` • `Mute` • `Unmute` • `Pin` • `Unpin` • `Change zoom` • `Go back` • `Go forward` • `Reload` • `Go home` - Extensions support +- Link context menu: `Open Link in Second Sidebar` • `Preview Link in Second Sidebar` (shown only for links that Firefox can open in a tab) - Popup notifications support (permissions to use microphone/camera/location, etc.) - Settings: - General: `URL` • `Multi-Account Container` • `Temporary` • `Mobile view` • `Zoom` diff --git a/src/second_sidebar/controllers/context_menu_items.mjs b/src/second_sidebar/controllers/context_menu_items.mjs index 8d40130e..5a140bcd 100644 --- a/src/second_sidebar/controllers/context_menu_items.mjs +++ b/src/second_sidebar/controllers/context_menu_items.mjs @@ -13,7 +13,10 @@ export class ContextMenuItemsController { #setupListeners() { BrowserElements.contentAreaContextMenu.addEventListener( "popupshowing", - () => this.#onPopupShowing(), + (event) => { + if (event.target !== event.currentTarget) return; + this.#onPopupShowing(); + }, ); SidebarElements.openLinkAsWebPanelMenuItem.addEventListener("command", () => @@ -32,6 +35,16 @@ export class ContextMenuItemsController { } #onPopupShowing() { + const hideLinkItems = !gContextMenu.onSaveableLink; + SidebarElements.openLinkAsWebPanelMenuItem.toggleAttribute( + "hidden", + hideLinkItems, + ); + SidebarElements.openLinkAsTempWebPanelMenuItem.toggleAttribute( + "hidden", + hideLinkItems, + ); + this.searchQuery = gContextMenu.selectedText || gContextMenu.linkTextStr; SidebarElements.searchInWebPanelMenuItem.setSearchQuery(this.searchQuery); } diff --git a/src/second_sidebar/css/context_item.mjs b/src/second_sidebar/css/context_item.mjs index b49734a5..164114db 100644 --- a/src/second_sidebar/css/context_item.mjs +++ b/src/second_sidebar/css/context_item.mjs @@ -1,10 +1,4 @@ export const CONTEXT_ITEM_CSS = ` - #contentAreaContextMenu:has(#context-openlink[hidden="true"]) { - #context-openlinkaswebpanel, #context-openlinkastempwebpanel, #context-sep-open { - display: none; - } - } - menuitem[label="Reset Zoom [100%]"] { display: none; } From a7ef7373645aa1821aea7510fac1ca7f0836003d Mon Sep 17 00:00:00 2001 From: Alexander Logumanov Date: Sun, 6 Sep 2026 12:05:01 +0500 Subject: [PATCH 2/6] Refresh link menu separator after hiding sidebar actions --- src/second_sidebar/controllers/context_menu_items.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/second_sidebar/controllers/context_menu_items.mjs b/src/second_sidebar/controllers/context_menu_items.mjs index 5a140bcd..a5227816 100644 --- a/src/second_sidebar/controllers/context_menu_items.mjs +++ b/src/second_sidebar/controllers/context_menu_items.mjs @@ -44,6 +44,10 @@ export class ContextMenuItemsController { "hidden", hideLinkItems, ); + gContextMenu.showItem( + "context-sep-open", + gContextMenu.shouldShowSeparator("context-sep-open"), + ); this.searchQuery = gContextMenu.selectedText || gContextMenu.linkTextStr; SidebarElements.searchInWebPanelMenuItem.setSearchQuery(this.searchQuery); From 408acedfd7edeb3a6d31ba4249426eea32f2d1de Mon Sep 17 00:00:00 2001 From: Alexander Logumanov Date: Sun, 6 Sep 2026 12:20:39 +0500 Subject: [PATCH 3/6] Guard hidden urlbar focus handling when closing preview panels --- .../patchers/urlbar_input_patcher.mjs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/second_sidebar/patchers/urlbar_input_patcher.mjs b/src/second_sidebar/patchers/urlbar_input_patcher.mjs index 2e444fab..b9257852 100644 --- a/src/second_sidebar/patchers/urlbar_input_patcher.mjs +++ b/src/second_sidebar/patchers/urlbar_input_patcher.mjs @@ -2,6 +2,7 @@ export class UrlbarInputPatcher { static patch() { console.log("Patching #urlbar-input..."); this.#defineLazyGetter(); + this.#patchTabSwitchFocusChange(); console.log("#urlbar-input was patched"); } @@ -10,4 +11,17 @@ export class UrlbarInputPatcher { const urlbarInput = childWindow.document.querySelector("#urlbar-input"); ChromeUtils.defineLazyGetter(urlbarInput, "editor", () => null); } + + static #patchTabSwitchFocusChange() { + const urlbar = window[1].gURLBar; + const afterTabSelectAndFocusChange = urlbar._afterTabSelectAndFocusChange; + if (typeof afterTabSelectAndFocusChange !== "function") return; + + urlbar._afterTabSelectAndFocusChange = function (...args) { + // The hidden urlbar may have no view. Its focus handler must not + // interrupt tab removal before the temporary panel is deleted. + if (!this.view) return; + return afterTabSelectAndFocusChange.apply(this, args); + }; + } } From 4e596aaf29863481aee8a9bfbaac48ec4141fcbb Mon Sep 17 00:00:00 2001 From: Alexander Logumanov Date: Sun, 6 Sep 2026 12:23:03 +0500 Subject: [PATCH 4/6] Skip redundant unload after closing a temporary panel --- src/second_sidebar/controllers/sidebar.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/second_sidebar/controllers/sidebar.mjs b/src/second_sidebar/controllers/sidebar.mjs index e44111ed..e575e909 100644 --- a/src/second_sidebar/controllers/sidebar.mjs +++ b/src/second_sidebar/controllers/sidebar.mjs @@ -74,7 +74,9 @@ export class SidebarController { const webPanelController = SidebarControllers.webPanelsController.getActive(); this.close(); - webPanelController.unload(); + if (!webPanelController.isUnloaded()) { + webPanelController.unload(); + } }); listenEvent(SidebarEvents.EDIT_SIDEBAR_POSITION, (event) => { From 1328a901711886a6b8bc71513ef558086a3397ff Mon Sep 17 00:00:00 2001 From: Alexander Logumanov Date: Sun, 6 Sep 2026 12:32:34 +0500 Subject: [PATCH 5/6] Restore temporary panel button attention background --- src/second_sidebar/css/sidebar_main.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/second_sidebar/css/sidebar_main.mjs b/src/second_sidebar/css/sidebar_main.mjs index 2aca7882..53f551a8 100644 --- a/src/second_sidebar/css/sidebar_main.mjs +++ b/src/second_sidebar/css/sidebar_main.mjs @@ -116,7 +116,10 @@ export const SIDEBAR_MAIN_CSS = ` } .sb2-main-button[temporary="true"] > stack.toolbarbutton-badge-stack { - background-color: var(--attention-dot-color) !important; + background-color: var( + --attention-dot-color, + var(--button-attention-dot-color, var(--color-accent-attention, AccentColor)) + ) !important; } .sb2-main-button:not([image]):not([loading]) .toolbarbutton-icon { From 275c2312a44429bc3bb4c80b029fd3493867b1a5 Mon Sep 17 00:00:00 2001 From: Alexander Logumanov Date: Sun, 6 Sep 2026 12:37:05 +0500 Subject: [PATCH 6/6] Add toggleHidden helper for context menu items --- src/second_sidebar/controllers/context_menu_items.mjs | 10 ++-------- src/second_sidebar/xul/base/xul_element.mjs | 9 +++++++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/second_sidebar/controllers/context_menu_items.mjs b/src/second_sidebar/controllers/context_menu_items.mjs index a5227816..75d1f8fe 100644 --- a/src/second_sidebar/controllers/context_menu_items.mjs +++ b/src/second_sidebar/controllers/context_menu_items.mjs @@ -36,14 +36,8 @@ export class ContextMenuItemsController { #onPopupShowing() { const hideLinkItems = !gContextMenu.onSaveableLink; - SidebarElements.openLinkAsWebPanelMenuItem.toggleAttribute( - "hidden", - hideLinkItems, - ); - SidebarElements.openLinkAsTempWebPanelMenuItem.toggleAttribute( - "hidden", - hideLinkItems, - ); + SidebarElements.openLinkAsWebPanelMenuItem.toggleHidden(hideLinkItems); + SidebarElements.openLinkAsTempWebPanelMenuItem.toggleHidden(hideLinkItems); gContextMenu.showItem( "context-sep-open", gContextMenu.shouldShowSeparator("context-sep-open"), diff --git a/src/second_sidebar/xul/base/xul_element.mjs b/src/second_sidebar/xul/base/xul_element.mjs index 4a941892..5e6387eb 100644 --- a/src/second_sidebar/xul/base/xul_element.mjs +++ b/src/second_sidebar/xul/base/xul_element.mjs @@ -82,6 +82,15 @@ export class XULElement { return this.setAttribute("hidden", true); } + /** + * + * @param {boolean} [force] + * @returns {XULElement} + */ + toggleHidden(force) { + return this.toggleAttribute("hidden", force); + } + /** * * @returns {boolean}