Chrome扩展程序更新流程

时间:2016-08-24 13:22:27

标签: javascript google-chrome google-chrome-extension chromium

我开始使用chrome扩展开发,并且在开发过程中有一些关于扩展安装/更新流程和测试的问题:

  1. 扩展程序更新后后台脚本会发生什么情况,chrome是否执行后台脚本重新加载?
  2. 扩展程序更新后内容脚本是否与后台脚本分离?
  3. 如果在后台脚本中有一个onInstalled事件处理程序,当chrome更新扩展时,该事件处理程序会发生什么(这个事件处理程序是分离的,当更新完成时,新的处理程序被附加然后执行或其他一些流动了)?
  4. 有没有办法在开发过程中模拟更新过程,以便调试更新过程中发生的事件,例如在某些本地服务器上托管扩展并从那里更新?
  5. 在哪里搜索关于这类和类似主题的文档,铬源代码是正确的地方还是至少是起点?
  6. 谢谢!

1 个答案:

答案 0 :(得分:4)

  
      
  1. 扩展程序更新后后台脚本会发生什么情况,Chrome是否会执行后台脚本重新加载?
  2.   

行为取决于您是否拥有注册chrome.runtime.onUpdateAvailable event的处理程序以及您的扩展程序是否具有持久性背景页面或事件页面。

  • 如果您有持久性背景页面:
    • 如果您处理此事件并致电chrome.runtime.reload(),则会在再次加载之前卸载扩展程序并进行更新。
    • 如果您处理此事件但未致电chrome.runtime.reload(),则更新仅适用于下次重新加载扩展程序时 - 可能是下次完整浏览器重新启动。
    • 如果您根本不处理此事件,则会立即卸载该扩展程序以进行更新。
  • 如果您有非持久性事件页面:
    • 如果您处理此事件并致电chrome.runtime.reload(),则会在再次加载之前更新扩展程序。
    • 如果您未致电chrome.runtime.reload(),或根本没有处理此事件,则Chrome会在下一个“活动”页面卸载时更新该扩展程序。

无论出于何种原因,一旦后台页面被卸载,就无法以编程方式阻止更新。

  
      
  1. 扩展程序更新后内容脚本是否与后台脚本分离?
  2.   

是的,它并不漂亮。他们进入了一个孤儿"当使用Chrome API时出现不一致的错误(有些不做,有些触发异常),但仍然在运行 - 例如,任何DOM事件监听器仍然会触发。

因此,如果您希望内容脚本能够立即再次运行,那么您的工作就是:

  • 以编程方式在现有选项卡中注入脚本,而不假设它之前没有执行:必要时首先清理。
  • 确保孤立的副本停止执行:通过在旧副本中注意到它是孤立的,或者通过从新副本广播DOM事件。

关于WebExtensions的重要说明:与Chrome不同,总是将内容脚本重新加载到与清单条目匹配的网页中。请务必考虑到这一点。

有一些问题涵盖了这一点;例如:

  
      
  1. 如果后台脚本中有onInstalled事件处理程序,当chrome更新扩展时该事件处理程序会发生什么(此事件处理程序已分离,更新完成时,新处理程序已附加,然后执行或其他一些流程被行使)?
  2.   

由于更新只能在卸载后台页面时发生,因此没有复杂的逻辑;它只会在details.reason == "update"之后在扩展的第一次加载时触发。确保在脚本加载时同步注册处理程序(例如在顶级代码中),否则您可能会错过事件 - 通常这只涉及事件页面,但我怀疑它在这里也很重要。

  
      
  1. 有没有办法在开发过程中模拟更新过程,以便调试更新过程中发生的事件,例如在某些本地服务器上托管扩展并从那里更新?
  2.   

可悲的是,除非您可以使用Enterprise Policy install,否则根据我的知识,这已不再可能。您最好的选择是将CWS中的扩展名发布为私有。

在某种程度上,按下"重新加载"对解压缩的扩展进行一些更改后,模拟更新期间发生的事情 - onInstalled事件除外。

  
      
  1. 在哪里搜索关于此类和类似主题的文档,铬源代码是正确的位置还是至少是起点?
  2.   

嗯..对于详细问题,Chromium代码当然是权威来源。您也应该搜索StackOverflow,因为这里已经积累了相当多的知识体系。最后,官方文档提供了大量信息,即使它不是立即显而易见的 - 例如chrome.runtime API docs