From 6f743114da084e41fa095fb0a4abb88233aa49c0 Mon Sep 17 00:00:00 2001 From: Omar Rizwan Date: Sun, 7 Feb 2021 21:44:46 -0800 Subject: [PATCH] safari: XPC service runs! --- .../TabFS Extension/FSProcessManager.swift | 76 ------------------ .../SafariWebExtensionHandler.swift | 51 +++++++++++- .../TabFS/TabFS.xcodeproj/project.pbxproj | 16 +++- .../UserInterfaceState.xcuserstate | Bin 57443 -> 58988 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 12 +-- .../TabFS/TabFSService/TabFSService.swift | 7 ++ 6 files changed, 72 insertions(+), 90 deletions(-) delete mode 100644 extension/safari/TabFS/TabFS Extension/FSProcessManager.swift diff --git a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift b/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift deleted file mode 100644 index ecfea87..0000000 --- a/extension/safari/TabFS/TabFS Extension/FSProcessManager.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// FSProcessManager.swift -// TabFS -// -// Created by Omar Rizwan on 1/31/21. -// - -import Foundation - -import SafariServices.SFSafariApplication -import os.log - -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") - - os_log(.default, "url: %{public}@", fs.executableURL as! NSURL) - - 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 e582e96..67da485 100644 --- a/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift +++ b/extension/safari/TabFS/TabFS Extension/SafariWebExtensionHandler.swift @@ -9,17 +9,60 @@ import SafariServices import SafariServices.SFSafariApplication import os.log +class TabFSServiceManager: TabFSServiceConsumerProtocol { + static let shared = TabFSServiceManager() + + var service: TabFSServiceProtocol! + + func connect() { + let connection = NSXPCConnection(serviceName: "com.rsnous.TabFSService") + + connection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceProtocol.self) + + connection.exportedInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) + connection.exportedObject = self + + connection.resume() + + service = connection.remoteObjectProxyWithErrorHandler { error in + os_log(.default, "Received error: %{public}@", error as! CVarArg) + } as? TabFSServiceProtocol + + service?.upperCaseString("hello XPC") { response in + os_log(.default, "Response from XPC service: %{public}@", response) + } + } + + func request(_ req: Data) { + SFSafariApplication.dispatchMessage( + withName: "ToSafari", + toExtensionWithIdentifier: "com.rsnous.TabFS-Extension", + userInfo: try! JSONSerialization.jsonObject(with: req, options: []) as! [String : Any] + ) { error in + debugPrint("Message attempted. Error info: \(String.init(describing: error))") + } + } + + func response(_ resp: [AnyHashable: Any]) { + try! service.response(JSONSerialization.data(withJSONObject: resp, options: [])) + } +} + class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { func beginRequest(with context: NSExtensionContext) { - os_log(.default, "Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) + os_log(.default, "TabFSmsg Received message from browser.runtime.sendNativefffMessage: %@", context as! CVarArg) let item = context.inputItems[0] as! NSExtensionItem + + os_log(.default, "TabFSmsg item.userInfo %{public}@", item.userInfo as! CVarArg) guard let message = item.userInfo?["message"] as? [AnyHashable: Any] else { return } if message["op"] as! String == "safari_did_connect" { - FSProcessManager.shared.start() + + os_log(.default, "TabFSmsg sdc") + TabFSServiceManager.shared.connect() // // let response = NSExtensionItem() // response.userInfo = [ "message": [ "aResponse to": "moop" ] ] @@ -27,11 +70,11 @@ class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling { return } + + TabFSServiceManager.shared.response(message) // // 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 ] ] // diff --git a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj index d8f6003..d274516 100644 --- a/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj +++ b/extension/safari/TabFS/TabFS.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ F028D2BC25D0B7370095C2D5 /* TabFSService.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; F028D2D725D0B8500095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028D2B325D0B7370095C2D5 /* TabFSServiceProtocols.swift */; }; + F028D2ED25D106F10095C2D5 /* TabFSService.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = F028D2B125D0B7370095C2D5 /* TabFSService.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; F04429F625C7507200D998A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429F525C7507200D998A5 /* AppDelegate.swift */; }; F04429F925C7507200D998A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F04429F725C7507200D998A5 /* Main.storyboard */; }; F04429FB25C7507200D998A5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04429FA25C7507200D998A5 /* ViewController.swift */; }; @@ -23,7 +24,6 @@ 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 */ @@ -55,6 +55,16 @@ name = "Embed XPC Services"; runOnlyForDeploymentPostprocessing = 0; }; + F028D2E525D106BB0095C2D5 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices"; + dstSubfolderSpec = 16; + files = ( + F028D2ED25D106F10095C2D5 /* TabFSService.xpc in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F0442A1425C7507400D998A5 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -90,7 +100,6 @@ 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 */ @@ -175,7 +184,6 @@ F0442A0A25C7507400D998A5 /* TabFS Extension */ = { isa = PBXGroup; children = ( - F068D65225C77F7600DB3AB5 /* FSProcessManager.swift */, F0442A1825C7507500D998A5 /* Resources */, F0442A0B25C7507400D998A5 /* SafariWebExtensionHandler.swift */, F0442A0D25C7507400D998A5 /* Info.plist */, @@ -244,6 +252,7 @@ F04429FF25C7507400D998A5 /* Sources */, F0442A0025C7507400D998A5 /* Frameworks */, F0442A0125C7507400D998A5 /* Resources */, + F028D2E525D106BB0095C2D5 /* CopyFiles */, ); buildRules = ( ); @@ -349,7 +358,6 @@ buildActionMask = 2147483647; files = ( F028D2DE25D0B8590095C2D5 /* TabFSServiceProtocols.swift in Sources */, - 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 0ed33c6b977d690b04f4aef7517264e48a610b72..3d7d9f75fc7079d29b52ed55026a23ecf87dd440 100644 GIT binary patch delta 28158 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 I|9PzPKPVuw!2kdN delta 26864 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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 4af142b..87a2930 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 @@ -14,8 +14,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "18" - endingLineNumber = "18" + startingLineNumber = "57" + endingLineNumber = "57" landmarkName = "beginRequest(with:)" landmarkType = "7"> @@ -46,8 +46,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "19" - endingLineNumber = "19" + startingLineNumber = "60" + endingLineNumber = "60" landmarkName = "beginRequest(with:)" landmarkType = "7"> @@ -62,8 +62,8 @@ filePath = "TabFS Extension/SafariWebExtensionHandler.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "16" - endingLineNumber = "16" + startingLineNumber = "55" + endingLineNumber = "55" landmarkName = "beginRequest(with:)" landmarkType = "7"> diff --git a/extension/safari/TabFS/TabFSService/TabFSService.swift b/extension/safari/TabFS/TabFSService/TabFSService.swift index f91a4b4..798df03 100644 --- a/extension/safari/TabFS/TabFSService/TabFSService.swift +++ b/extension/safari/TabFS/TabFSService/TabFSService.swift @@ -6,6 +6,7 @@ // import Foundation +import os.log class TabFSService: NSObject, TabFSServiceProtocol { var fs: Process! @@ -28,7 +29,9 @@ class TabFSService: NSObject, TabFSServiceProtocol { fsInput = inputPipe.fileHandleForWriting fsOutput = outputPipe.fileHandleForReading + os_log(.default, "TabFSmsg tfs service: willrun") try! fs.run() + os_log(.default, "TabFSmsg tfs service: ran") // split new thread DispatchQueue.global(qos: .default).async { @@ -57,6 +60,10 @@ class TabFSService: NSObject, TabFSServiceProtocol { class TabFSServiceDelegate: NSObject, NSXPCListenerDelegate { func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { + + + os_log(.default, "TabFSmsg tfs service: starting delegate") + newConnection.remoteObjectInterface = NSXPCInterface(with: TabFSServiceConsumerProtocol.self) let exportedObject = TabFSService(app: newConnection.remoteObjectProxy as! TabFSServiceConsumerProtocol)