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

时间:2015-01-24 20:48:25

标签: javascript firefox firefox-addon e10s

我试图移植我的一个Firefox扩展以支持Electrolysis(e10s)。我的扩展程序抓取一些页面数据,并通过用户可以单击的上下文菜单项将其放在剪贴板上。基于message manager documentation,有3种类型的消息管理器可用:

  1. 全局
  2. 窗口
  3. 浏览器
  4. 由于我的附加组件是特定于上下文的,因此最后一个看起来就像我想要使用的那个。问题是我不完全知道何时加载框架脚本。我的上下文菜单项的动作处理代码的简化版本如下所示:

    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)我认为框架脚本每次只加载一次<browser>。似乎第二种理论并不正确;每次调用loadFrameScript时,都会加载一个新副本。即使是负载保护逻辑(即只有在它们不存在的情况下才创建框架脚本功能)似乎无法解决问题。

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

    我应该何时加载浏览器框架脚本?在附加组件初始化时加载一次似乎不能正常工作,因为它只加载在第一个<browser>上(我希望此代码在任何后续<browser>要求时执行)。但是根据需要加载它似乎是重复的事情。

    我在这里缺少其他策略吗?

1 个答案:

答案 0 :(得分:4)

  

甚至是负载保护逻辑(即只创建帧脚本函数,如果它们尚不存在)

帧脚本有点棘手,每个选项卡的脚本共享一个全局对象,但有一个单独的范围,类似于在自己的功能块中进行评估。因此,如果您将多次添加到选项卡,则每个选项都会在单独的范围内进行评估。

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

  

在加载项初始化时加载一次似乎不能正常工作

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

  

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

如果你在特定的浏览器上运行它,你真的不需要将延迟标志设置为true,这只对广播消息管理器有意义,这可能会在将来有更多的孩子。