迁移至WebExtensions时如何访问旧式Firefox扩展的偏好设置?
从XUL扩展偏好迁移到WebExtension的解决方案
要一次性访问旧XUL扩展存在Firefox偏好设置里的数据,WebExtension本身无法直接读取底层的Firefox偏好系统,但可以通过以下两种实用方案实现:
方案一:借助Bootstrap过渡扩展
Bootstrap扩展(轻量级特权扩展)可以访问XPCOM API,直接读取about:config里的旧偏好数据,再把数据传递给你的WebExtension。步骤如下:
- 编写一个简单的Bootstrap扩展,在
startup方法中读取旧XUL扩展的偏好(通常键名以extensions.你的旧扩展ID.开头):
function startup(data, reason) { // 获取Firefox偏好服务 const prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefService) .getBranch("extensions.旧扩展ID."); // 遍历读取所有相关偏好 const oldPrefs = {}; const prefNames = prefs.getChildList("", {}); for (let name of prefNames) { switch (prefs.getPrefType(name)) { case prefs.PREF_STRING: oldPrefs[name] = prefs.getCharPref(name); break; case prefs.PREF_INT: oldPrefs[name] = prefs.getIntPref(name); break; case prefs.PREF_BOOL: oldPrefs[name] = prefs.getBoolPref(name); break; } } // 向WebExtension发送数据,完成后自动卸载Bootstrap扩展 browser.runtime.sendMessage("你的WebExtensionID", {type: "OLD_PREFS", data: oldPrefs}) .then(() => { Components.utils.import("resource://gre/modules/AddonManager.jsm") .AddonManager.getAddonByID(data.id, (addon) => addon.uninstall()); }); } function shutdown(data, reason) {} function install(data, reason) {} function uninstall(data, reason) {}- 编写一个简单的Bootstrap扩展,在
- 在WebExtension中监听外部消息,接收Bootstrap传来的旧数据并存入WebExtension存储:
browser.runtime.onMessageExternal.addListener((message, sender) => { if (message.type === "OLD_PREFS" && sender.id === "你的Bootstrap扩展ID") { browser.storage.local.set({oldExtensionPrefs: message.data}) .then(() => console.log("旧偏好数据迁移完成")); } });- 将两个扩展打包发布,或引导用户先安装Bootstrap扩展完成迁移,再使用WebExtension。
方案二:利用Firefox内置迁移机制
如果你的XUL扩展和WebExtension使用相同的扩展ID(需在Firefox开发者中心申请保留旧ID),Firefox会自动将XUL扩展通过simple-prefs存储的数据,迁移到WebExtension的browser.storage.local中,键名为__legacy_preferences__。你可以直接读取这个键获取所有旧偏好:
browser.storage.local.get("__legacy_preferences__") .then(result => { if (result.__legacy_preferences__) { const oldPrefs = result.__legacy_preferences__; // 按需处理旧数据,比如转移到自定义存储结构 console.log("获取到旧偏好数据:", oldPrefs); } });
这个方法更简洁,但前提是你能保留原扩展ID,且XUL扩展使用的是simple-prefsAPI存储数据(直接操作nsIPrefService的数据无法自动迁移)。
注意事项
- Bootstrap扩展需要签名,可在Firefox开发者中心申请临时签名测试,或发布到AMO获取正式签名。
- 迁移完成后建议清理旧偏好数据,避免占用存储空间。
内容的提问来源于stack exchange,提问作者Alexey Romanov
相关产品推荐
相关产品推荐

