WebKit 問題

ASCII 遷移で「l」が入力されたり、ひらかな→カタカナ遷移の「q」が効かないという問題ですが、WebKit のコードを眺めて調査したところ、

  1. WebKitAquaSKK にキー入力イベントを渡す
  2. AquaSKK はイベントを正しく処理する
  3. WebKit が同じイベントを再度発行してしまう(← ここが問題!!!)
  4. AquaSKK がまたイベントを処理してしまう

という現象になっていました。つまり、ASCII へ遷移した後、再度「l」イベントが発生しているので、そのまんま「l」が入力されてしまうわけです。「q」の場合も同様で、二重に送信されてしまうため、ひらかな→カタカナ→ひらかな、という遷移が超高速で発生しています。


WebKit のキー入力処理は、まず IM にイベントを渡すことから始まります。IM がイベントを処理すれば WebKit はそれ以上何もしません。イベントが処理されなかった場合には、自分自身のためにイベントを再送信する仕組みです。これは Gmail でトラブルがあったことから導入されたようですが、それはともかく、WebKit が二度イベントを送信するのは AquaSKK がイベントを処理していないと「勘違い」しているからです。


この勘違いの根本原因は、IM がイベントを処理したかどうかのチェックを「表示上の変化」に依存しているからです。キーを入力した結果、表示上の変化が発生すると、WebKit 側の insertText が callback され、その中で「処理済み」フラグが立つ仕掛けになっているのです。ところが AquaSKK は「l」や「q」を丸呑みしてしまうので、テキストボックスには見た目の変化が発生しません。


というわけで、表示上の変化がなくても IM 側でイベントを消費したということを WebKit が検出できれば万事 OK なのですが、んー、どうすればいいのかなぁ。これは困りました。ああでも、WebKit のコードはなかなか面白いですよ。これはちょっと読み込んでみる価値がありそうです。


それにしても困った。