В моем расширении Firefox событие onUninstalled, похоже, не срабатывает

Firefox 4 предоставляет некоторые события для обнаружения, когда пользователь удаляет расширение. Я могу заставить срабатывать onUninstalling (когда пользователь щелкает, чтобы удалить расширение), но я не могу заставить что-либо происходить, когда срабатывает onUninstalled (что должно произойти после перезапуска).

Components.utils.import("resource://gre/modules/AddonManager.jsm");
AddonManager.addAddonListener({
    onUninstalled: function(addon){
        //does not work
        alert("uninstalled!");
    },
    onUninstalling: function(addon){
        //works as expected
        alert("uninstalling!");   
    }
  });

В конечном итоге я надеюсь показать страницу после того, как пользователь удалит мое расширение. Я бы предпочел сделать это после onUninstalled, если бы мог.


person Newtang    schedule 08.06.2011    source источник


Ответы (1)


Метод onUninstalled вызывается после того, как расширение было удалено, поэтому ваше расширение не может получить свое собственное событие удаления, оно больше не может его получать. Однако вы можете получить уведомление об удалении других надстроек, в этом и заключается смысл этого события. Глядя на исходный код, кажется, что есть дополнительная загвоздка — это уведомление отправляется только для надстроек, которые не требуют перезапуска. Это имеет смысл, учитывая, что перезагрузка может радикально изменить ситуацию, потому что внешние приложения добавили или удалили надстройки в каталоге расширений. Таким образом, Firefox даже не пытается сообщать об изменениях, которые произошли, когда он не был запущен, любые слушатели должны просто перечитывать список надстроек при каждом запуске браузера.

Подводя итог, в качестве «классического» расширения вы должны использовать onUninstalling, хотя это событие не гарантирует, что расширение будет удалено (пользователь все еще может отменить свой выбор). Расширения с начальной загрузкой (те, которые не требуют перезагрузки, см. https://developer.mozilla.org/en/Extensions/Bootstrapped_extensions) проще, метод uninstall() в их bootstrap.js будет вызываться, даже если расширение отключено. Однако превратить ваше расширение в самозагружаемое не всегда просто, с этим связано несколько уловок: http://adblockplus.org/blog/how-many-hacks-does-it-установка-без-перезапуска-установки-вашего-расширения

person Wladimir Palant    schedule 08.06.2011
comment
Отличное объяснение! Спасибо за вдумчивый ответ. - person Newtang; 10.06.2011