2012-03-21 25 views
1

私はFirefox C++エクステンション初心者です。私は、ページの読み込み中に、私の拡張モジュール内のDOM変異イベントにアクセスする必要があります。デフォルトでFirefoxは、ページの読み込み中にDOMの突然変異イベントを送信しないため、ページの読み込みのパフォーマンスが向上します。Firefox拡張機能とnsIMutationObserver

私はその理由を理解していますが、その結果を理解するためには、私はまだDOM変異イベントにアクセスする必要があります。私は、nsIMutationObserverがまだページの読み込み中に呼び出されることを読んでいます(リスナーを探しているDOMツリーを歩く必要がないので、DOMの突然変異イベントは少し効率的です)。しかし、ネイティブコードでのみ利用できます。

だから私は、質問を次ています

  1. は、Firefoxの拡張機能が利用できるnsIMutationObserverとnsIMutationObserver2ですか?
  2. はいの場合、C++で簡単なFirefox拡張機能を使って、その機能にアクセスしてJavascriptに公開するにはどうすればよいですか?
  3. C++土地からJSへのフォワーディングを行う既存のエクステンションを私が指し示すことができるなら、それは高く評価されます。
  4. JS-CTypesを使用して、Javascriptベースの拡張機能からその機能にアクセスできますか?

私はFirefoxの拡張フォーラムでこの質問をしましたが、回答はありません。事前に

おかげ

答えて

1

nsIMutationObserverとnsIMutationObserver2は、Firefoxの拡張機能を利用できますか?

はい、バイナリのFirefox拡張機能で使用できます。もちろん、欠点はバイナリXPCOMコンポーネントが1つのFirefoxリリースでしか動作しないことです。新しいリリースごとに再コンパイルする必要があります。

はいの場合は、C++でFirefoxにアクセスしてJavaScriptに公開するにはどうすればよいですか?

あなたはXPCOMコンポーネントを作成します(example codeを参照)、nsIMutationObserver interfaceを実装します。次に、このようなドキュメントにこの変異オブザーバを添付:

NS_IMETHODIMP 
MyMutationObserver::AttachToDocument(nsIDOMDocument* document) 
{ 
    nsCOMPtr<nsINode> node(do_QueryInterface(document)); 
    node->AddMutationObserver(this); 
} 

参考のために:nsINode interface

人々はJSにC++の土地からこの転送を行い、既存の内線に私を指すことができれば、それはなります高く評価。

申し訳ありませんが、わかりません。しかし、あなたのXPCOMコンポーネントは、あなたのJavaScriptコードが使用する追加のインターフェイスを公開することができます。コールバックを登録する。突然変異観測者が呼び出されたときにJavaScriptを実行することは安全ではないかもしれないと考える必要があります。重要な方法はnsContentUtils::IsSafeToRunScript()nsContentUtils::AddScriptRunner()です(nsContentUtils.h参照)。

JS-CTypesを使用して、Javascriptベースの拡張機能からその機能にアクセスできますか?

いいえ、できません。これらはGecko内部であり、js-ctypesにはさらされていません。

1

nsIMutationObserverを使用することができますが、それは(インタフェース宣言上の大きな警告を参照)、それが通知されるとき、それが何をするかについて非常に非常に慎重でない限り、それがクラッシュして、様々な他の壊れた動作を引き起こすとする可能性がありますバイナリ拡張子セキュリティバグを導入する。他の内部APIと同様、これはフットガンです。非常に慎重に使用されないと、おそらく致命的なものになります。 DOMの突然変異リスナーでうまくいくことは、nsIMutationObserverではOKではありません。