Whenever I try to set text from the SafariExtensionHandler.swift file, the extension in the menu bar just crashes. The webpage I try it on logs "Loaded" and "Send to script" but after that, the extension just crashes.
SafariExtensionViewController.swift:
import SafariServices
class SafariExtensionViewController: SFSafariExtensionViewController {
static let shared: SafariExtensionViewController = {
let shared = SafariExtensionViewController()
shared.preferredContentSize = NSSize(width:320, height:240)
return shared
}()
@IBOutlet weak var textBox: NSTextField!
@IBAction func buttonClicked(_ sender: Any) {
sendMessage(messageStr: "Send to script")
}
func setStringValue(strVal: String){
textBox.stringValue = strVal
}
func sendMessage(messageStr: String) {
getActivePage {
$0?.dispatchMessageToScript(withName: messageStr)
}
}
func getActivePage(completionHandler: @escaping (SFSafariPage?) -> Void) {
SFSafariApplication.getActiveWindow {$0?.getActiveTab {$0?.getActivePage(completionHandler: completionHandler)}}
}
}
SafariExtensionHandler.swift:
import SafariServices
import os.log
class SafariExtensionHandler: SFSafariExtensionHandler {
override func beginRequest(with context: NSExtensionContext) {
let request = context.inputItems.first as? NSExtensionItem
let profile: UUID?
if #available(iOS 17.0, macOS 14.0, *) {
profile = request?.userInfo?[SFExtensionProfileKey] as? UUID
} else {
profile = request?.userInfo?["profile"] as? UUID
}
os_log(.default, "The extension received a request for profile: %@", profile?.uuidString ?? "none")
}
override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
page.getPropertiesWithCompletionHandler { properties in
os_log(.default, "The extension received a message (%@) from a script injected into (%@) with userInfo (%@)", messageName, String(describing: properties?.url), userInfo ?? [:])
}
SafariExtensionViewController().setStringValue(strVal: messageName)
}
override func toolbarItemClicked(in window: SFSafariWindow) {
os_log(.default, "The extension's toolbar item was clicked")
}
override func validateToolbarItem(in window: SFSafariWindow, validationHandler: @escaping ((Bool, String) -> Void)) {
validationHandler(true, "")
}
override func popoverViewController() -> SFSafariExtensionViewController {
return SafariExtensionViewController.shared
}
}
script.js
document.addEventListener("DOMContentLoaded", function(event) {
console.log("Loaded");
});
safari.self.addEventListener("message", handleMessage);
function handleMessage(event) {
safari.extension.dispatchMessage("Javascript: " + event.name);
console.log(event.name);
}
I have tried different ways to reference the NSTextField, I have tried NSTextFieldCell, I have tried to reference it in the Handler.swift file, and I tried to set the responce message as a variable and then set the NSTextField as a variable later." I am expecting that after the button is clicked for the NSTextField to have the following text in the box: "Javacript: Send to script"