我正试图在一个无重启的插件中加载一个自定义模块,使用以下命令:
chrome/content/modules/Test.jsm:
var EXPORTED_SYMBOLS = [ 'Test' ];
let Test = {};
铬。清单:
content test chrome/content/
bootstrap.js:
const Cu = Components.utils;
// Tried this first, but figured perhaps chrome directives aren't loaded here yet
// let test = Cu.import( 'chrome://test/modules/Test.jsm', {} ).Test;
function install() {
let test = Cu.import( 'chrome://test/modules/Test.jsm', {} ).Test;
}
function uninstall() {
let test = Cu.import( 'chrome://test/modules/Test.jsm', {} ).Test;
}
function startup() {
let test = Cu.import( 'chrome://test/modules/Test.jsm', {} ).Test;
}
function shutdown() {
let test = Cu.import( 'chrome://test/modules/Test.jsm', {} ).Test;
}
然而,我得到了以下类型的WARN消息(这条消息适用于shutdown()
,但基本上适用于所有功能以及之前在全局范围内的尝试):
1409229174591 addons.xpi WARN运行引导程序方法时出现异常关闭test@extensions.codifier.nl:[异常…"组件返回的故障代码:0x80070057(NS_ERROR_ILLEGAL_VALUE)[nsiXComponents_Utils.import]"nsresult:"0x80070057(NS_ERROR_ILLEGAL_VALUE)"位置:"JS帧::resource://gre/modules/addons/XPIProvider.jsm->file:///test/bootstrap.js::shutdown::line 21"data:no]Stack跟踪:shutdown()@resource://gre/modules/addons/XPIProvider.jsm->file:///test/bootstrap.js:21<XPI_callBootstrapMethod()@resource://gre/modules/addons/XPIProvider.jsm:4232<XPI_updateAddonDisabledState()@resource://gre/modules/addons/XPIProvider.jsm:4347<AddonWrapper_userDisabledSetter()@resource://gre/modules/addons/XPIProvider.jsm:6647<uninstall()@extensions.xml:1541<oncommand()@about:addons:1<
chrome.manifest
指令在bootstrap.js
中是否还不可用?或者我试图做的是某种违反安全的行为?还是我只是在做一些微不足道的错误?
我希望实现的是,我可以做以下事情:
chrome/content/modules/Test.jsm:
var EXPORTED_SYMBOLS = [ 'Test' ];
let Test = {
install: function( data, reason ) {
},
/* etc */
bootstrap: function( context ) {
context.install = this.install;
context.uninstall = this.uninstall;
context.startup = this.startup;
context.shutdown = this.shutdown;
}
}
bootstrap.js:
const Cu = Components.utils;
Cu.import( 'chrome://test/modules/Test.jsm' );
Test.bootstrap( this );
也许一开始有点过头了,但我只是有点喜欢在模块和/或对象中隐藏实现并保持bootstrap.js
超级干净的想法。
如果你碰巧对如何通过其他方式实现这一目标有建议:我洗耳恭听。
是的,不过你的路径可能是错误的。
只需这样做:
let test = Cu.import( 'chrome://test/content/modules/Test.jsm', {} ).Test;
注意/content/
你不必做.Test
,除非你想让小写的test
来保持它。你可以做:
Cu.import( 'chrome://test/content/modules/Test.jsm');
并用作CCD_ 8,其中blah是JSM模块中的任何内容。
这个代码可以放在任何地方,它不必在install
函数中。
确保卸载自定义的JSM模块,否则会导致僵尸隔间,这对内存不利。阅读此处:
- 最后一段:https://developer.mozilla.org/en-US/docs/Extensions/Common_causes_of_memory_leaks_in_extensions
- 更多阅读,但可选:https://developer.mozilla.org/en-US/docs/Zombie_compartments
Beyond@Noitidart的答案是,如果您唯一关心的是如何导入模块,则不必使用chrome.manifest'并注册内容包。
function install(data, reason) {
Components.utils.import(data.resourceURI.spec + "relative/path/to/your/module.jsm");
}