From e5764ee16e73037c61926e40348b4561616780a6 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Thu, 4 Feb 2021 23:34:10 +0100 Subject: [PATCH] Fix copying TOTP not working in Safari (#1598) --- src/safari/safari/SafariWebExtensionHandler.swift | 7 +++++++ src/services/browserPlatformUtils.service.ts | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/safari/safari/SafariWebExtensionHandler.swift b/src/safari/safari/SafariWebExtensionHandler.swift index 001d388e6e..8c01d2f04e 100644 --- a/src/safari/safari/SafariWebExtensionHandler.swift +++ b/src/safari/safari/SafariWebExtensionHandler.swift @@ -21,6 +21,13 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { let pasteboard = NSPasteboard.general response.userInfo = [ SFExtensionMessageKey: pasteboard.pasteboardItems?.first?.string(forType: .string) as Any ] break + case "copyToClipboard": + guard let msg = message?["data"] as? String else { + return + } + let pasteboard = NSPasteboard.general + pasteboard.clearContents() + pasteboard.setString(msg, forType: .string) case "showPopover": SFSafariApplication.getActiveWindow { win in win?.getToolbarItem(completionHandler: { item in diff --git a/src/services/browserPlatformUtils.service.ts b/src/services/browserPlatformUtils.service.ts index 969ab45bab..dad8166a65 100644 --- a/src/services/browserPlatformUtils.service.ts +++ b/src/services/browserPlatformUtils.service.ts @@ -190,7 +190,14 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService } const clearing = options ? !!options.clearing : false; const clearMs: number = options && options.clearMs ? options.clearMs : null; - if (this.isFirefox() && (win as any).navigator.clipboard && (win as any).navigator.clipboard.writeText) { + + if (this.isSafari()) { + SafariApp.sendMessageToApp('copyToClipboard', text).then(() => { + if (!clearing && this.clipboardWriteCallback != null) { + this.clipboardWriteCallback(text, clearMs); + } + }); + } else if (this.isFirefox() && (win as any).navigator.clipboard && (win as any).navigator.clipboard.writeText) { (win as any).navigator.clipboard.writeText(text).then(() => { if (!clearing && this.clipboardWriteCallback != null) { this.clipboardWriteCallback(text, clearMs);