如何将Firefox自动更新扩展程序与应用程序

时间:2016-06-07 14:23:33

标签: firefox firefox-addon

我们公司的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;
}

这是禁止对从本地文件夹安装的加载项进行更新的故意行为。

我们正在一些限制条件下工作:

  • 安装必须适用于具有用户权限的Windows帐户。换句话说,%程序文件%不可写,也不需要授予普通用户权限的任何东西(即安装不能假定该帐户具有高级用户或管理员的扩展功能)。
  • 捆绑的扩展程序应安装到所有当前存在的Firefox配置文件中,以供安装该应用程序的用户使用。
  • 系统的其他用户不应受到影响。
  • Firefox应该通过Firefox用于自动更新附加组件的常规过程自动更新捆绑的扩展程序。
  • Firefox扩展的自动更新无法搭载我们的应用程序中存在的任何自动更新功能。此类功能可能存在,也可能不存在,但必须使用常规的Firefox附加组件自动更新功能。
  • 我们需要一种能够在我们的应用程序中禁用所有配置文件中的Firefox扩展的方法。

1 个答案:

答案 0 :(得分:1)

Firefox专门设计时假设任何扩展名(例如您的扩展名,由Firefox分发版外部的安装程序应用于多个配置文件)都将由Firefox外部的进程更新。这导致没有清洁和容易的解决方案。

鉴于您正在进行的限制,我实现您所希望的方式是通过将其放置在目录中来安装加载程序扩展:
%APPDATA%\ Mozilla的\扩展\ {ec8030f7-C20A-464f-9b0e-13a3a9e97384}
或者,您可以像现在一样使用Windows注册表。但是,使用Windows注册表似乎是considered obsolete。使用任一方法都会导致扩展程序安装在用户和所有新创建的配置文件的所有当前存在的配置文件中。

在某些情况下,加载项将安装并处于活动状态,而不会询问用户(无重新启动的加载项,新创建的配置文件,在目录中),在其他情况下,将要求用户安装加载项的权限( XUL覆盖加载项,在目录中,新创建的和现有的配置文件)。在其他情况下,加载项将作为已禁用的加载项列表输入(Windows注册表,无重新启动的加载项)。我没有足够的测试来确定行为是什么的完整图表。我不知道你希望这种行为是什么。您需要检查以验证所使用的方法是否导致加载程序扩展根据需要应用于Firefox配置文件。

加载程序扩展的功能是:

  • 在Firefox启动/扩展安装时检查您希望/需要的所有扩展是否已安装(不一定已启用)。如果不存在,则在普通的扩展方法中将它们安装在配置文件中(这将导致这些扩展自动更新,但不会自动更新)。
  • 您可能还希望通过选项/首选项/ simple-prefs为用户提供一种方法,以验证所需扩展程序的安装并启用/禁用它们。
  • 它作为已安装/已启用的扩展的存在被用作您可以接受运行的主扩展的标记。如果未安装/启用加载程序,则您的其他扩展会禁用/卸载自身。这包括如何从外部应用程序禁用主扩展。

您的加载程序加载项安装的扩展名是您当前与应用程序捆绑在一起的扩展程序。

加载程序扩展可以通过直接文件操作(不推荐)或使用Add-on Manager来安装扩展。加载项管理器具有从fileURL安装扩展程序的方法。

对问题的旧理解(与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安装位置] /分发/扩展目录中。这是使用Firefox构建捆绑扩展的常规方法。
  • 将扩展程序放在其他位置(multiple possibilities)。您需要为Firefox捆绑安装提供其他方法,以检查与其捆绑在一起的扩展的更新。

到目前为止,最简单的方法是将捆绑的扩展名包含在 [Firefox安装目录] / distribution / extensions 目录中。