Firefoxはソース・コードを書き換えて再コンパイルしなくても,機能を変更したり拡張したりできるように設計されている。このような機能変更・拡張用のモジュールを「拡張機能」と呼ぶ。拡張機能を使えば,FirefoxのGUIを変更するだけでなく,タブ機能を強化する,翻訳ソフトと連携する,例えばamazon.comを自由に閲覧する,などの高度な機能を追加できる。

 Firefox以外のWebブラウザなどでも利用される「プラグイン」は一見すると拡張機能に似ている。例えば,PDFファイルを表示し,Flashファイルを再生できるからだ。しかし,プラグインには限界がある。プラグインにできることは,Webブラウザと通信し,データ処理を肩代わりするだけだ。一方,Firefoxの拡張機能は,本体プログラムに動的に組み込まれるパッチと捉えられる。拡張機能自体では動作せず,Firefoxの内部のコードに追加したり,置き換えたりできる。拡張機能はFirefoxのコード内部にまで自由にアクセスできるため,プラグインと比較して広範囲な機能連携が可能である。

 Firefoxは,本来拡張機能を利用しやすいように設計されている。Firefoxは大きく分けて4つの技術からなる。一つは,「XML User interface Language(XUL,ズール)」。XULはAjaxのHTMLに相当する。XULと連携するのが,「CSS(Cascading Style Sheets)」と「JavaScript」だ。最後に,JavaScriptでは実行できない処理を「XPCOM」が担う。XPCOMはMozillaアプリケーションで利用されるコンポーネント・モデルだ。

 以上の4つの技術は,XPCOMを除きいずれも,コンパイルせずに利用できるインタープリタ型の言語で構成されている。つまり,コンパイルされたプログラムに比べて容易に「パッチ」を作成できる。

 さらに,それぞれの言語仕様の中に,「動的なパッチ」として使えるような機能をあらかじめ備えていることが,パッチ作成を簡単にしている。

 例えば,XULは「オーバーレイ」機能を備える。XML自体が,あるXMLドキュメントの中に別のXMLドキュメント片を埋め込む「XInclude」という技術を利用できる。XULのオーバーレイはXIncludeと似たX独自の仕様に則って動く。このため,パーツごとに分割されたXULドキュメント同士を統合して1つのXULドキュメントとして扱える。

 CSSには,複数のシート間での指定の競合を解決して最終的なスタイル指定を導く「カスケーディング」という仕組みを持つ。JavaScriptは,ほとんどのデータをオブジェクトとその属性であるプロパティという形で表現し,基本的にほとんどのプロパティは自由に置き換えられる。

 従って,XUL,CSS,JavaScriptの仕様に則ったコードを記述し,Firefoxに渡すことができれば,Firefoxの機能を変更,追加できる。これがFirefoxの拡張機能の中身だ。