我可以在无重启插件的bootstrap.js中加载自定义jsm模块吗



我正试图在一个无重启的插件中加载一个自定义模块,使用以下命令:

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");
}

相关内容

  • 没有找到相关文章

最新更新