Firefox Bootstrapped Extensions: Пространство имен

Я смотрю на загруженные расширения. Глядя на код некоторых из этих расширений, я вижу множество объявлений переменных, констант и функций.

Они все объявлены в объекте окна? Нет ли проблемы с загрязнением / конфликтом пространства имен?

Я обертываю каждую вещь в одном объекте / пространстве имен в расширениях оверлея, которые я сделал. Отличаются ли в этом отношении начальные расширения?

Я заметил, что все bootstrapped.js используйте те же / стандартные имена функций. Означает ли это, что загруженные расширения находятся в "песочнице" или их объем ограничен?

1 ответ

Решение

bootstrap.js объем

Они все объявлены в объекте окна? Нет ли проблемы с загрязнением / конфликтом пространства имен?

...

Я заметил, что все bootstrapped.js используют одинаковые / стандартные имена функций. Означает ли это, что загруженные расширения находятся в "песочнице" или их объем ограничен?

Чтобы расширить комментарий @paa: bootstrap.js действительно получает свою собственную сферу.

AddonManager создаст новую область (или "пространство имен", если хотите) для bootstrap.js. Прямо сейчас реализация использует Components.utils.Sandbox, но это деталь реализации.

Это означает, что нет window объект. bootstrap.js будет загружен один раз за процесс Firefox и не имеет window объект. Это очень сильно отличается от оверлейного скрипта, который будет загружаться один раз для каждого нового окна и иметь общую область видимости (window сам объект) с кодом Firefox и оверлейными скриптами из других дополнений.

Это также означает, что загружаемые надстройки могут свободно выбирать любые имена, которые им нравятся в их области действия (их личная песочница), не опасаясь столкновения с другими надстройками, если эти имена действительны в Javascript в целом.

Единственными исключениями являются

  • имена функций точки входа, которые надстройка должна реализовывать, что будет вызывать диспетчер надстроек, и поэтому имеют особое значение (startup, shutdown, install, uninstall),
  • заранее определенные вещи, которые либо идут с Sandbox (Componentsи встроенные Javascript, такие как Object, String, Array, Map, так далее.)
  • вещи, которые AddonManager будет вводить (как __SCRIPT_URI_SPEC__, ADDON_*, APP_* константы).

Полный список предопределенных имен, начиная с Firefox 30:

Components.utils.reportError(Object.getOwnPropertyNames(this).join(", "));

// Object, Function, eval, Components, XPCNativeWrapper, dump, debug,
// importFunction, IDBCursor, IDBCursorWithValue, EventTarget, IDBDatabase,
// IDBFactory, FileHandle, IDBFileHandle, IDBIndex, IDBKeyRange,
// IDBObjectStore, IDBRequest, IDBOpenDBRequest, IDBTransaction, Event,
// IDBVersionChangeEvent, indexedDB, APP_STARTUP, APP_SHUTDOWN, ADDON_ENABLE,
// ADDON_DISABLE, ADDON_INSTALL, ADDON_UNINSTALL, ADDON_UPGRADE,
// ADDON_DOWNGRADE, Worker, ChromeWorker, __SCRIPT_URI_SPEC__, undefined,
// Array, Boolean, JSON, Date, Math, isNaN, isFinite, parseFloat, parseInt,
// NaN, Infinity, Number, String, escape, unescape, uneval, decodeURI,
// encodeURI, decodeURIComponent, encodeURIComponent, RegExp, Error,
// InternalError, EvalError, RangeError, ReferenceError, SyntaxError,
// TypeError, URIError, Iterator, StopIteration, Int8Array, Uint8Array,
// Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array,
// Float64Array, Uint8ClampedArray, DataView, ArrayBuffer, Proxy, WeakMap,
// Map, Set, Intl

Управление другими областями действия

Однако загружаемая надстройка по-прежнему должна быть внимательной и избегать конфликтов при взаимодействии с другими областями, такими как окна, модули кода JS, другие области начальной загрузки дополнения и так далее. Манипулирование другими областями также может привести к утечкам из области начальной загрузки дополнения.

Например

Cu.import("resource://gre/modules/Services.jsm");
Services.foo = "bar";

Это добавит foo собственность на Services объект, который живет в общем Services.jsm кодовый модуль. Все остальные дополнения и код браузера увидят Services.foo Кроме того, это может вызвать конфликты и регулярное не загрязнять общее пространство имен- применяются правила.

Кроме того, когда ваше дополнение получает shutdown вам придется удалить Services.foo снова или Services.jsm сфера будет держать ссылку на него, а так как значение foo (строка "bar") живет внутри вашего загрузочного отсека, он будет поддерживать ваш загрузочный отсек благодаря этой ссылке и эффективно создавать утечку памяти в противном случае (так называемые отсеки зомби в сленге mozilla).

Или же

// Get the most recent browser window
var browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
browserWindow.doSomething = function() {
  browserWindow.alert("hello world");
};

Это было бы эквивалентно наличию оверлейного скрипта:

function doSomething() {
  alert("hello world");
}

Оба добавят новое имя doSomething в область окна браузера, следовательно, это имя может конфликтовать с другими надстройками и не загрязнять общее пространство имен- применяются правила. И опять же, это может привести к утечке так же, как и в предыдущем примере, поэтому загружаемое дополнение должно будет удалить свойство на shutdown еще раз, чтобы избежать этого.

Другие вопросы по тегам