Search code examples
safari-extensionbrowser-extension

Dispatch messages from a safari extension popover to the global page


I have a safari extension popover that needs to communicate with its global page. From a content-script I am using

safari.self.tab.dispatchMessage(name,data); 

to accomplish that. From a popover I didn't find a way to do that. I know that I can access methods in the global page directly

safari.extension.globalPage.contentWindow

but my goal was to reuse code fragments that are already used in content-scripts. I do the same for the chrome version of the plugin.

Is there code for a little clever proxy that emulates

safari.self.tab.dispatchMessage(name,data); 

from the popover?


Solution

  • To be honest it's probably just easier to have different code in your popover and injected scripts. If you really want, you could do something like this:

    function dispatchMessage(name, message) {
        if (safari.self.tab) {
            safari.self.tab.dispatchMessage(name, message);
        } else if (safari.extension.globalPage.contentWindow) {
            safari.extension.globalPage.contentWindow.handleMessage({name: name, message: message});
        }
    }
    

    Then just use dispatchMessage('foo', 'bar') in both your popover and injected scripts. It's a bit hacky though, because the message event object normally has more information on it than just the name and message, and you have to ensure that your handleMessage function is actually the same function that is assigned as the message event listener in the global page.