作者:mobiledu2502870743 | 来源:互联网 | 2023-05-17 13:07
我正在尝试移植我的Firefox扩展之一以支持Electrolysis(e10s).我的扩展程序获取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上.基于messag
我正在尝试移植我的Firefox扩展之一以支持Electrolysis(e10s).我的扩展程序获取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上.基于message manager documentation,有3种类型的消息管理器可用:
>全球
>窗户
>浏览器
由于我的加载项是特定于上下文的,因此最后一个似乎是我要使用的加载项.问题是我不完全知道何时加载框架脚本.我的上下文菜单项的动作处理代码的简化版本如下所示:
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时,都会加载一个新副本.甚至负载保护逻辑(即仅在不存在框架脚本函数的情况下也创建框架脚本函数)似乎也无法解决问题.
因此,我的问题是每次访问上下文菜单项时,都会加载框架脚本的新副本.并且由于我的框架脚本添加了消息侦听器,因此我在上下文菜单项的后续调用中得到了重复的消息.
什么时候应该加载浏览器框架脚本?一次在附加组件初始化中加载它似乎效果不佳,因为它只能加载到第一个浏览器中. (我希望此代码在随后的要求时执行).但是,按需加载它似乎是重复的事情.
我在这里还缺少其他策略吗?
解决方法:
Even load-protection logic (i.e. only creating the frame script functions if they don’t already exist)
框架脚本有些棘手,每个选项卡的脚本共享一个全局对象,但是具有单独的范围,类似于在其自己的功能块中进行评估.因此,如果您多次将其添加到选项卡,则每次都会在单独的范围内进行评估.
取而代之的是,您可能想跟踪已经将框架脚本附加到WeakMap的浏览器对象.尽管我认为也有一些属性可以枚举已加载的框架脚本.
Loading it once on add-on initialization doesn’t seem to work well
如果需要,请使用全局消息管理器并附加延迟的框架脚本,该脚本将附加到所有当前和将来的选项卡.当然,这将消耗更多的内存,而不仅仅是将其附加到真正需要它的选项卡上.
browserMM.loadFrameScript(“chrome://myaddon/content/frame-script.js”, true);
如果在特定的浏览器上运行,则不需要真正将delay标志设置为true,这仅对广播消息管理器有意义,该消息管理器将来可能会增加其他子项.