如何从 Firefox 附加组件中读取配置文件首选项?

How to read profile preferences from Firefox add-on?

我正在这样做(Firefox 66.0.5,MacOS):

var prefs = Components.classes['@mozilla.org/preferences-service;1']
  .getService(Components.interfaces.nsIPrefBranch);
var x = pref.getCharPref('extensions.foo.x');

我明白了:

JavaScript error: moz-extension://9390a488-d749-d140-91b6-fb1b2a86053f/foo.js,
line 1: TypeError: Components.classes is undefined

阅读个人资料偏好的正确方法是什么?

我试过这个:

var prefs = Components.classesByID['@mozilla.org/preferences-service;1']
  .getService(Components.interfaces.nsIPrefBranch);

得到这个:

JavaScript error: moz-extension://ebac8f96-717d-0c4b-b2d3-a7d6f3515843/auth.js,
line 1: TypeError: Components.classesByID is undefined

WebExtensions 非常 更改用户首选项的能力有限。有一些,目前有 14 个,您可以通过 browserSettings API. There are others which are effectively changed through other WebExtension APIs (e.g. proxy) 影响,但不能直接影响。遗憾的是,没有直接的方法从 WebExtension 读取或设置用户首选项。直接调整用户首选项的功能仅适用于旧样式的附加组件(从 Firefox 57 开始全部删除)。

关于您使用 Components 以及您遇到的具体错误,请参阅我对 的回答以获取更多详细信息。在 WebExtension 中无法使用 Components

我能想到的唯一可以在 Firefox 发行版中调整首选项的方法是使用 Native messaging 与您也安装的本机应用程序通信。在 Firefox exits/stops/is 关闭后,本机应用程序可以读取和更改 Firefox 配置文件 运行 配置文件目录中的配置文件。然后它可以重新启动 Firefox。

在 Firefox 的 Nightly 和 Developer Edition 版本中,应该仍然可以使用 WebExtensions Experiment,这将允许您使用 Components 界面更改您想要的首选项。但是,如果这是您要公开分发的扩展程序,那不是一个可行的解决方案。