Mar 10, 2007

XUL/MigemoのXPCOMコンポーネント化

JavaScriptによるXPCOMコンポーネント作成の練習に、XUL/Migemo勝手改造版の主要な部分をXPCOMコンポーネントにするという実験をやってみた。

ブランチ切って昨日一日作業してたんだけど、それなりにうまくいったようなので、すでにTrunkにマージはしてある(Subversionでブランチ切ったものを再び統合するやり方が分からなくて右往左往したのは秘密だ)。

そんなことをしてどんな意味があるのかっていうとまあほとんど意味なんか無いんだけど、強いてメリットを挙げれば以下のような感じ?

  • 普通に作るとウィンドウごとにスクリプトが読み込まれるので、辞書やキャッシュをウィンドウ間で同期させるのが面倒。XPCOMコンポーネントにしてしまえば、Firefoxが動作している間は単一のオブジェクトを各ウィンドウから参照できる。
  • 機能を使うときに、いちいちスクリプトをscriptタグで読み込ませなくても、var XMigemoFind = Components.classes['@piro.sakura.ne.jp/xmigemo/find;1'].createInstance(Components.interfaces.pIXMigemoFind);と書くだけで辞書の初期化まで含めて全部完了できるようになった。
  • スクリプトを書くときに、グローバル変数を気楽に使えるので、場合によってはラクに書けるようになる。

デメリットというか、XPCOMコンポーネントにする場合に制限があることも分かった。と思う。

  • 配列や正規表現オブジェクトなど、JavaScriptの組み込みオブジェクトをそのまんま返すような機能は作れない(みたい)。配列を返そうと思ったら、nsISimpleEnumeratorの形に変換するようなwrapperをかまさないといけない。
  • ウィンドウに依存しない代わりに、ウィンドウを参照できないので、window.setTimeoutなども使えない。タイマー処理を使いたい場合は、代わりにnsITimerを使う必要がある。
  • IDLでインターフェースの定義を書くとき、返り値の型を間違えると文字化けしたりする。Unicode文字列はとりあえずwstringでいいようだけど、それ以外のの使い分けが分からない……JavaScriptには「文字列」と「整数値」と「真偽値」と「オブジェクト」しかないから、数値だけでなんでこんなにたくさん型があるのかサッパリ分からない。
  • JavaScriptだと関数の引数を省略してもちゃんと動くけど、XPCOMコンポーネントにすると、「引数が足らねえぞゴラァ」というエラーになってしまう。なので、利用する時に若干面倒になる。

Firefoxのソース(特にFx 2のセッションマネージャなど)を見ながら試行錯誤でどうにかここまで。

しかしまあこんな事覚えても、Fx(とかThunderbirdとかあたり)以外では全然役に立たない知識だよなあ……ますます無駄にニッチな方向にばかり突き進んでる気がする。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能