gpt4 book ai didi

javascript - 如何在启用 e10s 的 Firefox 中从框架脚本获取页面信息?

转载 作者:行者123 更新时间:2023-12-02 20:22:53 25 4
gpt4 key购买 nike

我有一个 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 都没有似乎适合我想做的事情。我错过了一些明显的东西吗?是否有更好的示例展示如何转换扩展代码以支持 e10s?

最佳答案

(a) this is the correct way to handle this

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

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

(b) how the timing here works out.

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

Since this messaging system is asynchronous, I'm not guaranteed that the data I'm interested in comes back in time for me to use it.

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

关于javascript - 如何在启用 e10s 的 Firefox 中从框架脚本获取页面信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28037177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com