次を使用して、再起動なしのアドオンにカスタムモジュールをロードしようとしています:
chrome/content/modules/Test.jsm :
var EXPORTED_SYMBOLS = [ 'Test' ];
let Test = {};
chrome.manifest :
content test chrome/content/
ブートストラップ.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 Exception running Bootstrap method shutdown on test@extensions.codifier.nl: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXPCComponents_Utils.import]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS フレーム :: resource://gre/modules/addons/XPIProvider.jsm -> file:///test/bootstrap.js :: shutdown :: line 21" data: no] スタック トレース: shutdown()@resource ://gre/modules/addons/XPIProvider.jsm -> file:///test/bootstrap.js:21 < XPI_callBootstrapMethod()@resource://gre/modules/addons/XPIProvider.jsm:4232 < XPI_updateAddonDisabledState() @resource://gre/modules/addons/XPIProvider.jsm:4347 < AddonWrapper_userDisabledSetter()@resource://gre/modules/addons/XPIProvider.jsm:6647 <uninstall()@extensions.xml:1541 < oncommand()@about:addons:1 <
chrome.manifest
でディレクティブはまだ使用できませんbootstrap.js
か? それとも、ある種のセキュリティ違反を試みているのでしょうか? それとも、私は単に些細なことをしているのですか?
私が達成したいと思っていたのは、次のようなことができるということです。
chrome/content/modules/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
非常にクリーンに保つというアイデアが好きです。
他の手段でこれを達成する方法について提案がある場合: 私はすべて耳にします。