在我的引导插件的uninstall
部分,我做了一些重要的事情。我删除了它创建的所有文件和所有首选项。然而,这使用了一些服务。
这是我的uninstall
过程的一个例子:
function uninstall(aData, aReason) {
if (aReason == ADDON_UNINSTALL) { //have to put this here because uninstall fires on upgrade/downgrade too
//this is real uninstall
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');
Cu.import('resource://gre/modules/osfile.jsm');
//if custom images were used lets delete them now
var customImgPrefs = ['customImgIdle', 'customImgLoading'];
[].forEach.call(customImgPrefs, function(n) {
//cant check the pref i guess because its probably unintialized or deleted before i used have a `if(prefs[n].value != '') {`
//var normalized = OS.Path.normalize(prefs[n].value);
//var profRootDirLoc = OS.Path.join(OS.Constants.Path.profileDir, OS.Path.basename(normalized));
var profRootDirLoc = OS.Path.join(OS.Constants.Path.profileDir, 'throbber-restored-' + n);
var promiseDelete = OS.File.remove(profRootDirLoc);
console.log('profRootDirLoc', profRootDirLoc)
promiseDelete.then(
function() {
Services.prompt.alert(null, 'deleted', 'success on ' + n);
},
function(aRejReas) {
console.warn('Failed to delete copy of custom throbber ' + n + ' image for reason: ', aRejReas);
Services.prompt.alert(null, 'deleted', 'FAILED on ' + n);
}
);
});
Services.prefs.deleteBranch(prefPrefix);
}
我发布而不是测试的原因是因为我测试了并且它有效,但是有任何特殊情况吗?就像如果插件被禁用,浏览器重新启动,然后用户打开插件管理器然后卸载。像这样的特殊情况,还有其他吗?他们要求我重新进口所有的东西吗?
uninstall
将被调用,无论附加组件以前是否启用,无论附加组件是否兼容,只要附加组件仍然存在。当然,如果用户在浏览器未运行时从配置文件中手动删除附加组件XPI(或解压缩目录),则不会调用它,因为在下次启动时没有什么可调用的了。
这也意味着uninstall
可能是第一个(也是唯一一个)被调用的附加函数。如果插件总是从浏览器开始就被禁用,然后被禁用,那么就不会有任何其他调用。意识到这一点很重要。考虑下面这个人为的例子。
var myId;
Cu.reportError("global exec"); // Thiw will be always run, as well.
function startup(data) {
myId = data.id,
}
function uninstall() {
Cu.reportError(myId); // might be undefined if startup never ran.
}
所以,有三个半特殊的"事情"需要考虑:
-
uninstall
不运行时,XPI手动删除,而浏览器不运行。2. 当正确卸载时,uninstall
将始终运行。 - . .即使在此之前没有调用其他附加函数。
- 这也意味着
bootstrap.js
中的任何全局代码也将在uninstall
上运行,作为加载bootstrap.js
的结果。
粗略地检查一下,您的代码似乎不依赖于其他地方初始化的任何内容,因此应该没有问题。
然而,我想指出的是,如果用户没有特别指示,在卸载时删除用户配置通常被认为是一个坏主意。配置文件和用户数据文件也是如此。如果你这样做,你应该事先问一下。用户会定期卸载,然后重新安装,却发现他们精心制作的偏好等都不见了。