如何从支持 e10s 的 Firefox 中的框架脚本获取页面信息
How to get page info from frame script in e10s-enabled Firefox?
我有一个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) 这里的时机是如何运作的。由于此消息传递系统是异步的,因此我不能保证我感兴趣的数据会及时返回以供我使用它。Mozilla提供的示例似乎都不符合我想要做的事情。 我错过了一些明显的东西吗?是否有更好的示例显示如何转换扩展代码以支持 e10?
(a) 这是处理此问题的正确方法
您应该只注册一次帧脚本,而不是每次函数调用,并且如果您在特定浏览器 MM 上设置延迟标志,则无需设置延迟标志
您还必须在插件关闭时删除侦听器并将自毁消息发送到您的帧脚本,否则它们会徘徊并将消息发送到部分关闭代码中,这可能会导致错误行为
消息(b) 这里的时机是如何确定的。
保证按顺序传递和处理(模化一些内部高优先级消息,这些消息可能会切入队列),即在处理第二条消息之前将添加和初始化帧脚本。
你由于此消息传递系统是异步的,因此我不能保证我感兴趣的数据会及时返回以供我使用它。
将不得不调整你的逻辑以异步工作,等待响应,就像你别无选择,只能等待XMLHttpRequest在正常的Web编程中调用它的回调。
相关文章:
- 从远程脚本获取用户IP
- 使用javascript后台脚本获取Yotutube频道信息
- 如何使用Java脚本获取具有相同ID的多个图像的高度和宽度
- 从PHP脚本获取音频文件时,更改JavaScript音频对象的当前时间
- 使用java脚本获取印度标准时间
- 如何使用java脚本获取本地机器中的默认打印机名称
- 从Javascript动态脚本获取参数值
- 如何将数据从内容脚本1获取到内容脚本2的附加脚本
- 使用 Java 脚本获取 HTML 正文中所有文本框的名称和 ID
- Google Analytics应用脚本获取包含特定字词的所有媒体事件标签
- 如何从支持 e10s 的 Firefox 中的框架脚本获取页面信息
- 如何使用 java 脚本获取 httprequest 的响应代码
- 是否可以使用客户端脚本获取推特搜索 API 版本 1.1 的数据
- 使用 Java 脚本获取图像的缩放宽度和高度
- 如何使 (Java) 脚本获取 URL 并基于该 (#transclusion, #highlight) 执行 if 语
- 执行 PHP 脚本并使用 AJAX 从 JS 脚本获取值
- 如何通过操作脚本获取和设置外部 HTML 内容中的选定单选按钮
- 通过 Java 脚本获取服务器控件属性值
- CQ5 ECMA脚本获取对服务的引用
- 从服务器上的php脚本获取数据作为响应