我有一个覆盖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);
答案 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);
});