Firefox拡張とGoogleChrome, Opera拡張

oh...Firefoxが拡張の始まりではなく、ActiveX導入時点で拡張できたという指摘が。たしかにそのとおりです。
Firefoxを始め、多くのブラウザが拡張機能により便利機能を付加できるようになった。

Firefoxが始まりではあるが、実のところこれは偶然の産物──サイドバーあたりを拡張できるように作ったけど、これ、いろんなところに応用できるんじゃね?みたいな──らしい(当時のことは僕は詳しくないが...)。

まあ偶然の産物であるかどうはともかく、これが大ヒット。他のブラウザも拡張機能をサポートし始めるようになる...のだが、そのアーキテクチャや方向性が全く異なるものだ。

そんな話をつらつらと書いてみたい。

Firefox拡張機能アーキテクチャ

まずはFirefox拡張機能とはどんなものかを書こう。

と、その前にMozilla系アプリケーションについて話さなければならないだろう。FirefoxThunderbirdもあるランタイム上で動作するようになっている。実際に配布されるソフトとしては融合しているが、分離するならば、そのランタイムはXULRunnerと呼ばれるものになる。

via:Schrep's Blog » Blog Archives » Mozilla Platform

上図のThe Mozilla Platformとなっている部分がほぼXULRunnerが備えている。XULRunnerは名前のとおり、XMLでUIを作成できるXULと呼ばれるものを動かすものだ。
FirefoxThunderbirdGUIXULで作られている。

XULRunnerのフレームワークを使ってFirefoxThunderbirdは構成されている。そして、このXULRunnerの部分で拡張する機能が備わっている。

Firefox,ThunderbirdはXULRunner上に積みあがるアーキテクチャとなるが、Firefox,Thunderbirdと同列の存在としてXULRunner上に積みあがることになる。つまり、Firefox,Thunderbirdでできることは、その拡張機能でもできることであり、そこに制限はない。

また、Firefox,Thunderbird用に拡張を行えるものではなく、より一般的にアプリケーションに対して拡張を行うものなので、FirefoxならブラウジングThunderbirdならメール関連に特化した機能は無い。(もちろんFirefoxなどが用意した関数を使用することは可能だが、拡張機能が使うことを念頭の置いていない場合があるので注意が必要だったりする)

Firefox,Thunderbirdやその他、Mozillaプラットフォームで動作するソフトの拡張機能はこんな感じになっている。

GoogleChrome拡張機能

次に拡張機能をサポートし始めたのはGoogleChrome(というかChromium)だろう。
この辺りは真偽が怪しい。間違いがあったら、コメント等を書いていただけると僕も勉強になります。

Chromeを作った人はMozillaの成功と課題を知っており(そりゃそうだ、Chromeを開発したのは元MozillaFirefox開発に携わっていたのだから)、その問題を解決させた。

Mozillaアーキテクチャ拡張機能の問題点:

  • 何でもできすぎる
  • XULという特殊な言語などを使うなど、作成が難しい
  • 拡張側の問題をアプリケーションがそのまま受け継いでしまう
    • 拡張機能の問題でプロセスがクラッシュすると、それはFirefox自体がクラッシュすることとなる

これらを

  • 用意したAPI経由限定にして、できることを絞る
  • HTML、JavaScriptでとWeb開発者をターゲットにWeb開発で使える技術をそのまま使えるように
  • それぞれの拡張機能用のプロセスを立ち上げると共に拡張機能サンドボックスに閉じ込める

というようなことをしたわけだ。

使用できるAPIを限定したことでUIを変更するようなことはほとんどできなくなった。
その代わり、開いているコンテンツへのアクセス性は良くなっていて拡張機能のパッケージを定めるファイル(manifest.json)レベルでどのURL上でスクリプトを動かすかなどを定めることができるようになっている。

Opera拡張機能

Operaも同様に多少作り方は違うが、Chromeと似たり寄ったりな感じだ。
ChromeよりもAPIは少ない印象で、その分できることも限られる。UserScriptの延長線上にある感じ。
特殊なイベントを取得できたりするので好きだけどね。

Firefoxとその他Chromeなどの拡張機能

Chrome登場まであまり意識することはなかったが、同じ拡張機能という名前であってもFirefoxとそれ以外とでは全然異なるものだ。

例えば、特定のページでスクリプトを動かしたいと思った時。

Firefoxでは
  1. Firefoxウィンドウ上で動くスクリプトからブラウザ要素(Firefoxではコンテンツを表示する部分もbrowserというXUL要素(iframeの様なもの))からイベント的なものを取得
  2. URLが合致すれば、そのコンテンツにスクリプトを流す

と2段階必要だった。まあ単純にこういうことをしたいのであれば、GreasemonkeyやScriptishなどのUserScript管理アドオンを使うのが普通だが。

Chromeでは
  1. manifest.jsonに定義情報を書く
Operaでは
  1. UserScript的に@include ....を書いて、includesディレクトリの放り込む

だけである。この点ではChromeOperaが断然有利だ。

まとめ

  • Firefox拡張機能Firefoxというアプリケーション自身を拡張するもの
    • 拡張機能の機構としてはWebに特化したものではない
  • ChromeOpera拡張機能はそのアプリケーションそのものではなく、Webコンテンツを拡張しやすくできている。
    • Webに特化
    • その代わり、アプリケーションとしての拡張性はほぼ皆無

そんなわけで、Webページをどうこうしたいという拡張機能であれば、ChromeOperaが圧倒的に楽なわけで、特定Webサービスに対する拡張機能なんかはChromeとかの方が即出たりする。そりゃー、ブラウザでWebサービスを使いたい人にとってはChromeの方が便利だわね。「お前ら、Chrome使え。捗るぞ。」ってなもんですよ。

ただ、Webコンテンツというよりアプリケーションとして、カスタマイズしたいとか使い勝手を良くしたいという人にとってはMozilla系アプリケーション一択だろう。

Chrome好き、Firefox好きの主張は平行線を辿るわけだよ。やりたいことが違うんだもの。

等々、2chFirefoxスレとかChromeスレを見ながら思った。