Hatena::Groupmoz-addon

hogezilla RSSフィード

当ページに書かれているコードは、修正BSDライセンスのもと、再頒布して頂いて構いません。

 | 

2011-12-03

teramako20111203

動的なchromeURLの追加

| 19:19 | はてなブックマーク - 動的なchromeURLの追加 - hogezilla

再起動不要なアドオンで chrome.manifest ファイルを動的に読み込めるようになりました。これによって、再起動不要なアドオンへ簡単にクロームを追加できるようになりました。

Firefox 10 のアドオン互換性に関わる修正のまとめ ≪ Mozilla Developer Street (modest)

これはすばらしい。

Firefox 10からみたいだが、現行リリースバージョンのFirefox 8.0にも存在している(バグがあるのかもしれないが・・・)

試してみる

Bootstrapped な拡張を作るのは面倒だったので、VimperatorからコマンドでJavaScriptを実行してやってみた。

mkdir -p ~/vimperator/vimpchrome/{content,skin,locale/{en-US,ja},modules}
cat <<EOM > ~/vimperator/vimpchrome/chrome.manifest
content vimpchrome content/
locale  vimpchrome en-US locale/en-US/
locale  vimpchrome ja    locale/ja/
skin    vimpchrome classic/1.0 skin/
resource vimpchrome modules/

overlay chrome://browser/content/browser.xul chrome://vimpchrome/content/overlay.xul

component {cbbf0808-edb0-4ab9-aa4f-5c5df39e131c} components/protocols.js
contract @mozilla.org/network/protocol;1?name=chrome-data {cbbf0808-edb0-4ab9-aa4f-5c5df39e131c}
EOM

まずテキトウにディレクトリを作り、chrome.manifestを作る

ディレクトリ構造は以下のような感じ

~/vimperator/vimpchrome/
├─content
├─locale
│  ├─en-US
│  └─ja
├─modules
└─skin

ディレクトリ構造を作ったら、幾つかファイルを置いてみて、Components.manager.addBootstrappedManifestLocation()を実行する。

Components.manager.addBootstrappedManifestLocationはは引数にnsIFileを取り、chrome.manifestのあるフォルダを指定すれば良い。直下にchrome.manifestがあればxpiファイルでもOKだった。

:js Components.manager.addBootstrappedManifestLocation(io.File("~/vimperator/vimpchrome"))

これは引数をchrome特権で実行できるjsコマンドを実行している。io.File(path)はVimperatorのユーティリティ関数でpathをnsIFile化して返すものである。

やってみると、以下の警告がエラーコンソールに挙がった。

Warning: Bootstrapped manifest not allowed to use 'resource' directive.
Source File: C:\home\teramako\MyDocuments\vimperator\vimpchrome\chrome.manifest
Line: 5

Warning: Bootstrapped manifest not allowed to use 'overlay' directive.
Source File: C:\home\teramako\MyDocuments\vimperator\vimpchrome\chrome.manifest
Line: 7

Warning: Bootstrapped manifest not allowed to use 'component' directive.
Source File: C:\home\teramako\MyDocuments\vimperator\vimpchrome\chrome.manifest
Line: 9

Warning: Bootstrapped manifest not allowed to use 'contract' directive.
Source File: C:\home\teramako\MyDocuments\vimperator\vimpchrome\chrome.manifest
Line: 10

どうやら、使えるのは以下3つくらいのようだ。

  • content
  • locale
  • skin

実際に、chrome://vimpchrome/content/test.xul等にきちんとアクセスできるし、localeも、現行ロケールの方にアクセスされた。

特にBootstrappedExtensionではURLがfileURLしかなく、面倒であったが、これを使えばURLを一意に定めることができてかなり楽になる。about:addonのオプションダイアログ等の問題解決のために前回書いた擬似Chrome URLのプロトコルハンドラーを作成してXULを開けるようにするなんてことはせずに済む。

しかし、Ci.nsIResProtocolHandlerを使用すれば不可能ではないが、コードモジュール置き場としてのresourceを定められないのは非常に残念ではある。

ローカライズlocaleを定めればOKだし、このComponents.manager.addBootstrappedManifestLocation()は革命的にBootstrappedExtensionを作成しやすくするだろう。

 |