我正在努力让自己熟悉Firefox引导附加组件。请考虑以下示例:
// bootstrap.js
'use strict'
function alert(message) {
var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
prompts.alert(null, "from my extension", message);
}
try {
Components.utils.import('chrome://my-ext/content/foo.jsm');
alert('ok');
} catch(e) {
alert(e);
}
而chrome://my-ext/content/foo.jsm
只是this.EXPORTED_SYMBOLS = [];
。
上述代码示例的问题是每次都不起作用。它可能会失败NS_ERROR_FILE_NOT_FOUND
而不是导入,或者可能会说OK - 尽管事后稍后,当浏览器启动时,我可以通过位置栏访问foo.jsm
。
这是否意味着我不应该在顶层导入任何内容,因为chrome注册可能尚未完成,或者问题出在其他地方?
答案 0 :(得分:0)
N.B。以下是我的经验,可能不确定
浏览器启动时以及在创建任何WINDOW或DOM之前运行bootstrap的插件的bootstrap.js。
bootstrap.js还有一个订单和特定的执行格式。
以上示例是您的bootstrap.js的方式吗?
您可以在任何地方导入Firefox模块(尽管我总是这样做)。
最好在Components.utils.import('chrome://my-ext/content/foo.jsm');
function startup(data, reason) { ... }
补充说明/建议:
通常,我会在函数外部指定var prompts
,以便每次运行函数时都不会重新分配它。
我也会使用Services.jsm
来方便使用(但它没有任何区别),例如:
Components.utils.import('resource://gre/modules/Services.jsm');
// then anywhere in the code
Services.prompt.alert(null, title, text);
习惯上,我在JS / JSM上执行所有 Firefox内置模块导入Components.utils.import()
Firefox内置模块(不是插件的模块)由Firefox缓存,无需Components.utils.unload()
。