Strange Firefox

自動テストを Firefox でも行ったところ、不思議なことに Firefox でだけ失敗するテストがある。[cci]:[/cci] で行入力モードへ移行し、[cci]^V[/cci] でリテラル入力状態にした後、[cci]escape[/cci] キーを押して状態を途中でキャンセルするというものだ。そして、正しくリテラル入力状態がキャンセルされ、最後の行入力の状態から変化がないことをテストする。

これが Firefox でだけ失敗する。行入力バッファがクリアされてしまうのである。つまり勝手に空っぽになってしまうのだ。なにこれ。というかなんだこれ。

調べてみたところ、[cci]escape[/cci] キーを押されたことで発生するハンドラの中では、最後までバッファが勝手に変更されることはない。そのハンドラが終了した直後に勝手にクリアされてしまうようだ。つまり wasavi のコードがバグってるということではなくて、Firefox の動作がなんかおかしい。

もともと、wasavi 側ではキー入力ハンドラ内で 1ms 後に発生するタイマを仕掛け、そこで擬似的にバッファ変更イベント的なものを発生させている(これはインクリメンタルサーチで必要なのだ)。Firefox で動いている場合に限り、そのタイマの中でつじつまを合わせることにした。具体的にはキー入力ハンドラの最後にバッファの内容を data- なんとか属性にコピーしておき、タイマの中でその属性値と現在のバッファの value が違っていたらコピーしていた内容で復帰させるのである。もちろんこんな処理は本来は不要で、あまりに何をやっているのか意味不明なので、さすがにくどいコメントも付けておいた。

もしかしたら、このバグなのかもしれない。しかし件のバグは RESOLVED なので関係ないのかなあ?

とこのように、Firefox でだけ発生するバグを見つけると大変なのである。なにしろ拡張を華麗にデバッグするナウいデバッガがないので、古き良き…ではない古く悪しき printf デバッグでのたうちまわるしかないのだ。Firebug とかは、あくまで web ページのスクリプトのデバッガなので拡張は対象外なのです。

正確に言えば、最近の Firefox は Firebug ではないビルトインのデバッガを備えるようになっている。これが本当に最近の話だから困る。しかもそのデバッガが拡張をデバッグ対象にできるようになったのはさらに最近の話なので本当に困る。ちょっと実装するの遅すぎですよ。

ちなみにそのデバッガであるが、ステップ実行するのに 1 〜 2 秒かかったりステップ実行の単位がソースコードの 1 行ではなく副作用完了点的な何かなのか、複数回ステップ実行しないと停止行が進まなかったり、デバッガが動いている間 CPU を 80% 近く酷使してファンを全力全開にしてくれたり、まあなんといいますか、まだまだまったくもって人様にお出しできない状態なのだった。ひどいかひどくないかで言えば、かなり滅茶苦茶にひどい。

Firefox といえば OSS のブラウザの雄でであり、かつ長い歴史を持った老舗であるわけなのだが、デバッガ周りに関してなんでこんなにもあまりにも質の低いことをしているのか、ちょっとどういうことなのかよくわからない。どういうことなの。どういうことなんでしょうか。

Leave a Reply

Your email address will not be published. Required fields are marked *