From 5f2a773d0daab8c7f15746625fd5ffd91183afa9 Mon Sep 17 00:00:00 2001 From: Justin Baur <19896123+justindbaur@users.noreply.github.com> Date: Tue, 11 Feb 2025 15:12:11 -0500 Subject: [PATCH] Get Opera Ready for MV3 (#13190) * Add Opera Sidebar Related Manifest Keys * Be stricter about where sidebar API's come from * Skip Sidebar Icon Changes in MV3 * Fix typo in comment * Add `open_at_install` --- apps/browser/src/manifest.v3.json | 16 +++++++++++++++- apps/browser/src/platform/browser/browser-api.ts | 11 ++++++++--- .../src/platform/listeners/update-badge.ts | 7 +++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 2de32e7c4a7..43041aff563 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 1d8ff65c17d..293fca4d029 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 f67b96c847f..9f2a1f5a057 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()),