0

尝试使用引导扩展,我试图通过在模块对象上设置一个baseUri名为经理)。bootstrap.jsoptions.xul

我目前的理解是 JavaScript 代码模块一旦加载就会被持久化。但是,当我尝试从 访问baseUrioptions.xul,它的值为undefined

安装.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 模块上的持久属性?

4

2 回答 2

2

文档非常简单地说明了共享的内容和方式

导入模块的每个作用域都会收到该模块中导出符号的按值副本。对符号值的更改不会传播到其他范围(尽管对象的属性将通过引用进行操作)。

我认为随附的示例很清楚。

也许你应该使用getters/setters

于 2014-08-31T17:50:00.427 回答
1

据我所知:

  • 其他 jsm 模块
  • 浏览器窗口
  • 内容窗口
  • 引导插件范围
于 2014-08-31T08:49:20.577 回答