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

时间:2015-02-04 03:09:51

标签: 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注册可能尚未完成,或者问题出在其他地方?

1 个答案:

答案 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()