Firefox扩展能否访问Services.prefs?如何读写about:config配置项
问题解决指南
核心问题原因
Services.prefs是Firefox的XPCOM组件接口,仅能在浏览器特权环境(比如你手动操作的浏览器控制台)或传统XUL/bootstrapped扩展中使用。而你开发的是基于WebExtensions标准的扩展(manifest v2),运行在沙箱环境里,无法直接访问这类非标准的特权接口,因此会抛出ReferenceError: Services is not defined。
正确解决方案
要读写network.trr.mode(DoH模式),需使用Firefox官方提供的WebExtensions标准API——browser.privacy.network.dnsOverHttps,具体步骤如下:
1. 更新manifest.json权限
添加"privacy"权限(原browserSettings权限可保留,若无需其他浏览器设置操作也可移除):
{ "manifest_version": 2, "name": "MyName", "version": "1.0", "description": "MyDescription", "permissions": [ "privacy" ] }
2. 修改background.js代码
通过privacyAPI获取并反转DoH模式值:
function changeDOH() { console.log("Toolbar button was clicked."); // 获取当前DoH模式 browser.privacy.network.dnsOverHttps.get({}).then(result => { const currentMode = result.value.mode; console.log("当前DOH模式: " + currentMode); // 反转值:0↔1 const newMode = currentMode === 0 ? 1 : 0; // 设置新的DoH模式 browser.privacy.network.dnsOverHttps.set({ value: { mode: newMode } }).then(() => { console.log("DOH模式已切换为: " + newMode); }).catch(err => { console.error("切换模式失败: ", err); }); }).catch(err => { console.error("获取模式失败: ", err); }); } browser.browserAction.onClicked.addListener(changeDOH);
补充说明
- 并非所有
about:config中的偏好都有对应的WebExtensions API,若需操作无对应API的偏好,manifest v2可考虑使用browser.experiments.settings(需开启Firefox的扩展实验功能),但该方式非标准且可能在后续版本中被移除;manifest v3则完全不支持这类非标准操作。 Services.prefs无法在WebExtensions环境中使用,无论manifest v2还是v3,都必须依赖官方提供的标准API来操作浏览器设置。
内容的提问来源于stack exchange,提问作者Shtole
相关产品推荐
相关产品推荐

