Есть один «мозг» в аддоне Firefox? - PullRequest
4 голосов
/ 08 января 2010

У меня есть дополнение, которое каждые 5 минут проверяет RSS-ленту на наличие нового сообщения, и, если оно есть, оно отображает предупреждение (). Проблема в том, что я боюсь, что если пользователь откроет несколько окон, то при появлении нового сообщения появятся миллионы предупреждений, говорящих об одном и том же. Есть ли в любом случае только один «мозг», работающий за раз?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 09 января 2010

Найдите что-то под названием «Модули общего кода 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 и загружает экспортированные функции и переменные *1013* (см. Ниже) в объект 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"

]
2 голосов
/ 09 января 2010

[отредактировано] Модули не являются правильным решением этой проблемы, так как код все равно будет импортирован в каждое окно, и все настроенные слушатели / таймеры будут работать в каждом окне. Вы должны быть осторожны с использованием модулей для этого - все таймеры / обратные вызовы должны быть установлены в коде модуля (не только с использованием объекта наблюдателя, определенного в модуле), и вы не должны использовать никаких ссылок на окно в модуле .

Правильный способ сделать это - Я бы предпочел написать компонент XPCOM (в JS). Это несколько сложно, да, и у меня нет удобной ссылки, объясняющей, как это сделать. Одна вещь: реализовать его с помощью XPCOMUtils проще, старая документация бросит на вас кучу шаблонного кода.

...