2013年4月14日

xpcshell で chrome:// な URI を使う

ようやくユニットテストを作り始めた私です。

さて、UnMHT のコードの中には chrome://unmht/... な URI を使える事を前提としたコードがいくつかあります。例えば StringBundle のあたりとか。
で、これをコマンドラインからテストしたい、となった時に例のごとく xpcshell を使うワケですが、当然アドオンとして動いてないので chrome://unmht/... みたいに書いても例外投げられて終わっちゃう。

chrome のプロトコルハンドラを上書きするとか色々考えたけど、どうにもうまく行かなくて困っていたのですが、ふと bootstrapped extension のコードの中で chrome.manifest を動的に登録する部分があったように思って調べたワケです。

// dir は chrome.manifest があるディレクトリ
Components.manager.addBootstrappedManifestLocation (dir);

ユニットテストは tests ディレクトリの中にあるので、テスト用の chrome.manifest には以下のように最低限のモノだけ書いておきます。

content unmht     ../chrome/content/
locale  unmht en-US ../chrome/locale/en-US/

これで chrome://unmht/... みたいに書いて普通に使えるようになります。

ちなみに resource:// な URI はアドオンと同じ手順で登録できます。

// uri はベースになるディレクトリの URI
Services.io.getProtocolHandler ("resource")
  .QueryInterface (Ci.nsIResProtocolHandler)
  .setSubstitution ("unmht", uri);

っていうか chrome.manifest でパスを上に辿れるなんて思わなかった……

0 件のコメント:

コメントを投稿