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
еще раз, чтобы избежать этого.