2014年12月26日金曜日

Firefoxの通信を監視するアドオンを作る


開発ツールのインストール

基本的には、tarファイルをダウンロードして、展開するだけ完了です。
展開したディレクトリの中にあるbinディレクトリにパスを通すと更によいでしょう。

詳しくは、次のページを参照してください。
https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Installation
アドオンのプロジェクトの作成

プロジェクトのディレクトを適当な場所に作成して、その直下で次のコマンドを実行します。

cfx init

すると、ディレクトリやファイルが作成されます。
その中のlibディレクトリの中のmain.jsにプログラムを記述します。

アドオンのテスト

main.jsを作成したら、次のコマンドで簡単にテストすることができます。

cfx run

作成したアドオンが一時的にインストールされた状態で、Firefoxが立ち上がります。

アドオンのパッケージング

Firefoxにアドオンをインストールするには、パッケージングする必要があります。
次のコマンドで、xpiファイルを作成することができます。

cfx xpi

アドオンのインストール

アドオンを公開せずに、XPIファイルをFirefoxにインストールするには、Firefoxのアドオン画面で次のようにします。

ツール > アドオン > 「設定」アイコン > ファイルからアドオンをインストール

通信を監視するプログラム

次のコードは、Firefoxが生成した全てのHTTPリクエストの接続先URLをコンソールに出力します。

10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
// lib/main.js

// クラスを作成するライブラリをインポートする
var { Class } = require('sdk/core/heritage');

// 基本的なクラスUnknownをインポートする
// Unknownクラスは、nsISupportsインターフェースを実装してる。
var { Unknown } = require('sdk/platform/xpcom');

// XPCOMライブラリをインポートする。
// CCは、Components.classの別名。
// Ciは、Components.interfacesの別名。
// 詳しくは、https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Chrome_Authorityを参照。
var { Cc, Ci } = require('chrome')

// いろんなものを監視するライブラリobserver serviceを取得する。
// observer serviceのaddObserverメソッドで監視内容を設定する。
var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);

// StarObserverクラスを定義
// observer serviceのaddObserverメソッドは、第一引数にnsIObserverインターフェースを指定する必要があるため、
// StarObserverは、nsIObserverインターフェースを実装する。
// nsIObserverのobserveメソッドを実装しなければならない。
var StarObserver = Class({
  extends:  Unknown, // Unknownクラスを継承する。
  interfaces: [ 'nsIObserver' ]// nsIObserverインターフェースを実装する。
  // どんな情報を監視するか指定する。
  // この値は、addObserverメソッドの第二引数に渡される。
  // 他の指定できるtopicは、https://developer.mozilla.org/ja/docs/Observer_Notificationsを参照。
  topic: 'http-on-modify-request'
  register: function register() {
    observerService.addObserver(this, this.topic, false);
  },
  unregister: function() {
    observerService.removeObserver(this, this.topic);
  },
  // addObserverメソッドに渡されるコールバック関数。
  // このコールバック関数の引数には、nsIHttpChannelのインスタンスが渡される。
  // nsIHttpChannelでリクエストの情報の取得やキャンセルなどができる。
  observe: function observe(subject, topic, data) {
    // キャスト的なことをする。
    // これをしないと、nsIHttpChannelのメソッドが使えない。
    subject.QueryInterface(Ci.nsIHttpChannel);
    // URLを取得する。
    var url = subject.URI.spec;
    // コンソールにURLを取得する。
    console.log('star observer:', url);
  }
});

var starobserver = StarObserver();
starobserver.register()// nsIObserverを登録する。