diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 2de32e7c4a..43041aff56 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -128,6 +128,13 @@ }, "description": "__MSG_commandOpenSidebar__" }, + "__opera___execute_sidebar_action": { + "suggested_key": { + "default": "Alt+Shift+Y", + "linux": "Alt+Shift+U" + }, + "description": "__MSG_commandOpenSidebar__" + }, "autofill_login": { "suggested_key": { "default": "Ctrl+Shift+L" @@ -182,5 +189,12 @@ "storage": { "managed_schema": "managed_schema.json" }, - "__firefox__storage": null + "__firefox__storage": null, + "__opera__sidebar_action": { + "default_title": "Bitwarden", + "default_panel": "popup/index.html?uilocation=sidebar", + "default_icon": "images/icon19.png", + "open_at_install": false, + "browser_style": false + } } diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 1d8ff65c17..293fca4d02 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -530,10 +530,15 @@ export class BrowserApi { win: Window & typeof globalThis, ): OperaSidebarAction | FirefoxSidebarAction | null { const deviceType = BrowserPlatformUtilsService.getDevice(win); - if (deviceType !== DeviceType.FirefoxExtension && deviceType !== DeviceType.OperaExtension) { - return null; + if (deviceType === DeviceType.FirefoxExtension) { + return browser.sidebarAction; } - return win.opr?.sidebarAction || browser.sidebarAction; + + if (deviceType === DeviceType.OperaExtension) { + return win.opr?.sidebarAction; + } + + return null; } static captureVisibleTab(): Promise { diff --git a/apps/browser/src/platform/listeners/update-badge.ts b/apps/browser/src/platform/listeners/update-badge.ts index f67b96c847..9f2a1f5a05 100644 --- a/apps/browser/src/platform/listeners/update-badge.ts +++ b/apps/browser/src/platform/listeners/update-badge.ts @@ -165,6 +165,13 @@ export class UpdateBadge { return; } + if ("opr" in this.win && BrowserApi.isManifestVersion(3)) { + // setIcon API is currenly broken for Opera MV3 extensions + // https://forums.opera.com/topic/75680/opr-sidebaraction-seticon-api-is-broken-access-to-extension-api-denied?_=1738349261570 + // The API currently crashes on MacOS + return; + } + if (this.isOperaSidebar(this.sidebarAction)) { await new Promise((resolve) => (this.sidebarAction as OperaSidebarAction).setIcon(options, () => resolve()),