Sep 03, 2008

XUL/Migemoで使ってる機能についてFirefox 3.1で色々変わってた事の調査結果

前のエントリの追記が多くなったので分ける。

「すべて強調表示」の強調箇所がspan要素ではなくnsISelectionになった件については、nsISelectionControllerの選択範囲の型の中にSELECTION_FINDというのが増えていて、ユーザの選択範囲や検索で現在フォーカスがあたってる箇所を表すSELECTION_NORMALとは別に管理されていることが分かった(nsISelectionControllerのメソッドを使うとこれらの型別に選択範囲の一覧を取ることができる)。ということで、「どっちも同じ選択範囲だったらどうやってフォーカス箇所を取ればいいんだ!」という問題は杞憂だったと判明した。

あとはパッチと実際の新しい実装を見ながらFirefox 3.1用のコードを書いて、Safari風強調表示を有効にしてる時だけFirefox 3.0までと同様のspan要素を使うハックを復活させるようにしたところ、アニメーション効果も無事動くようになった。元々、XUL/Migemoでは正規表現にマッチする箇所をまとめて強調しないといけない関係上、span要素を使うハックの処理のほとんどを自前で再実装してたので、思った程には大規模の改修はしなくて済んだ。

一個だけ躓いた所として、XPCOMコンポーネントの新しいメソッドをIDL定義に追加して引数にnsISelectionController型のオブジェクトを渡すようにしていた所、XPIDLでのコンパイルは通るんだけど実際に使う時にNS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFOというエラーが出てにっちもさっちもいかなくなってしまった。ダメ元で、引数の型をnsISupportsにして受け取り側でQueryInterfaceするようにしてみたところ、ちゃんと動いてくれた。一体何だったんだろうこれは。

textbox要素のsearch型については、パッチを見た限りでは今の所サイドバーの「ブックマーク」と「履歴」でだけ利用されていて、XUL/Migemoのやってるハックには影響しないようだった。

ロケーションバーの方もテストしてみようと思ったらこれが全然動かなくなってて、調べてみたらmozIStorageServiceのopenDatabase()メソッドでplaces.sqliteを指定して開く所で「ファイルがロックされてるぞゴラァ」と怒られていた。ななななななんてこった!!! SQLite Managerで見ようとしてもやっぱりロックされてて見れないと言われる。どうも不用意な書き換えでデータベースが破壊されないようにロックがかかるようになったようだ。これはやばい。PlacesデータベースにSQLでアクセスできなくなったらXUL/Migemoのロケーションバーまわりの実装の苦労が全て水の泡になる上に、Firefox 3 Hacksで物凄いページ数使って書いた内容がまるっきり無駄になるじゃないか。マジで一瞬気が遠くなった。

精神的に半泣きになりながらmozilla-centralでスマートロケーションバーまわりのコードを調べていたら、いくつかの箇所でDBConnectionとかStorageConnectionとかそういう文字列が登場していて、それをキーに調べてみたらnsPIPlacesDatabaseというインターフェースDBConnectionプロパティからPlacesデータベースへのコネクションオブジェクトにアクセスすることができるらしいということが分かった。このインターフェースはPlaces API関係のサービスが実装していて、以下のようにすればアクセスできるという事も分かった。

var dbConnection;
if ('nsPIPlacesDatabase' in Ci) { // Firefox 3.1 の場合
  dbConnection = Cc['@mozilla.org/browser/nav-history-service;1']
                  .getService(Ci.nsINavHistoryService)
                  .QueryInterface(Ci.nsPIPlacesDatabase)
                  .DBConnection;
}
else { // Firefox 3.0.x の場合
  const DirectoryService = Cc['@mozilla.org/file/directory_service;1']
                            .getService(Ci.nsIProperties);
  var file = DirectoryService.get('ProfD', Ci.nsIFile);
  file.append('places.sqlite');
  if (file.exists()) {
    const StorageService = Cc['@mozilla.org/storage/service;1']
                            .getService(Ci.mozIStorageService);
    dbConnection = StorageService.openDatabase(file);
  }
}

ホント焦った……4日のトークセッションで土下座せなあかんかと思ったよ。

ちなみにその4日のトークセッションですが引き続き参加者の方絶讃募集中です。9月4日19:00から池袋ジュンク堂にて開催。参加費1000円ワンドリンク制(多分)で定員40名、電話か店頭で申し込む必要があります、としつこく宣伝しておきます。どうかよろしくお願いします!!!!

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能