如何在Firefox扩展中实现消息传递?

Ank*_*kit 5 firefox message-passing firefox-addon

我有一个覆盖overlay.xul覆盖的文件browser.xul.我想以与chrome扩展中实现的类似方式实现消息传递.

chrome.manifest-

content helloworld content/
overlay chrome://browser/content/browser.xul    chrome://helloworld/content/overlay.xul
overlay chrome://navigator/content/navigator.xul    chrome://helloworld/content/overlay.xul


skin    helloworld  classic/1.0 skin/
style   chrome://global/content/customizeToolbar.xul    chrome://helloworld/content/overlay.css
Run Code Online (Sandbox Code Playgroud)

如何content_script.js在我的情况下注册哪个overlay.js

Overlay.xul -

 <script type="application/x-javascript" src="chrome://helloworld/content/jquery.js" />
 <script type="application/x-javascript" src="chrome://helloworld/content/overlay.js" />
 <script type="application/x-javascript" src="chrome://helloworld/content/background.js" />
Run Code Online (Sandbox Code Playgroud)

现在overlay.js我正在使用 -

document.documentElement.addEventListener('click', function(e) {

     messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});

}, true);
Run Code Online (Sandbox Code Playgroud)

而且是background.js-

 addMessageListener("MyMessenger.MyMessage", function(obj) {

    Firebug.Console.log(obj.name);
}, true);
Run Code Online (Sandbox Code Playgroud)
  • 消息传递的正确语法是什么?
  • 如何配置内容脚本和浏览器脚本之间的连接?

Wla*_*ant 0

如果您真正感兴趣的是注入内容脚本并与其通信,那么使用附加 SDK应该更容易,尤其是page-mod。它允许轻松注入内容脚本并提供一种通信方式(请参阅我提到的文档中的“与内容脚本通信”部分)。

至于messageManager,它适用于多进程环境,但它也适用于当前的单进程 Firefox。上面代码的主要问题是:addMessageListener不是全局函数,您应该调用messageManager.addMessageListener(). 但是,使用messageManager在加载到同一名称空间并可以直接相互调用的脚本之间传递消息无论如何都是一种矫枉过正。

要与当前选项卡中的内容脚本进行通信,覆盖层中的脚本将执行以下操作:

gBrowser.selectedBrowser.messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});
Run Code Online (Sandbox Code Playgroud)

并且内容脚本确实具有addMessageListener全局函数,因此这应该可以工作:

addMessageListener("MyMessenger.MyMessage", function(obj) {
  console.log(obj.name);
});
Run Code Online (Sandbox Code Playgroud)