В деинсталляции функции начальной загрузки, повторного импорта?

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

Причина, по которой я пишу, а не проверяю, в том, что я проверял, и это работало, но есть ли особые случаи? Например, если дополнение было отключено, браузер перезапустился, а затем пользователь открыл диспетчер дополнений, а затем удалил. Особые случаи, подобные этим и любым другим? Они требуют, чтобы я снова импортировал все мои вещи?

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,

После беглого осмотра ваш код, похоже, не полагается на что-либо инициализированное в другом месте, поэтому все должно быть в порядке.

Я хотел бы отметить, однако, что обычно считается плохой идеей удалить пользовательскую конфигурацию при удалении, если пользователь специально не проинструктировал об этом. То же самое касается файлов конфигурации и файлов пользовательских данных. Если вы это сделаете, вы должны спросить раньше. Пользователи будут регулярно удалять, а затем переустанавливать вещи, только чтобы найти их тщательно продуманные настройки и т. Д..

Другие вопросы по тегам