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..75d1f8fe 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,14 @@ export class ContextMenuItemsController { } #onPopupShowing() { + const hideLinkItems = !gContextMenu.onSaveableLink; + SidebarElements.openLinkAsWebPanelMenuItem.toggleHidden(hideLinkItems); + SidebarElements.openLinkAsTempWebPanelMenuItem.toggleHidden(hideLinkItems); + gContextMenu.showItem( + "context-sep-open", + gContextMenu.shouldShowSeparator("context-sep-open"), + ); + this.searchQuery = gContextMenu.selectedText || gContextMenu.linkTextStr; SidebarElements.searchInWebPanelMenuItem.setSearchQuery(this.searchQuery); } 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) => { 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; } 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 { 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); + }; + } } 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}