You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至WebExtensions时如何访问旧式Firefox扩展的偏好设置?

从XUL扩展偏好迁移到WebExtension的解决方案

要一次性访问旧XUL扩展存在Firefox偏好设置里的数据,WebExtension本身无法直接读取底层的Firefox偏好系统,但可以通过以下两种实用方案实现:

方案一:借助Bootstrap过渡扩展

Bootstrap扩展(轻量级特权扩展)可以访问XPCOM API,直接读取about:config里的旧偏好数据,再把数据传递给你的WebExtension。步骤如下:

    1. 编写一个简单的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) {}
    
    1. 在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("旧偏好数据迁移完成"));
      }
    });
    
    1. 将两个扩展打包发布,或引导用户先安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:12:44