2

次を使用して、再起動なしのアドオンにカスタムモジュールをロードしようとしています:

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非常にクリーンに保つというアイデアが好きです。

他の手段でこれを達成する方法について提案がある場合: 私はすべて耳にします。

4

2 に答える 2

2

はい、パスが間違っている可能性があります。

これを行うだけです:

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

に注意してください/content/

.Test小文字で保持したい場合を除き、 を実行する必要はありませんtest。あなたはただ行うことができます:

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

Test.blahblah は JSM モジュールにあるものとして使用します。

このコードはどこにでも置くことができ、install関数内にある必要はありません。

カスタム JSM モジュールを必ずアンロードしてください。そうしないと、メモリに悪影響を与えるゾンビ コンパートメントが発生する可能性があります。ここを読む:

于 2014-08-28T14:52:38.690 に答える
1

@Noitidart の回答を超えて、モジュールをインポートする方法だけが問題である場合は、chrome.manifest を使用してコンテンツ パッケージを登録する必要はありません。

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

}
于 2014-08-28T15:08:53.030 に答える