Каковы области действия и / или постоянство модулей кода JavaScript?
Экспериментируя с загруженным расширением, я пытаюсь понять объем и / или устойчивость модулей jsm, задав свойство, называемое baseUri
, на модуле объекта из bootstrap.js
и читать его снова из JavaScript в моем options.xul
(который открывается из Менеджера дополнений).
Насколько я понимаю, модули кода JavaScript сохраняются после загрузки. Тем не менее, когда я пытаюсь получить доступ baseUri
от options.xul
его значение undefined
,
install.rdf:
<!-- just the relevant XML (this works as expected, by the way): -->
<em:optionsURL>chrome://test/content/options.xul</em:optionsURL>
/modules/Test.jsm:
var EXPORTED_SYMBOLS = [ 'Test' ];
Test = {
baseUri: undefined
}
/bootstrap.js:
// this is done in global scope,
// not inside install() or startup() for instance, if that matters
let test = Components.utils.import( 'file:///absolute/path/to/Test.jsm', {} ).Test;
test.baseUri = someBaseUriIExtracted;
/chrome/content/options.js (включено в /chrome/content/options.xul
):
let test = Components.utils.import( 'file:///absolute/path/to/Test.jsm', {} ).Test;
console.log( test.baseUri ); // undefined
Итак, я думаю, что я не могу полностью понять, что это за области, из которых я должен иметь доступ к свойствам объекта из экспортированных символов jsm и / или как и когда именно эти объекты сохраняются.
Возможно, моя проблема имеет какое-то отношение к песочнице? Firefox считает options.xul
при открытии из диспетчера надстроек, чтобы быть другой областью безопасности, чем bootstrap.js
возможно?
Можете ли вы пролить свет на реальные области применения модулей jsm и когда и где я смогу получить доступ к постоянным свойствам модулей jsm?
2 ответа
Документация довольно проста о том, что и как делятся
Каждая область, которая импортирует модуль, получает копию экспортированных символов в этом модуле. Изменения значения символа не будут распространяться на другие области (хотя свойства объекта будут управляться ссылкой).
Я думаю, что сопровождающие примеры понятны.
Может быть, вы должны использовать геттеры / сеттеры.
Из того, что я знаю:
- Другие модули jsm
- Окно браузера
- Окно контента
- начальный объем аддона