我正在尝试熟悉 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 注册可能尚未完成,或者问题出在其他地方?
最佳答案
注意以下是我的经验,可能并不明确
引导插件的 bootstrap.js 在浏览器启动时且在创建任何 WINDOW 或 DOM 之前运行。
bootstrap.js也有执行的顺序和特定的格式。
上面的例子是你的 bootstrap.js 的方式吗?
您可以在任何地方导入 Firefox 模块(尽管我总是在顶部这样做)。
最好在functionstartup(data,reason)中执行
Components.utils.import('chrome://my-ext/content/foo.jsm');
{ ... }
附加说明/建议:
通常,我会在函数外部分配var提示
,这样每次运行函数时就不会重新分配它。
我还会使用 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()
它们。
关于javascript - Firefox 引导扩展,导入顶级时的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28312869/