Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Нотификации в расширении Firefox

Мне нужно было сделать небольшое расширения для получения состояния с сайта. Сам код готов, только не могу разобраться с нотификациями. Да, и расширение с bootstrap, если это важно.
Отличным вариантом было бы использовать HTML5 Notification, но он не работает внутри расширения. Точнее там нет объекта Notification.
Я нашёл другой вариант - использование модуля PopupNotifications.jsm. Но не могу протестировать примеры, приведённые в документации. Получаю ошибку
gBrowser is not defined
Используется некая переменная, которая, пока я не понял где существует.
Пример я брал здесь: https://developer.mozilla.org/en-US/docs/Using_popup_notifications
Конечно, можно использовать дополнительные расширения для использования нотификаций, но я не хочу вот этих самых зависимостей.
Можно ещё использовать и sdk, но только ради нотификаций переделывать код уже не хочется. Мне нужна самая простая реализация.
Вопрос: какой есть вариант для добавления нотификаций (желательно на примере), который потребует минимаотных изменений? Продолжить копать в сторону PopupNotifications.jsm? Или использовать createInstanse для интерфейса nsIDOMDesktopNotification (здесь загвоздка - я не нашёл имя класса, как обычно используется '@mozilla.org/...')? Для XMLHttpRequest я нашёл и использую такой вариант.
Можете что-нибудь посоветовать?


Ответ

Первым делом вам надо определиться, какой тип нотификаций вам подходит.
1) "Popup/Doorhanger" notifications (PopupNotifications.jsm) по определению отображаются в конкретном окне браузера в привязке к конкретной странице. Они используются в самом Firefox для отображения запросов типа "сохранить пароль?", "разрешить странице сделать то-то?".
Поэтому логично, что они требуют от вас ссылки на браузер (в определенной вкладке - tab) (gBrowser.selectedBrowser).
Как ее получить зависит от того, какой tab вы хотите найти.
Если бы ваш код работал в контексте overlay для browser.xul (как описано в туториале Building an Extension), для него было бы определено понятие "текущего окна", в котором код выполняется. Тогда gBrowser.selectedBrowser был бы определен и указывал бы на выбранную вкладку в текущем окне. Если ваш код работает в окне, не являющимся browser.xul, или вообще не в рамках окна (компонент XPCOM или JSM), то нужна дополнительная информация, на основании чего искать вкладку. В простейшем случае, если вы сами вызываете код в JSM из кода в overlay для browser.xul, вы должны передать ссылку на браузер в ваш код. В более сложных случаях - если вы используете один из механизмов уведомлений - вам может быть доступен какой-то объект, по которому можно найти вкладку. Если нужна помощь с этим, задавайте отдельный вопрос.
2) Глобальные ("toaster") notifications. Отображаются без привязки к окну или вкладке. Используются для оповещений типа "новая версия готова к установке".
Есть разные API для их отображения, в зависимости от контекста выполнения кода:
Web Notifications API - для страниц Модуль Addon SDK "sdk/notifications" - для расширений Addon SDK. Для "old-style" расширений и кода в Firefox - nsIAlertsService
Первые два API внутри используют nsIAlertsService (1, 2).
Собственно, в документации по nsIAlertsService приведены рабочие примеры, простейший:
var alertsService = Components.classes["@mozilla.org/alerts-service;1"]. getService(Components.interfaces.nsIAlertsService); try { alertsService.showAlertNotification("chrome://mozapps/skin/downloads/downloadIcon.png", "Alert title", "Alert text goes here.", false, "", null, ""); } catch (e) { // This can fail }

Комментариев нет:

Отправить комментарий