0

I can send message when received message in override func messageReceived with from page prop and dispatchMessageToScript method, but I don't understand how can I do it in injectOpenWelcomeTab method. Thanks

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
        // This method will be called when a content script provided by your extension calls safari.extension.dispatchMessage("message").
        page.getPropertiesWithCompletionHandler { properties in
            NSLog("The extension received a message (\(messageName)) from a script injected into (\(String(describing: properties?.url))) with userInfo (\(userInfo ?? [:]))")

            //Вот таким образом можем дёргать методы из контроллера
            SafariExtensionViewController.shared.popupChangeBackgorundColor()           
        }

        page.dispatchMessageToScript(withName: "openWelcomePage")
    }

    public func injectOpenWelcomeTab(){           
        //Here I want send message to injected script        
    }     
}
barbsan
  • 3,418
  • 11
  • 21
  • 28

1 Answers1

2

SFSafariApplication.getActiveWindow is your best friend here. Just make sure you import SafariServices

func injectOpenWelcomeTab() {
    getActivePage {
        $0?.dispatchMessageToScript(withName: "openWelcomePage", userInfo: ["foo": bar as Any])
    }
}

func getActivePage(completionHandler: @escaping (SFSafariPage?) -> Void) {
    SFSafariApplication.getActiveWindow {$0?.getActiveTab {$0?.getActivePage(completionHandler: completionHandler)}}
}
Adrian Bartholomew
  • 2,506
  • 6
  • 29
  • 37
  • Thanks for your answer, it helps a lot. By the way, do you have any idea on how to set settings in the injected script? I run safari.extension.settings.setItem() in injected script but it comes with an TypeError: undefined in safari console. – yuan Dec 23 '19 at 07:58