![](/img/trans.png)
[英]Is it possible to migrate Firefox XUL addon users to use a Firefox SDK addon instead?
[英]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.