2014-08-28 38 views
2

我試圖加載自定義模塊在無需重啓插件,使用下列內容:我可以在無重啓加載項的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:sh​​utdown()@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

如果您碰巧對如何通過其他方式實現此目標有所建議:我全都是耳朵。

回答

2

是的,你可以你的路徑是錯誤的。

只是這樣做:

let test = Cu.import('chrome://test/content/modules/Test.jsm', {}).Test; 

通知/content/

你不必做.Test除非你想小寫test持有它。你可以這樣做:

Cu.import('chrome://test/content/modules/Test.jsm'); 

,並在那裏胡說是無論是JSM模塊作爲Test.blah使用。

此代碼可以去任何地方,它不必在install函數中。

請務必卸載自定義JSM模塊,否則會導致出現內存不佳的殭屍隔離區。在這裏閱讀:

+0

謝謝你的回答Noitidart!我將在稍後嘗試,但我相信它的工作原理。但是請幫助我理解,如果您願意:爲什麼在這裏需要/ /** content **/modules,而當我在非重啓版本中使用'resource://'命名空間時,實例。 (不幸的是,在引導加載項中不允許使用資源,因爲您可能已經知道了)。我的意思是,不是指令'content test chrome/content /'中已經定義的目錄'content'?爲什麼我仍然需要將其添加到網址中?我在哪裏可以找到更多關於這種機制的信息? – Codifier 2014-08-28 15:44:20

+0

PS:我已經意識到可能的內存泄漏。但是,無論如何,謝謝你的提醒! – Codifier 2014-08-28 15:45:57

+0

這只是如何chrome.manifest東西的作品,他們這樣做:) – Noitidart 2014-08-28 17:22:35

1

超越@ Noitidart的答案,你不必使用chrome.manifest用於」和登記內容包如果你唯一擔心的是如何導入你的模塊。

function install(data, reason) { 
    Components.utils.import(data.resourceURI.spec + "relative/path/to/your/module.jsm"); 

} 
+0

要做到這一點,確保它在'安裝'或'啓動「功能,它們都有'data'這個第一個參數(關閉和卸載也是如此,但是對於卸載模塊更重要)。或者,如果您想在安裝函數外執行此操作,請將global var或somethign設置爲'data' arg of install。看到這裏的數據對象包含什麼:https://gist.github.com/Noitidart/9025999#comment-1120821 – Noitidart 2014-08-28 15:16:57

+0

啊,這是很好的知道。謝謝。但我更喜歡現在可以在功能之外使用的解決方案。 – Codifier 2014-08-28 15:48:18

+0

你不會碰巧知道在全球範圍內完成這項工作的方法嗎? (可能不會,因爲在函數中只有'resourceURI.spec'可用),但請參閱我的問題編輯,以瞭解我希望實現的內容。也許你有更多的想法。謝謝。 – Codifier 2014-08-28 18:11:21

相關問題