在自举插件的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 wlll,只要该插件仍然存在。
当然,如果用户在浏览器不运行时从其配置文件中手动删除了加载项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.
}


因此,需要考虑三个半特殊的“事物”:


在浏览器未运行时手动删除XPI时,uninstall不运行。 2.正确安装后,将始终运行uninstall
..即使之前没有其他附加功能被调用。
这也意味着,由于加载bootstrap.jsuninstall中的所有全局代码也将在bootstrap.js上运行。


经过粗略检查,您的代码似乎并不依赖于其他地方初始化的任何内容,因此应该没问题。

但是,我想指出的是,如果用户没有特别指示,在卸载时删除用户配置通常被认为是一个坏主意。配置文件和用户数据文件也是如此。如果这样做,则应先询问。
用户将定期卸载然后再重新安装东西,只是发现他们精心制作的首选项等不然就消失了。

10-06 02:51