Firefox拡張(add-on)をハックする環境を作る

Tomblooハックしてみようと思い立ったので、ついでにFirefox拡張のハック方法というかそのハックできる状態にする方法をエントリにしてみる。

まずハックするためにはソースがあって、それを即実行環境に反映されるような状態にしておく必要がある。(修正→ビルドってしてもいいんだけど、それだと開発効率がすごく落ちるので...)

で、その方法として以下の手段がある。

  • インストール済みのjarファイルをjarunzipで展開してソースを得る方法
  • 公開リポジトリからソースを取得し、適当な作業用ディレクトリに配置した後、firefoxにそれを拡張として認識させる方法。

今回は後者でやってみた。

リポジトリからのソースの取得

TomblooリポジトリGitHubで公開されている。
そのページにアクセスすると、"clone url"が書かれているので、
http://gyazo.com/c53aea23942b6ab6828f6acd5edcfbdf.png

これを元にローカルにリポジトリのクローンを作成する。

$ git clone git://github.com/to/tombloo.git

そうすると、カレントディレクトリの配下にtomblooという作業用のディレクトリが作成され各種ソースの作業コピーが展開される。

これでソースの取得完了

chrome.manifestの用意

Firefoxが機能拡張を認識して読み込むためには、chrome.manifestが必要。たいてい、リポジトリからソースをとってきたときに既に存在するはずなので、それを使えばいい。
今回の場合は、chrome.manifest.original というファイルがあったので、これをそのまま chrome.manifest という名前でコピーしてあげた。

chrome.manifestの内容については、ソースがjarで圧縮されている場合とそうでない場合で記述方法が多少異なるが、ここでは割愛。

Firefox拡張の格納ディレクトリから作業用ディレクトリへリンクさせる

Firefoxが機能拡張を実行環境に読み込む仕組みはおおよそ以下のようになっている。

  • (プロファイルディレクトリ)/extension 配下のディレクトリを操作して、各ディレクトリの install.rdf, chrome.manifest を元に機能拡張を読み込む
  • (プロファイルディレクトリ)/extension 配下にテキストファイルがあった場合、そのファイルに記述されているパスを機能拡張の格納先と認識する。
  • そのテキストファイルに記述されているパスに格納されている install.rdf, chrome.manifest を元に機能拡張を読みこむ

今回の例では、本来の機能拡張のソースが格納されるべきディレクト~/Library/Application Support/Firefox/Profiles/xxxxxx/extensions にテキストファイルtombloo@brasil.toを作成、その中身は作業用ディレクトリである /Users/snaka/work/github/tombloo/xpiとした。

Unix系OSだと以下のコマンドで簡単に作成できる。(この方法だとshellによるディレクトリ名の補完が効くのでタイプミスが無いのでおすすめ)

$ echo /Users/snaka/work/github/tombloo/xpi > tombloo@btasil.to

Firefoxを起動(再起動)して機能拡張がインストールされたことを確認

機能拡張を読み込むのはFirefoxの起動時なので、既にFirefoxが起動されているばあいは一旦終了して再起動してあげる必要がある。Firefoxを起動した後、アドオンの画面を確認、そこに該当機能拡張がリストアップされていればインストール完了。
http://gyazo.com/17c5668a2aae12af00709984dbd6e6cd.png

これで、作業用ディレクトリのソースを読み込んだ状態でFirefoxが起動したことになる。この後は、作業用ディレクトリのソースを好きなようにイジって、どのように動きが変わるか試しつつ、ハックすればよい。

訂正と追記:2009.6.21

「ソースを取得する方法としてxpiをunzipで展開する」というのは誤り。ここで書きたかったのは、インストール済みの拡張のフォルダにあるほげほげ.jarjarコマンドやunzipコマンドで展開してソースを得るという方法だった。
ついでにその手順も書いとく。extensionsディレクトリ配下の拡張のディレクトリに hoge.jar ファイルがあるとする。

jarの展開
$ jar xvf hoge.jar

これでその拡張のソースが得られる
jar形式のファイルはzipファイルと互換があるので unzipコマンドとかzipが展開できるGUIツールでも可

chrome.manifestの修正

jarファイルを展開すると、元のjarファイルと展開されたディレクトリの関係は以下のような感じになると思われる。(展開されるディレクトリの構造はある程度は決まっているが、それぞれの拡張によってまちまち)

 chrome/
   hoge.jar 
   content/
     hoge.xul
     hoge.js
   locale/
     ja-JP

該当拡張をインストールした時点はjarファイルに全てが格納されていたので、chrome.manifestもjarファイルの内容を参照するような記述になっている。以下のような感じで

content hoge jar:chrome/hoge.jar!/content/

これを修正して"hoge.jar!/"を取り除くことで、ファイルを展開した実ディレクトリの方を参照するように変更する

content hoge jar:chrome/content/
Firefoxの再起動

上記のように変更した後、Firefoxを再起動してアドオンが以前通りFirefoxに認識され、正常に動作していれば準備完了。

参考

以前TwitterFoxという拡張をハックしたときのエントリもあるので、こちらも参考に..