Каковы области действия и / или постоянство модулей кода 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
  • Окно браузера
  • Окно контента
  • начальный объем аддона
Другие вопросы по тегам