From ecda510d26e5ca79e9c455997c9aef6def82ed43 Mon Sep 17 00:00:00 2001 From: Miles Robinson Date: Fri, 14 Feb 2025 16:47:32 -0500 Subject: [PATCH] Send message to extension code when popup close required. --- apps/browser/src/background/main.background.ts | 4 ++++ apps/browser/src/background/runtime.background.ts | 3 +++ apps/browser/src/platform/browser/browser-api.ts | 5 ++++- .../src/safari/desktop.xcodeproj/project.pbxproj | 4 ++++ .../safari/safari/SafariExtensionViewController.swift | 8 ++++++++ .../src/safari/safari/SafariWebExtensionHandler.swift | 10 ++++++++-- 6 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 apps/browser/src/safari/safari/SafariExtensionViewController.swift diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index d2b51c7ef40..1d98969052b 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1577,6 +1577,10 @@ export default class MainBackground { await SafariApp.sendMessageToApp("showPopover", null, true); } + async closeSafariPopup() { + await SafariApp.sendMessageToApp("closePopover", null, true); + } + async reseedStorage() { if ( !this.platformUtilsService.isChrome() && diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 2a756293070..3b86d28542b 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -291,6 +291,9 @@ export default class RuntimeBackground { case "openPopup": await this.main.openPopup(); break; + case "closeSafariPopup": + await this.main.closeSafariPopup(); + break; case "bgUpdateContextMenu": case "editedCipher": case "addedCipher": diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 293fca4d029..6d9db41411e 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -430,7 +430,10 @@ export class BrowserApi { } static closePopup(win: Window) { - if (BrowserApi.isWebExtensionsApi && BrowserApi.isFirefoxOnAndroid) { + if (BrowserApi.isSafariApi) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.sendMessage("closeSafariPopup"); + } else if (BrowserApi.isWebExtensionsApi && BrowserApi.isFirefoxOnAndroid) { // Reactivating the active tab dismisses the popup tab. The promise final // condition is only called if the popup wasn't already dismissed (future proofing). // ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1433604 diff --git a/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj b/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj index 7642e7d1859..ceb201a159d 100644 --- a/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj +++ b/apps/browser/src/safari/desktop.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 025FE0402D5FE56300B982BE /* SafariExtensionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025FE03F2D5FE55F00B982BE /* SafariExtensionViewController.swift */; }; 03100CAF291891F4008E14EF /* encrypt-worker.js in Resources */ = {isa = PBXBuildFile; fileRef = 03100CAE291891F4008E14EF /* encrypt-worker.js */; }; 55BC93932CB4268A008CA4C6 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 55BC93922CB4268A008CA4C6 /* assets */; }; 55E0374D2577FA6B00979016 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55E0374C2577FA6B00979016 /* AppDelegate.swift */; }; @@ -53,6 +54,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 025FE03F2D5FE55F00B982BE /* SafariExtensionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariExtensionViewController.swift; sourceTree = ""; }; 03100CAE291891F4008E14EF /* encrypt-worker.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = "encrypt-worker.js"; path = "../../../build/encrypt-worker.js"; sourceTree = ""; }; 5508DD7926051B5900A85C58 /* libswiftAppKit.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libswiftAppKit.tbd; path = usr/lib/swift/libswiftAppKit.tbd; sourceTree = SDKROOT; }; 55BC93922CB4268A008CA4C6 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = ../../../build/assets; sourceTree = ""; }; @@ -143,6 +145,7 @@ 55E037612577FA6F00979016 /* safari */ = { isa = PBXGroup; children = ( + 025FE03F2D5FE55F00B982BE /* SafariExtensionViewController.swift */, 55E0376F2577FA6F00979016 /* Resources */, 55E037622577FA6F00979016 /* SafariWebExtensionHandler.swift */, 55E037642577FA6F00979016 /* Info.plist */, @@ -297,6 +300,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 025FE0402D5FE56300B982BE /* SafariExtensionViewController.swift in Sources */, 55E037632577FA6F00979016 /* SafariWebExtensionHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/apps/browser/src/safari/safari/SafariExtensionViewController.swift b/apps/browser/src/safari/safari/SafariExtensionViewController.swift new file mode 100644 index 00000000000..177cd11e091 --- /dev/null +++ b/apps/browser/src/safari/safari/SafariExtensionViewController.swift @@ -0,0 +1,8 @@ +import SafariServices + +class SafariExtensionViewController: SFSafariExtensionViewController { + static let shared: SafariExtensionViewController = { + let shared = SafariExtensionViewController() + return shared + }() +} diff --git a/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift b/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift index 58d95f959be..3e98cea6788 100644 --- a/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift +++ b/apps/browser/src/safari/safari/SafariWebExtensionHandler.swift @@ -6,14 +6,14 @@ let SFExtensionMessageKey = "message" let ServiceName = "Bitwarden" let ServiceNameBiometric = ServiceName + "_biometric" -class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { +class SafariWebExtensionHandler: SFSafariExtensionHandler { override init() { super.init(); NSApplication.shared.setActivationPolicy(.accessory) } - func beginRequest(with context: NSExtensionContext) { + override func beginRequest(with context: NSExtensionContext) { let item = context.inputItems[0] as! NSExtensionItem let message = item.userInfo?[SFExtensionMessageKey] as AnyObject? os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg) @@ -43,6 +43,12 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { }) } break + case "closePopover": + os_log(.default, "Closing Safari Popup") +// NSApp.keyWindow?.contentViewController?.dismiss(nil) +// self.popoverViewController().dismiss(nil) + SafariExtensionViewController.shared.dismissPopover() + break case "downloadFile": guard let jsonData = message?["data"] as? String else { return