在bootstrap卸载功能中,重新导入



在我的引导插件的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.
}

所以,有三个半特殊的"事情"需要考虑:

  1. uninstall不运行时,XPI手动删除,而浏览器不运行。2. 当正确卸载时,uninstall将始终运行。
  2. . .即使在此之前没有调用其他附加函数。
  3. 这也意味着bootstrap.js中的任何全局代码也将在uninstall上运行,作为加载bootstrap.js的结果。

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

然而,我想指出的是,如果用户没有特别指示,在卸载时删除用户配置通常被认为是一个坏主意。配置文件和用户数据文件也是如此。如果你这样做,你应该事先问一下。用户会定期卸载,然后重新安装,却发现他们精心制作的偏好等都不见了。

相关内容

  • 没有找到相关文章

最新更新