1

uninstallブートストラップされたアドオンの一部で、いくつかの重要なことを行います。作成したファイルとすべての設定を削除します。ただし、これはいくつかのサービスを使用します。

これは私のuninstall手順の 1 つの例です。

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

したがって、考慮すべき特別な「事柄」が 3 つ半あります。

  1. uninstallブラウザが実行されていないときに XPI が手動で削除された場合は実行されません。2. 適切にアンインストールすると、uninstall常に実行されます。
  2. .. それ以前に他のアドオン関数が呼び出されなかったとしても。
  3. これは、ロードの結果として、内のグローバル コードbootstrap.jsも で実行されることも意味します。uninstallbootstrap.js

大まかに調べてみると、コードは他の場所で初期化されたものに依存していないように見えるので、問題ないはずです。

ただし、ユーザーから特に指示がない限り、アンインストール時にユーザー構成を削除することは一般的に悪い考えであると考えられていることを指摘したいと思います。構成ファイルとユーザー データ ファイルについても同様です。その場合は、事前に質問する必要があります。ユーザーは定期的にアンインストールしてから再インストールしますが、慎重に作成された設定などが失われていることに気付くだけです。

于 2014-06-29T06:15:39.010 に答える