Setting NSTextField value on SafariExtensionHandler

51 views Asked by At

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"

0

There are 0 answers