我試圖加載自定義模塊在無需重啓插件,使用下列內容:我可以在無重啓加載項的bootstrap.js中加載自定義jsm模塊嗎?
鉻/內容/模塊/ Test.jsm:
var EXPORTED_SYMBOLS = [ 'Test' ];
let Test = {};
chrome.manifest用於 :
content test chrome/content/
bootstrap.js:
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;
}
不過,我得到以下類型的WARN消息(這一次是爲了shutdown()
,但對於所有的功能基本相同,並在全球範圍內較早嘗試):
1409229174591 addons.xpi WARN異常運行的自舉方法上[email protected] 關機:[異常... 「元器件 返回失敗代碼:80070057(NS_ERROR_ILLEGAL_VALUE) [nsIXPCComponents_Utils.import]」 nsresult: 「80070057 (NS_ERROR_ILLEGAL_VALUE)」 位置: 「JS frame :: resource:// gre/modules/addons/XPIProvider.jsm - > file:///test/bootstrap.js :: shutdown :: line 21「data:no] Stack trace:shutdown()@resource:// gre/modules/addons/XPIProvider.jsm - > 文件:///test/bootstrap.js:21 < XPI_callBootstrapMethod()@resource://gre/modules/addons/XPIProvider.jsm:4232 < XPI_updateAddonDisabledState()@resource:// GRE /模塊/插件/ XPIProvider.jsm:4347 < AddonWrapper_userDisabledSetter()@resource://gre/modules/addons/XPIProvider.jsm:6647 <卸載()@ extensions.xml:1541 <按需()@約:插件:1 <
是chrome.manifest
指令尚未在bootstrap.js
?或者是我正在嘗試某種安全違規行爲,或許?或者我只是做一些微不足道的事情?
我希望實現的,是我可以做類似如下:
鉻/內容/模塊/ Test.jsm:
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;
}
}
引導。 js:
const Cu = Components.utils;
Cu.import('chrome://test/modules/Test.jsm');
Test.bootstrap(this);
也許它有點過頭了,但我有點像在模塊和/或對象中隱藏實現的想法,並保持超級清潔bootstrap.js
。
如果您碰巧對如何通過其他方式實現此目標有所建議:我全都是耳朵。
謝謝你的回答Noitidart!我將在稍後嘗試,但我相信它的工作原理。但是請幫助我理解,如果您願意:爲什麼在這裏需要//** content **/modules,而當我在非重啓版本中使用'resource://'命名空間時,實例。 (不幸的是,在引導加載項中不允許使用資源,因爲您可能已經知道了)。我的意思是,不是指令'content test chrome/content /'中已經定義的目錄'content'?爲什麼我仍然需要將其添加到網址中?我在哪裏可以找到更多關於這種機制的信息? –
Codifier
2014-08-28 15:44:20
PS:我已經意識到可能的內存泄漏。但是,無論如何,謝謝你的提醒! – Codifier 2014-08-28 15:45:57
這只是如何chrome.manifest東西的作品,他們這樣做:) – Noitidart 2014-08-28 17:22:35