В деинсталляции функции начальной загрузки, повторного импорта?
В 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.
}
Итак, есть три с половиной специальных "вещи" для рассмотрения:
uninstall
не запускается, когда XPI удаляется вручную, пока не запущен браузер. 2. При правильной установке, тоuninstall
всегда будет работать- .. даже если до этого не было вызвано никаких дополнительных функций.
- Это также означает, что любой глобальный код в вашем
bootstrap.js
также будет работать наuninstall
в результате загрузкиbootstrap.js
,
После беглого осмотра ваш код, похоже, не полагается на что-либо инициализированное в другом месте, поэтому все должно быть в порядке.
Я хотел бы отметить, однако, что обычно считается плохой идеей удалить пользовательскую конфигурацию при удалении, если пользователь специально не проинструктировал об этом. То же самое касается файлов конфигурации и файлов пользовательских данных. Если вы это сделаете, вы должны спросить раньше. Пользователи будут регулярно удалять, а затем переустанавливать вещи, только чтобы найти их тщательно продуманные настройки и т. Д..