3

我有一个 Firefox 扩展,可以在如下函数中加载页面信息:

var title = content.document.title;
var url = content.document.location.href;

当用户选择我的扩展创建的上下文菜单项时,此函数运行。由于多进程 Firefox(电解,又名 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)这里的时间是如何计算的。由于这个消息传递系统是异步的,我不能保证我感兴趣的数据会及时返回以供我使用。Mozilla 提供的示例似乎都不适合我正在尝试做的事情。我错过了一些明显的东西吗?是否有更好的示例展示如何转换扩展代码以支持 e10s?

4

1 回答 1

0

(a) 这是处理这个问题的正确方法

您应该只注册一次框架脚本,而不是每个函数调用,如果您在特定浏览器上设置延迟标志,则无需设置 MM

您还必须在插件关闭时删除侦听器并将自毁消息发送到您的框架脚本,否则它们将徘徊并将消息发送到部分关闭代码中,这可能会导致错误行为

(b) 这里的时间安排如何。

保证消息按顺序传递和处理(模一些可能切入队列的内部高优先级消息),即帧脚本将在处理第二条消息之前添加和初始化。

由于这个消息传递系统是异步的,我不能保证我感兴趣的数据会及时返回以供我使用。

您将不得不调整您的逻辑以异步工作,等待响应,就像您别无选择,只能等待 XMLHttpRequest 在正常 Web 编程中调用其回调。

于 2015-01-26T18:49:50.177 回答