Javascript 何时加载浏览器框架脚本(e10s)?

Javascript 何时加载浏览器框架脚本(e10s)?,javascript,firefox,firefox-addon,e10s,Javascript,Firefox,Firefox Addon,E10s,我正在尝试移植一个Firefox扩展来支持电解(E10)。我的扩展获取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上。基于,有3种类型的消息管理器可用: 全球的 窗口 浏览者 因为我的附加组件是上下文特定的,所以最后一个似乎就是我想要使用的。问题是我不完全知道何时加载框架脚本。我的上下文菜单项的操作处理代码的简化版本如下所示: onContext: function() { let browserMM = gBrowser.selectedBrowser.messageMan

我正在尝试移植一个Firefox扩展来支持电解(E10)。我的扩展获取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上。基于,有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
    ,都会加载一个新副本。即使是负载保护逻辑(即,如果帧脚本函数不存在,则仅创建帧脚本函数)似乎也无法解决问题

    所以,我的问题是,每次访问上下文菜单项时,都会加载框架脚本的新副本。由于我的框架脚本添加了一个消息侦听器,所以在随后调用上下文菜单项时会得到重复的消息

    我应该何时加载浏览器框架脚本?在加载项初始化时加载一次似乎效果不好,因为它只在第一次加载时加载(我希望在任何后续的
    请求时执行此代码)。但按需加载似乎是重复的

    我还缺少其他策略吗

    偶数负载保护逻辑(即,仅在帧脚本函数不存在时创建帧脚本函数)

    框架脚本有点棘手,每个选项卡的脚本共享一个全局对象,但有一个单独的作用域,类似于在它们自己的功能块中进行计算。因此,如果您多次将其添加到选项卡中,那么每个选项卡都将在单独的范围中进行计算

    相反,您可能希望跟踪已将框架脚本附加到的浏览器对象。虽然我认为还有一些属性可以枚举加载的框架脚本

    在加载项初始化时加载一次似乎效果不好

    如果需要,请使用全局消息管理器并附加一个延迟帧脚本,该脚本将附加到所有当前和将来的选项卡。当然,这将消耗更多的内存,而不仅仅是将其附加到真正需要它的选项卡上

    browserMM.loadFrameScript(“chrome://myaddon/content/frame-script.js“,对)


    如果在特定浏览器上运行延迟标志,则不需要将其设置为true,这仅适用于广播消息管理器,该管理器将来可能会获得更多子项。

    如果我使用
    WeakMap
    跟踪已加载帧脚本的浏览器,如何唯一标识每个
    浏览器
    ?使用关联的URL(尽管这似乎有问题)?您可以将浏览器用作键