javascript - Firefox 引导扩展,导入顶级时的竞争条件?

标签 javascript firefox firefox-addon race-condition

我正在尝试熟悉 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/

相关文章:

javascript - firefox (9), javascript, 由于大数据文件导致分配大小溢出。有没有办法避免这种情况?

javascript - 浏览器 - 文件编写器扩展?

javascript - 从 Firefox 浏览器扩展触发事件?

javascript - 创建新的 Date 实例时的奇怪行为

javascript - 使用 jQuery 或 jQTouch 的幻灯片转换脚本

javascript - 过滤器 :blur() working in Chrome but not Firefox

javascript - 如何在 Firefox 开发者工具 Web 控制台中测试复制粘贴?

javascript - 在浏览器宽度调整大小时更改 li 高度

javascript - RxJS如何创建或模拟异步?

javascript - window.postmessage - event.data 始终为空