【问题标题】:In uninstall function of bootstrap, re-import?在引导程序的卸载功能中,重新导入?
【发布时间】:2014-06-29 04:38:19
【问题描述】:

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

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

【问题讨论】:

    标签: javascript firefox-addon uninstallation firefox-addon-restartless


    【解决方案1】:

    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 的结果。

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

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

    【讨论】:

    • "这也意味着 bootstrap.js 中的任何全局代码也将在卸载时运行,作为加载 bootstrap.js 的结果。"是的!谢谢,这很有意义。
    • 是的,我至少应该提示他们我删除所有首选项和文件。只是当我卸载软件时,我希望它的每一个痕迹都消失了。如果我想暂时关闭它,我会禁用它。我安装然后卸载了这么多附加组件,这会导致我的浏览器中出现所有这些膨胀和废话:(我的天哪,我有随机文件,太烦人了。我认为 AMO 应该努力让用户,尤其是开发人员将卸载视为软件卸载在操作系统上。否则需要使用“重置 Firefox”功能,而我的历史和东西太宝贵了,无法全部重置。
    • 操作系统级软件卸载通常不会删除首选项。出于同样的原因。我明白为什么你喜欢软件在卸载时删除东西,我实际上对此表示同情。但是对于很多用户来说这会出乎意料,所以你不能满足所有人的期望。所以要么做破坏性最小的事情(不要删除数据),要么在做破坏性的事情之前先询问(或者有一个撤消功能,但我认为在这种情况下这不是一个选择)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多