繁体   English   中英

是否可以将偏好设置从Firefox XUL插件迁移到SDK插件?

[英]Is it possible to migrate preferences from a Firefox XUL addon to an SDK addon?

在将我们的扩展从XUL迁移到Firefox SDK的过程中,我(希望)遇到了最后一个障碍,但是我有最后一个症结:

首选项。

当将插件的SDK版本安装在XUL插件的顶部时,必须简单地迁移许多首选项集。 由于各种原因,这些首选项不会显示给最终用户。 两种体系结构之间的首选项命名空间完全不同。 例如 -

XUL中的“ version_number”首选项由开发人员任意命名,并在about:config中显示为:

my.preference.name

但是,在SDK中,它们的范围仅限于相关扩展:

extensions.[extension ID].my.preference.name

是否可以迁移XUL插件中的首选项以在SDK插件中重用? 如果是这样,怎么办?

虽然似乎无法从SDK插件的名称空间之外的首选项中读取内容,但可以将其写入旧XUL扩展中的EXPECTED名称空间。 我们想到的解决方案是在将新的SDK版本发布到AMO之前,发布旧的XUL插件的最终版本,并附带少量的逻辑以执行此迁移。

这是我们方法的伪代码表示:

ContentScript.js

function initNewFFInstallation() {
    ...
    if (checkIsUpgrade()) {
        var keys = getPrefKeys()
        migratePrefs(keys);
    }
}

Utils.js-充当将Overlay功能暴露给内容脚本的桥梁

Util.prototype.getPrefsBranch = function() {
    return Components.classes["@mozilla.org/preferences-service;1"].
        getService(Components.interfaces.nsIPrefService).
        getBranch("my.prefs.ns.");
}

Util.prototype.getV2PrefsBranch = function() {
    return Components.classes["@mozilla.org/preferences-service;1"].
        getService(Components.interfaces.nsIPrefService).
        getBranch("extensions.[SDK_ADDON_ID].");
}

Util.prototype.setBoolPref = function(key, val) {
      this.getPrefsBranch().setBoolPref(key, val);
      this.getPrefsBranch().setBoolPref(key, val);
}     

Util.prototype.setCharPref = function(key, val) {
      this.getPrefsBranch().setCharPref (key, val);
      this.getV2PrefsBranch().setCharPref (key, val);
}     

//copies all the preferences over
Util.prototype.migratePrefs = function(boolPrefKeys, charPrefKeys) {
     boolPrefKeys.each(function (key) {
          this.getV2PrefsBranch().setBoolPref(key, this.getPrefsBranch().getBoolPref(key));
     });

    charPrefKeys.forEach(function (key) {
          this.getV2PrefsBranch().setCharPref(key, this.getPrefsBranch().getCharPref(key));
     });
}

然后,在我们的scriptcompiler.js(将脚本实际注入到页面中)中,将util方法挂接到SafeWindow对象上。

injectScript: function(script, unsafeContentWin) {  

    var safeWin=new XPCNativeWrapper(unsafeContentWin);     
    var sandbox=new Components.utils.Sandbox(safeWin, {"sandboxPrototype":safeWin});    

    sandbox.window=safeWin;     
    sandbox.document=sandbox.window.document;   
    sandbox.unsafeWindow=unsafeContentWin;

    var util = new Util();

    //...other APIs
    sandbox.migratePreferences=app_gmCompiler.hitch(util , "migratePreferences");

   try {    
       Components.utils.evalInSandbox("(function(){"+script+"})()", sandbox);   
    } catch (e) {   
    } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM