首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在bootstrap.js中加载自定义jsm模块吗?

我可以在bootstrap.js中加载自定义jsm模块吗?
EN

Stack Overflow用户
提问于 2014-08-28 12:44:57
回答 2查看 1K关注 0票数 2

我正在尝试使用以下方法在无重新启动的插件中加载一个自定义模块:

chrome/content/modules/Test.jsm

代码语言:javascript
复制
var EXPORTED_SYMBOLS = [ 'Test' ];

let Test = {};

chrome.manifest

代码语言:javascript
复制
content   test  chrome/content/

bootstrap.js

代码语言:javascript
复制
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;
}

但是,我得到了以下类型的警告消息(这一条用于shutdown(),但对于所有函数和在早期的全局范围尝试中基本上相同):

1409229174591 addons.xpi警告在test@extensions.codifier.nl上运行引导方法关闭的异常:[异常.“组件返回的失败代码: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) nsIXPCComponents_Utils.import”ns结果:"0x80070057 (NS_ERROR_ILLEGAL_VALUE)“位置:"JS框架::资源://gre/modules/addons/xpiProvider.jsm -> nsIXPCComponents_Utils.import ::shutdown ::第21行”数据: no]堆栈跟踪: shutdown()@resource://gre/modules/addons/XPIProvider.jsm -> file:///test< 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 <卸载()@extensions.xml:1541

chrome.manifest指令在bootstrap.js中还不可用吗?还是我在尝试某种违反安全的行为?还是我只是做了些微不足道的错事?

我希望实现的是,我可以做以下的事情:

chrome/content/modules/Test.jsm

代码语言:javascript
复制
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

代码语言:javascript
复制
const Cu = Components.utils;
Cu.import( 'chrome://test/modules/Test.jsm' );
Test.bootstrap( this );

也许它一开始就有点过头了,但我只是有点喜欢将实现隐藏在模块和/或对象中并保持bootstrap.js超级干净的想法。

如果你碰巧对如何通过其他方法实现这一目标有建议的话:我会全神贯注。

EN

回答 2

Stack Overflow用户

发布于 2014-08-28 14:52:38

是的,你可以走错路了。

就这么做吧:

代码语言:javascript
复制
let test = Cu.import( 'chrome://test/content/modules/Test.jsm', {} ).Test;

注意/content/

您不需要执行.Test,除非您希望小写的test保持它。你可以这样做:

代码语言:javascript
复制
Cu.import( 'chrome://test/content/modules/Test.jsm');

并将其用作Test.blah,其中blah是JSM模块中的任何内容。

这段代码可以去任何地方,它不需要在install函数中。

确保卸载自定义的JSM模块,否则会导致僵尸分区,这对内存有害。请在此阅读:

票数 2
EN

Stack Overflow用户

发布于 2014-08-28 15:08:53

除了@Noitidart的回答之外,如果您唯一关心的是如何导入模块,则不必使用chrome.manifest‘注册内容包。

代码语言:javascript
复制
function install(data, reason) {
  Components.utils.import(data.resourceURI.spec + "relative/path/to/your/module.jsm");

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25549173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档