试验引导扩展,我试图通过在bootstrap.js
的模块对象上设置一个名为baseUri
的属性来理解jsm模块的作用域和/或持久性,然后从我的options.xul
(从附加组件管理器打开(中的javascript再次读取它。
我目前的理解是,JavaScript 代码模块在加载后是持久的。但是,当我尝试从options.xul
访问baseUri
时,它的值是 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 模块上的持久属性?
文档关于共享的内容和方式非常简单
导入模块的每个作用域都会收到 导出该模块中的符号。对符号值的更改将 不会传播到其他范围(尽管对象的属性将是 通过引用操纵(。
我认为附带的例子很清楚。
也许你应该使用getters/setters。
据我所知:
- 其他 jsm 模块
- 浏览器窗口
- 内容窗口
- 引导插件范围