У вас один «мозг» в аддоне Firefox?
-
19-09-2019 - |
Вопрос
У меня есть дополнение, которое каждые 5 минут или около того проверяет RSS-канал на наличие нового сообщения, и если оно есть, оно отображает предупреждение().Проблема в том, что я боюсь, что если пользователь откроет несколько окон, то при появлении нового сообщения появятся миллионы предупреждений, говорящих одно и то же.Можно ли вообще одновременно работать только один «мозг»?
Заранее спасибо!
Решение
Найдите что-то под названием «Модули общего кода Javascript» или JSM.
Основные документы здесь:
https://developer.mozilla.org/En/Using_JavaScript_code_modules
Каждый файл .js в вашем аддоне, которому требуется общая память, откроется со следующей строкой:
Components.utils.import("resource://xxxxxxxx/modules/[yourFilenameHere].jsm", com.myFirefoxAddon.shared);
Приведенная выше строка открывает [yourFilenameHere].jsm и загружает его. экспортировано (см. ниже) функции и переменные в объект com.myFirefoxAddon.shared.Каждый загруженный экземпляр этого объекта будет указывать на один и тот же экземпляр в памяти.
Обратите внимание: если вы хотите иметь хоть какую-то надежду на то, что ваш аддон пройдет модерацию, вам нужно будет написать весь свой код в объекте типа com.myFirefoxAddon.*, поскольку головорезы из AMO не допускают одобрения аддонов, которые не проходят модерацию. Уважайте глобальное пространство имен
Самый большой недостаток JSM заключается в том, что вам нужно вручную экспортировать каждую функцию, которую вы хотите сделать доступной для остальной части вашего кода...поскольку JS не поддерживает публичные/частные типы, это кажется мне своего рода «публичной» поддержкой бедняков...в любом случае вам нужно будет создать массив EXPORTED_SYMBOLS где-нибудь в вашем файле JSM и указать каждую функцию или объект, который вы хотите экспортировать, например:
var EXPORTED_SYMBOLS = [
/* CONSTANTS */
"SERVER_DEBUG",
"SERVER_RELEASE",
"LIST_COUNTRIES",
"LIST_TERRITORIES_NOEX",
/* GLOBAL VARIABLES */
/* note: primitive type variables need to be stored in the globals object */
"urlTable",
"globals",
/* INTERFACES */
"iStrSet",
/* FUNCTIONS */
"globalStartup",
/* OBJECTS */
"thinger",
"myObject"
]
Другие советы
[отредактировано] Модули не являются правильным решением этой проблемы, поскольку код по-прежнему будет импортироваться в каждое окно, и любые настроенные вами прослушиватели/таймеры будут запускаться в каждом окне. Вы должны быть осторожны с использованием модулей для этого - все таймеры/обратные вызовы должны быть настроены в коде модуля (а не только с использованием объекта-наблюдателя, определенного в модуле), и вы не должны использовать какие-либо ссылки на окно в модуле. .
Правильный способ сделать это я бы предпочел написать компонент XPCOM (на JS).Да, это несколько сложно, и у меня нет удобной ссылки, объясняющей, как это сделать.Одна вещь:реализовать его с помощью XPCOMUtils проще, старая документация будет содержать много шаблонного кода.