From a465ad6a8fbb64184dcdcfa451dbb2aa9346ac2d Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Tue, 2 Feb 2021 23:07:24 -0800 Subject: [PATCH] safari: checkpoint as I try to get the terrible wiring right --- extension/background.js | 14 ++++ .../TabFS Extension/FSProcessManager.swift | 72 ++++++++++++++++++ .../SafariWebExtensionHandler.swift | 37 ++++++--- .../TabFS/TabFS.xcodeproj/project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 19916 -> 34829 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 48 ++++++++++++ .../TabFS/TabFS/Base.lproj/Main.storyboard | 27 +++++-- .../safari/TabFS/TabFS/ViewController.swift | 3 + 8 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 extension/safari/TabFS/TabFS Extension/FSProcessManager.swift diff --git a/extension/background.js b/extension/background.js index 5e487cf..e6fba2b 100644 --- a/extension/background.js +++ b/extension/background.js @@ -673,6 +673,10 @@ function findRoute(path) { let port; async function onMessage(req) { + // Safari / Safari extension app API forces you to adopt their + // {name, userInfo} structure for the request. + if (req.name === 'ToSafari') req = req.userInfo; + if (req.buf) req.buf = atob(req.buf); console.log('req', req); @@ -712,6 +716,16 @@ function tryConnect() { port = chrome.runtime.connectNative('com.rsnous.tabfs'); port.onMessage.addListener(onMessage); port.onDisconnect.addListener(p => {console.log('disconnect', p)}); + + // Safari is very weird -- it has this native app that we have to talk to, + // so we poke that app to wake it up, get it to start the TabFS process, + // and get it to start calling us whenever TabFS wants to do an FS call. + // Is there a better way to do this? + if (chrome.runtime.getURL('/').startsWith('safari-web-extension://')) { // Safari-only + chrome.runtime.sendNativeMessage('com.rsnous.tabfs', {op: 'safari_did_connect'}, function(resp) { + console.log(resp); + }); + } } if (!TESTING) { diff --git a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift new file mode 100644 index 0000000..d17d934 --- /dev/null +++ b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift @@ -0,0 +1,72 @@ +// +// FSProcessManager.swift +// TabFS +// +// Created by Omar Rizwan on 1/31/21. +// + +import Foundation + +import SafariServices.SFSafariApplication + +let extensionBundleIdentifier = "com.rsnous.TabFS-Extension" + +class FSProcessManager { + static let shared = FSProcessManager() + + // FIXME: should accept XPC connection to extension + // so it can get replies (??) + + var fs: Process! + var fsInput: FileHandle! + var fsOutput: FileHandle! + + func start() { + fs = Process() + fs.executableURL = URL(fileURLWithPath: "/Users/osnr/Code/tabfs/fs/tabfs") + fs.arguments = [] + + let inputPipe = Pipe(), outputPipe = Pipe() + fs.standardInput = inputPipe + fs.standardOutput = outputPipe + + try! fs.run() + + fsInput = inputPipe.fileHandleForWriting + fsOutput = outputPipe.fileHandleForReading +// +// SFSafariApplication.dispatchMessage( +// withName: "ToSafari", +// toExtensionWithIdentifier: extensionBundleIdentifier, +// userInfo: [:] +// ) { error in +// debugPrint("Message attempted. Error info: \(String.init(describing: error))") +// } + + DispatchQueue.global(qos: .background).async { + while true { + let req = self.awaitRequest() + + SFSafariApplication.dispatchMessage( + withName: "ToSafari", + toExtensionWithIdentifier: extensionBundleIdentifier, + userInfo: req + ) { error in + debugPrint("Message attempted. Error info: \(String.init(describing: error))") + } + } + } + } + + func awaitRequest() -> [String: Any] { + let length = fsOutput.readData(ofLength: 4).withUnsafeBytes { + $0.load(as: UInt32.self) + } + let data = fsOutput.readData(ofLength: Int(length)) + return try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] + } + + func respond(_ resp: [AnyHashable: Any]) { + try! fsInput.write(JSONSerialization.data(withJSONObject: resp, options: [])) + } +} diff --git a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift index f026b0b..6ae1aae 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -6,21 +6,38 @@ // import SafariServices +import SafariServices.SFSafariApplication import os.log -let SFExtensionMessageKey = "message" - class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { - + func beginRequest(with context: NSExtensionContext) { + + os_log(.default, "Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) + let item = context.inputItems[0] as! NSExtensionItem - let message = item.userInfo?[SFExtensionMessageKey] - os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg) - - let response = NSExtensionItem() - response.userInfo = [ SFExtensionMessageKey: [ "Response to": message ] ] - - context.completeRequest(returningItems: [response], completionHandler: nil) + guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } + + if message["op"] as! String == "safari_did_connect" { + FSProcessManager.shared.start() + + let response = NSExtensionItem() + response.userInfo = [ "message": [ "aResponse to": "moop" ] ] + context.completeRequest(returningItems: [response], completionHandler: nil) + + return + } +// +// os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", op as! CVarArg) + + FSProcessManager.shared.respond(message) +// +// let response = NSExtensionItem() +// response.userInfo = [ "message": [ "Response to": op ] ] +// +// // How do I get too the app???? +// +// context.completeRequest(returningItems: [response], completionHandler: nil) } } diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj index 5885330..4b063e1 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ F0442A1E25C7507500D998A5 /* safari in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1A25C7507500D998A5 /* safari */; }; F0442A1F25C7507500D998A5 /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1B25C7507500D998A5 /* manifest.json */; }; F0442A2025C7507500D998A5 /* vendor in Resources */ = {isa = PBXBuildFile; fileRef = F0442A1C25C7507500D998A5 /* vendor */; }; + F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -61,6 +62,7 @@ F0442A1A25C7507500D998A5 /* safari */ = {isa = PBXFileReference; lastKnownFileType = folder; name = safari; path = ../..; sourceTree = ""; }; F0442A1B25C7507500D998A5 /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = manifest.json; path = ../../../manifest.json; sourceTree = ""; }; F0442A1C25C7507500D998A5 /* vendor */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vendor; path = ../../../vendor; sourceTree = ""; }; + F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSProcessManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -125,6 +127,7 @@ F0442A0A25C7507400D998A5 /* TabFS Extension */ = { isa = PBXGroup; children = ( + F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */, F0442A1825C7507500D998A5 /* Resources */, F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */, F0442A0D25C7507400D998A5 /* Info.plist */, @@ -257,6 +260,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F068D65625C7C66700DB3AB5 /* FSProcessManager.swift in Sources */, F0442A0C25C7507400D998A5 /* SafariWebExtensionHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate b/extension/safari/TabFS/TabFS.xcodeproj/project.xcworkspace/xcuserdata/osnr.xcuserdatad/UserInterfaceState.xcuserstate index 4a4220ca6771660e86218a23ae101d1ffc372500..231f2f7ad08e4dfef24bbf973884054072661897 100644 GIT binary patch delta 19585 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 HMrZ#Y5gQE# delta 8011 zcmaJ_2V7HE+dtzbKoYXILP8cdLx!k;13`j{0|$azWCTPJEZ{(toU2w_J8fLmY6YyT zia4s()>*Y`ebuU+?zYxhwXNEr)$b$`>)Ws22fyUz-h0OL{GaiEp7Yw9=-5*D=4b@F z&nrmqjs&AX9vBVEz<5v&D!>F#4W@!xz=0WHHkbom1#f@_U?ErpmVxD<9=r!uf%RYm z_yBAJ+rfw6Yw!*D7Mum=z1Tm+ZEW$+#N9{d2VfFHqCa1GoBcfdXH7(9UhLWm%S z;ZO`EPzqI0=Y@J030Y`|v9LYt025&+*cGNiH_U)NU|*O82f|!93>L!@I0lx&Dp(CC z!bxx{oD1KC3*i#D95%p4xEgMN&2SUk47b4T@FTbf9)`!^8Td6k2QR_P@CtkgAHl!i zWB3FC1Q9|QF(?#yB}j$TC=wZv5t)$%S&9o^bT5vmZNvk3RI68P$OE2)}gKFL$m|!Lc7r!^ac77 zeTBY8-=J^NS#%DaN0-qxFS?EHpx@B%=plN98O+12aBCcaBe4M+aTGRTGqzwB$Kp5~ zj}vhcPQ_`s8&1c)aUWcO3vm(l;9^{Y$KX;t7LUUfcoLqBr{Fs5#dGjW_+>m7zlDAH zZM+08#ar-J`~lvEx8o1-4!jeO{0M)Hcj4W558jLS;r;j%d;lNEC-6!9IsOKJkAJ{d z@Q?T^zJ{;kU-3PBA3tCK0~y3%CY%v75=PFL7&BvGtc;CuFm0F^CYDKHl9?_{s&6Z= z3qw94Cf@_zG+`pyLHI;N5{cbc$A6;H*4DO7jB^>=$4z$`YvbF+(cj5&alQp1ZVd~1 z(2-i=B5g=KX-nGCyCgdAZb-9f2yirl9FPkJ6CKf$R*hgNy&X+�Vo7Tz(XQPBry=BpEfKpIGqKKJT=(pY16jmaC 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 diff --git a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 3fadf29..3f0b7de 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/extension/safari/TabFS/TabFS.xcodeproj/xcuserdata/osnr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -8,9 +8,57 @@ BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + + + + + + + + + + + + - + - + + @@ -66,7 +67,7 @@ - + @@ -97,18 +98,28 @@ - + - + - + - + + @@ -138,11 +149,13 @@ DQ + + diff --git a/extension/safari/TabFS/TabFS/ViewController.swift b/extension/safari/TabFS/TabFS/ViewController.swift index 98cc7a5..958de47 100644 --- a/extension/safari/TabFS/TabFS/ViewController.swift +++ b/extension/safari/TabFS/TabFS/ViewController.swift @@ -48,4 +48,7 @@ class ViewController: NSViewController { } } + @IBAction func startTabFSAndConnect(_ sender: Any) { +// FSProcessManager.start() + } }