Javascript 何时加载浏览器框架脚本(e10s)?
我正在尝试移植一个Firefox扩展来支持电解(E10)。我的扩展获取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上。基于,有3种类型的消息管理器可用:Javascript 何时加载浏览器框架脚本(e10s)?,javascript,firefox,firefox-addon,e10s,Javascript,Firefox,Firefox Addon,E10s,我正在尝试移植一个Firefox扩展来支持电解(E10)。我的扩展获取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上。基于,有3种类型的消息管理器可用: 全球的 窗口 浏览者 因为我的附加组件是上下文特定的,所以最后一个似乎就是我想要使用的。问题是我不完全知道何时加载框架脚本。我的上下文菜单项的操作处理代码的简化版本如下所示: onContext: function() { let browserMM = gBrowser.selectedBrowser.messageMan
onContext: function() {
let browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.loadFrameScript("chrome://myaddon/content/frame-script.js", true);
browserMM.sendAsyncMessage("myaddon@myaddon.com:get-page-info", json);
}
在这里加载框架脚本对我来说似乎是最好的主意,因为(a)框架脚本不能保证在每个页面上都使用,(b)我认为框架脚本每个
加载一次。第二种理论似乎不正确;每次调用loadFrameScript
,都会加载一个新副本。即使是负载保护逻辑(即,如果帧脚本函数不存在,则仅创建帧脚本函数)似乎也无法解决问题
所以,我的问题是,每次访问上下文菜单项时,都会加载框架脚本的新副本。由于我的框架脚本添加了一个消息侦听器,所以在随后调用上下文菜单项时会得到重复的消息
我应该何时加载浏览器框架脚本?在加载项初始化时加载一次似乎效果不好,因为它只在第一次加载时加载(我希望在任何后续的
请求时执行此代码)。但按需加载似乎是重复的
我还缺少其他策略吗
偶数负载保护逻辑(即,仅在帧脚本函数不存在时创建帧脚本函数)
框架脚本有点棘手,每个选项卡的脚本共享一个全局对象,但有一个单独的作用域,类似于在它们自己的功能块中进行计算。因此,如果您多次将其添加到选项卡中,那么每个选项卡都将在单独的范围中进行计算
相反,您可能希望跟踪已将框架脚本附加到的浏览器对象。虽然我认为还有一些属性可以枚举加载的框架脚本
在加载项初始化时加载一次似乎效果不好
如果需要,请使用全局消息管理器并附加一个延迟帧脚本,该脚本将附加到所有当前和将来的选项卡。当然,这将消耗更多的内存,而不仅仅是将其附加到真正需要它的选项卡上
browserMM.loadFrameScript(“chrome://myaddon/content/frame-script.js“,对)
如果在特定浏览器上运行延迟标志,则不需要将其设置为true,这仅适用于广播消息管理器,该管理器将来可能会获得更多子项。如果我使用
WeakMap
跟踪已加载帧脚本的浏览器,如何唯一标识每个浏览器
?使用关联的URL(尽管这似乎有问题)?您可以将浏览器用作键