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

时间:2011-11-22 11:28:01

标签: firefox firefox-addon message-passing

我有一个覆盖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

如何注册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" />

现在在overlay.js我正在使用 -

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

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

}, true);

background.js是 -

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

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

1 个答案:

答案 0 :(得分:0)

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

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

要与当前标签中的内容脚本进行通信,叠加层中的脚本可以执行以下操作:

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

内容脚本确实有addMessageListener作为全局函数,所以这应该有效:

addMessageListener("MyMessenger.MyMessage", function(obj) {
  console.log(obj.name);
});