1

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);
    }

我发布而不是测试的原因是因为我测试并且它有效,但是有什么特殊情况吗?就像插件被禁用,浏览器重新启动,然后用户打开插件管理器然后卸载一样。像这样的特殊情况和其他任何情况?他们是否要求我再次进口我所有的东西?

4

1 回答 1

3

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.
}

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

  1. uninstall在浏览器未运行时手动删除 XPI 时不会运行。2.正确卸载后,uninstall始终运行。
  2. .. 即使在此之前没有调用其他附加功能。
  3. 这也意味着,作为加载的结果,您的任何全局代码bootstrap.js也将继续运行。uninstallbootstrap.js

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

然而,我想指出的是,如果用户没有明确指示这样做,通常认为在卸载时删除用户配置是一个坏主意。配置文件和用户数据文件也是如此。如果你这样做,你应该事先询问。用户会定期卸载然后重新安装东西,结果却发现他们精心设计的偏好等等都消失了。

于 2014-06-29T06:15:39.010 回答