宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
前のエントリの追記が多くなったので分ける。
「すべて強調表示」の強調箇所が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名、電話か店頭で申し込む必要があります、としつこく宣伝しておきます。どうかよろしくお願いします!!!!
> どうも不用意な書き換えでデータベースが破壊されないようにロックがかかるようになったようだ。
じゃなくて、パフォーマンス的な理由ですね。
読み出し時に、他から書き換えられていないか再確認したりとかが不要になりますから。
http://hg.mozilla.org/mozilla-central/rev/bc658ebc5c77
親切に、代替手段をコメントに書いてくれています。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2008-09-03_fx3.1.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.