22時33分FirefoxのUIはXULとJavaScriptで構成されていますが、JavaScriptの組み込みオブジェクトだけではファイル操作やウィンドウ操作などができません。そこで登場するのがXPCOM、これを用いることでOSに絡んだ操作やRDFの操作などが行えるようになります。Firefoxに付随するXPCOMコンポーネントの多くはC++でかかれ、プラットフォーム別にコンパイル作業などが必要なのですが、XPCOMはJavaScriptを用いて作ることもでき、これならOSにあわせてコンパイルする必要はありません。そこでここでは実際にJavaScriptでXPCOMを作ってみることにします。今回作成するXPCOMコンポーネント(nntPerson)は人物をあらわすもので、年齢を示すageプロパティと年齢を言うsayメソッドを持つものとします。以下ではWindowsで作成することを前提として話を進めていきますので、ほかのOSで作成する場合は適宜読み替えてください。ここではXPCOMコンポーネントの呼び出し方や拡張の作成については深くは触れません。XULチュートリアル(未完の邦訳)のXPCOMの章やFirefoxまとめサイトの「拡張の作成」を参考にしてください。SDKを入手できます。ここではWindows用ということでgecko-sdk-i586-pc-msvc.zipをダウンロード。解凍してできたgecko-sdkディレクトリをCドライブ直下にコピーします。SDKのツールを使うためにいくつかライブラリを追加する必要が出てきます。プラットフォームによって異なるかもしれませんが、Windowsの場合はlibIDL-0.6.3-win32-bin.zipとglib-19990228.zipを入手。解凍した中にあるlibIDL-0.6.dll、glib-1.2.dllをパスの通ったディレクトリに置きます。私は簡便のためC:\gecko-sdk\binにおきました。拡張やインターフェースを識別するためにUUIDを生成する必要がでてきます。SDKのguidgen.exeを使用しました。作業用ディレクトリの作成ここではC:\JSPersonを作業用ディレクトリとします。作成するコンポーネントのインターフェース、すなわちどんなプロパティやメソッドを持つのかはあらかじめFirefoxに教えておかないといけません。そこで登場するのがIDLです。IDLを使用することでコンポーネントのプロパティやメソッド、継承関係などを記述することができます。作業用ディレクトリにcomponentsディレクトリを作成し、その中に以下の内容でnntIPerson.idlを作ります。say();};nntIPersonインターフェースはnsISupportsインターフェースを継承し、ageプロパティとsayメソッドを持ちます。nsISupportsを継承しているのは、どんなインターフェースもnsISupportsを継承することになっているからです。[]内にはインターフェースを識別するためのUUIDを指定します。キーワードscriptableをつけることで、作成するコンポーネントがスクリプトからアクセスできるようになります。プロパティ名とし、読み取り専用プロパティの場合はreadonlyをattributeの前に指定します。メソッドの宣言はC/C++/Javaのそれとよく似ています。引数名の形で宣言します。(UTF-16文字列)を使ったほうが効率がいいらしいです。タイプライブラリの作成こうして作成したインターフェース記述ファイルですが、そのままでは使えません。Geckoがインターフェースを理解できるようコンパイルする必要があります。SDKに含まれるxpidlというツールです。コマンドプロンプトから以下のようにxpidlを実行し、nntIPerson.xptを生成してください。nntIPerson.idlインターフェースの実装インターフェースが決まったので実際にその処理の中身をJavaScriptで書いてみます。componentsフォルダ内にnntPerson.jsを作成しましょう。0}プロパティのゲッタ、セッタはそれぞれキーワードget、setを用いて指定します。QueryInterfaceはnsISupportsインターフェースのメソッドです。コンポーネントが実装しているインターフェースを全て書くことになります。この場合ですとnntIPersonインターフェースはnsISupportsインターフェースを継承しているのでnsISupportsも書きます。nntPersonModule;}上に書いたのが実装を登録するためのモジュールです。IDにはコンポーネントを識別するための文字列を指定します。IDの書式についてはIBMのXPCOM作成に関する文書をごらんください。基本的には@<ドメイン名>/<モジュール名>;<バージョン>という形になります。次にテストケースを作成します。作業フォルダに戻って、contentフォルダを作成、さらにその下にjspersonフォルダを作成します。その中にcontents.rdfとjsperson.xulを作成します。&lt;/hbox&gt;&lt;/vbox&gt;&lt;/page&gt;パッケージの作成contentフォルダをZIP圧縮し、ファイル名をjsperson.jarに変更します。作業フォルダ内にchromeフォルダを作り、jsperson.jarをその中に移動します。作業フォルダ内にinstall.rdfを以下の内容で作成します。パッケージのUUIDは新たに取得します。&lt;/em:file&gt;&lt;/rdf:Description&gt;&lt;/rdf:RDF&gt;最後にchromeフォルダ、componentsフォルダ、install.rdfをZIP圧縮し、ファイル名をjsperson-0.0.1.xpiと変更すればインストールパッケージの完成です。実行あとは普通の拡張と同じようにインストールして、アドレスバーにchrome://jsperson/content/と入力してください。年齢をセットするさまが見られます。RCにて動作を確認しました。以上で作ったXPIファイルそのパッケージ内容及びソース参考文献この記事の作成にあたって以下のサイトを参考にさせていただきました。ReferenceXPCOMのサンプルが見られます。rules:IDLの書き方について。String(文字列)ガイドXPCOMで使う文字列型についてのガイドです。英語版のほうが内容が新しいのですが私は日本語版のほうを参考にしました。インタフェース情報を生成するためのツールXPIDLの使い方について。IDの書式について参考にしました。まとめサイト拡張のパッケージングについて参考にしました。XULPlanetテストケースの作成にあたって参考にしました。04時25分libIDL-0.6.dllとglib-1.2.dllの入手先についてですが、本文中のリンクはともにリンク切れとなっていました。代わりに、以下のページから入手することができました。age;」とすることで無事成功しました。ありがとうございました。23時38分ご指摘ありがとうございます。この内容もだいぶ古くなっていますからね。試していませんがWindowsではそもそもlibIDLとglibを別途用意する必要がなくなっているかもしれません。Components.results.NS_ERROR_NO_INTERFACE;としたほうがいいですね。コメントをどうぞ※メールアドレスとURLの入力は必須ではありません。入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。※投稿には管理者が設定した質問に答える必要があります。興味のある事柄についてつづる。関係技術とかマンガ・アニメとか。掲載コードのラインセンスポリシーとか、はてなブックマーカによるこのブログ上の注目の記事とか。