我们公司的FF扩展程序附带了我们应用程序的安装包(即它与应用程序捆绑在一起,而不是Firefox版本)。在安装过程中,扩展程序目前通过Windows注册表(HKCU/Software/Mozilla/Firefox/Extensions
中的新密钥)添加到Firefox中。
我的任务是为此扩展启用自动更新。为此,我将updateUrl
放入 package.json ,创建了 update.rdf 以及更新版本的扩展程序。因此,Firefox会找到更新的扩展程序,但无法更新它。 Firefox日志:
1464888839764 addons.update-checker DEBUG Requesting https://path/update.rdf
1464888840017 addons.update-checker DEBUG Found an update entry for <My Addon Name> version 1.2.3
1464888840022 addons.xpi DEBUG Found an existing AddonInstall for <My Addon Name>
1464888840024 addons.manager DEBUG Found update for add-on <My Addon Name>
1464888840026 addons.manager DEBUG onUpdateFinished for <My Addon Name>
相反,如果手动安装MyAddonName.xpi(即不使用Windows注册表),自动更新工作正常。
问题是:
如果Firefox故意跳过注册表安装的扩展的自动更新,我们如何安装捆绑的扩展,并启用普通的Firefox附加组件自动更新?
到目前为止,我发现了这个:在 firefox-44.0 \ toolkit \ mozapps \ extensions \ internal \ XPIProvider.jsm
if (!this._installLocation.locked && !this.pendingUninstall) {
// Add-ons that are installed by a file link cannot be upgraded
if (!this._installLocation.isLinkedAddon(this.id)) {
permissions |= AddonManager.PERM_CAN_UPGRADE;
}
permissions |= AddonManager.PERM_CAN_UNINSTALL;
}
这是禁止对从本地文件夹安装的加载项进行更新的故意行为。
我们正在一些限制条件下工作:
答案 0 :(得分:1)
Firefox专门设计时假设任何扩展名(例如您的扩展名,由Firefox分发版外部的安装程序应用于多个配置文件)都将由Firefox外部的进程更新。这导致没有清洁和容易的解决方案。
鉴于您正在进行的限制,我实现您所希望的方式是通过将其放置在目录中来安装加载程序扩展:
%APPDATA%\ Mozilla的\扩展\ {ec8030f7-C20A-464f-9b0e-13a3a9e97384}
或者,您可以像现在一样使用Windows注册表。但是,使用Windows注册表似乎是considered obsolete。使用任一方法都会导致扩展程序安装在用户和所有新创建的配置文件的所有当前存在的配置文件中。
在某些情况下,加载项将安装并处于活动状态,而不会询问用户(无重新启动的加载项,新创建的配置文件,在目录中),在其他情况下,将要求用户安装加载项的权限( XUL覆盖加载项,在目录中,新创建的和现有的配置文件)。在其他情况下,加载项将作为已禁用的加载项列表输入(Windows注册表,无重新启动的加载项)。我没有足够的测试来确定行为是什么的完整图表。我不知道你希望这种行为是什么。您需要检查以验证所使用的方法是否导致加载程序扩展根据需要应用于Firefox配置文件。
加载程序扩展的功能是:
您的加载程序加载项安装的扩展名是您当前与应用程序捆绑在一起的扩展程序。
加载程序扩展可以通过直接文件操作(不推荐)或使用Add-on Manager来安装扩展。加载项管理器具有从file或URL安装扩展程序的方法。
对问题的旧理解(与Firefox构建捆绑在一起的扩展,或者至少能够写入Firefox安装目录):
使用Windows注册表安装捆绑扩展名为considered obsolete。如果您使用currently documented method of bundling extensions,则会在创建配置文件时将扩展文件复制到每个配置文件的 extensions 目录中,或者使用该配置文件首次运行该版本的Firefox。从那时起,扩展程序将自动更新。
将捆绑的扩展程序(作为 .xpi 文件,未解压缩)放入的正确目录:
[Firefox安装目录] /分发/扩展
如果在创建配置文件并运行该版本的Firefox后向该目录添加扩展名,则该扩展名将不会复制到该配置文件的 extensions 目录。
用户可以完全控制其个人资料目录中的扩展程序副本,包括从配置文件中删除它的功能。为多个用户/配置文件安装扩展的其他方法只允许他们在不自动更新时禁用它。
当前行为:
Firefox所做的事情似乎正是它应该做的事情,并且是记录在案的。如果扩展是由外部机构(用户,或安装脚本,手动放置文件,或与Firefox版本一起打包)安装,则放置引用( .xpi 文件,目录结构,文件链接,在多个Firefox配置文件可以执行扩展而不将复制到每个配置文件中的位置(例如使用Windows注册表)的位置,然后由Firefox假设外部代理将负责更新附加组件。在这些情况下,Firefox不会更新附加组件。
我猜测其原因是任何自动更新都发生在特定的配置文件中(来自多用户系统上的特定用户)。任何特定的配置文件/用户都不适合自动更新其他配置文件/用户正在使用的扩展程序,这些扩展程序/用户可能已锁定或正在使用附加文件。虽然Firefox通过在配置文件中自动更新Firefox本身来打破这一点,但我的假设是,对于扩展而言,这被认为是不合适的。
您拥有的选项是:
到目前为止,最简单的方法是将捆绑的扩展名包含在 [Firefox安装目录] / distribution / extensions 目录中。