我有一个Firefox扩展,可以在如下函数中加载页面信息:
var title = content.document.title;
var url = content.document.location.href;
当用户选择我的扩展程序创建的上下文菜单项时,此函数将运行。由于多进程Firefox(Electrolysis,即e10s)不支持直接访问内容,因此不再有效。我试图将这段代码纳入一个帧脚本,但是我在弄清楚如何“调用”这段代码时遇到了问题,因为看起来一切看起来都是异步的。这就是我认为应该是我的简单框架脚本:
// Frame script
function getPageInfo()
{
sendSyncMessage("my-add-on@me.com:page-info-loaded", {
pageURL : content.document.location.href,
pageTitle : content.document.title
});
}
addMessageListener("my-add-on@me.com:get-page-info", getPageInfo);
我认为相关的chrome代码应如下所示:
// Chrome script
function onContextItem()
{
let browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.loadFrameScript("chrome://my-add-on/content/frame-script.js", true);
browserMM.sendAsyncMessage("my-add-on@me.com:get-page-info");
}
function onInfoLoaded(message)
{
var url = message.data.pageURL;
var title = message.data.pageTitle;
// Do something with url and title
}
gBrowser.selectedBrowser.messageManager
.addMessageListener("my-add-on@me.com:page-info-loaded", onInfoLoaded);
我遇到的问题是我不完全理解(a)这是处理这个问题的正确方法还是(b)这里的时间安排如何。由于这个消息传递系统是异步的,我不能保证我感兴趣的数据会及时回来让我使用它。 examples provided by Mozilla似乎都不符合我的要求。我错过了一些明显的东西吗是否有更好的示例显示如何转换扩展代码以支持e10?
答案 0 :(得分:0)
(a)这是处理此
的正确方法
您应该只注册一次帧脚本,而不是每次调用函数,如果在特定的浏览器MM上设置延迟标志,则不需要设置延迟标志
您还必须在addon关闭时删除侦听器并向帧脚本发送自毁消息,否则它们将会延迟并将消息发送到部分关闭的代码中,这可能会导致错误行为
保证(b)这里的时间安排如何。
消息按顺序传递和处理(模拟可能切入队列的一些内部高优先级消息),即在处理第二条消息之前添加并初始化帧脚本。
由于这个消息传递系统是异步的,我不能保证我感兴趣的数据能够及时返回给我使用它。
您必须调整逻辑以异步工作,等待响应,就像您别无选择,只能等待XMLHttpRequest在正常的Web编程中调用其回调。