实现 API 的实用程序

此页面介绍了一些对实现 WebExtension API 有用的实用程序类。

窗口管理器

此类管理 browser.windows API 中使用的不透明窗口标识符之间的映射。请参阅参考文档 此处

标签管理器

此类管理 browser.tabs API 中使用的不透明标签标识符之间的映射。请参阅参考文档 此处

扩展设置存储

扩展设置存储 (ESS) 用于存储扩展请求的设置更改,并根据优先级链或用户(通常)做出的特定选择来确定设置的当前值应该是什么。

当多个扩展请求对特定设置进行更改时,最近安装的扩展将具有优先权。

还可以选择特定扩展(或不选择任何扩展,这意味着用户设置)来控制设置。这通常只会通过下面描述的扩展首选项管理器发生。发生这种情况时,不会使用优先级控制,直到安装新扩展或禁用或卸载控制扩展为止。如果专门选择了用户设置,则只有通过安装控制设置的新扩展才能恢复优先级顺序。

ESS 将通过任何扩展状态更改(即安装、卸载、启用、禁用)管理对设置的控制权。

通知:

“extension-setting-changed”:

当设置发生更改时,会通过 apiManager 发出一个事件。它包含以下内容

  • action:select、remove、enable、disable 之一

  • id:设置已更改的扩展的 ID,如果设置已恢复为默认值或用户设置,则可能为 null。

  • type:更改的设置类型。这由使用 ESS 的模块定义。如果设置通过下面的扩展首选项管理器控制,则该值为“prefs”。

  • key:更改的设置名称。

  • item:如果有任何已控制设置的新值。

扩展首选项管理器

扩展首选项管理器 (EPM) 用于管理哪些扩展可以控制导致更改首选项的设置。EPM 在 ESS 之上添加了额外的逻辑,以帮助根据控制设置的内容管理首选项值。

在 API 中定义设置

通过调用 EPM.addSetting 在 API 模块中定义首选项设置。addSetting 允许 API 使用回调根据需要处理设置首选项。由于设置是在运行时定义的,因此 EPM 必须根据需要加载 API 模块才能正确管理设置。

在 api 模块定义(例如 ext-toolkit.json)中,api 必须使用“settings”: true,以便管理代码可以发现要加载哪些 API 模块以管理设置。请参阅 browserSettings[1] 作为示例。

about:preferences 中向用户公开的设置也需要特殊处理。我们通常会显示扩展正在控制首选项,并阻止更改设置。某些设置可能允许用户选择哪个扩展(或没有扩展)控制设置。

首选项行为

要实际设置设置,模块必须调用 EPM.setSetting。这通常通过扩展 API 完成,例如 browserSettings.settingName.set({ …value data… }),但也可以在其他时间完成,例如在扩展启动或安装模块的 onManifest 处理程序期间。

当扩展使用导致调用 EPM.setSetting 的 API 时,首选项并不总是会更改。调用 setSetting 时,值会由 ESS(上面)存储,如果扩展当前具有控制权或扩展可控设置,则首选项将更新。

安装、启用、禁用或卸载扩展,或用户在 about:preferences(或允许控制首选项的其他 UI)中的操作也可能会更新首选项。如果使用首选项设置的所有扩展都被禁用或卸载,则将恢复先前用户设置或默认值。

扩展可以使用 onChange api(例如 browserSettings.settingName.onChange)监视更改。

[1] https://searchfox.org/mozilla-central/rev/04d8e7629354bab9e6a285183e763410860c5006/toolkit/components/extensions/ext-toolkit.json#19

通知:

“extension-setting-changed:name”:

当 EPM 控制的设置发生更改时,会通过 apiManager 发出一个事件。它不包含其他数据。这主要用于实现 onChange API。

ESS 与 EPM

当 API 需要允许扩展存储影响 Firefox 工作方式但不会导致设置首选项的设置值时,可以使用 ESS。例如,允许扩展更改 newTab 服务中的 newTab 值。

当 API 需要允许扩展更改首选项时,应使用 EPM。

将 ESS/EPM 用于实验性 API

正确管理设置值取决于加载定义设置的任何模块的能力。由于实验性 API 是在扩展内部定义的,因此在某些情况下,实验性 API 中定义的设置可能无法正确管理。这可能导致首选项在禁用或安装扩展后仍然由扩展设置,尤其是在安全模式下更新该状态时。

使用实验性 API 中设置的扩展应谨慎行事,可能在扩展关闭时取消设置这些值。用于设置的值可以存储在扩展的本地存储中,并在扩展再次启动时恢复到 EPM 中。