言葉足らずでかなり理解が怪しくなりそうなので、大きく変更・追記しました。
最近のGTK2上でキーボードのキーを押しっぱなしにすると、DOMキーイベントが
keydown
keypress
keypress
...
keyup
という順序で生成され、keydown
イベントを期待しているWebアプリが動かなくなっている、というバグです。
調べてみると、Ubuntu 9.4では、
keydown
keypress
keyup
keydown
keypress
keyup
...
と、リピート入力時にも、keydown
、keypress
、keyup
がワンセットで生成されていました。
GTK2のネイティブには、key pressイベントと、key releaseイベントのみがあります。Geckoはkey pressイベントを受け取ると、コンテンツに対して、keydown
イベントと、keypress
イベントを生成しています。
DOM3でキーイベントの発生順序が定義されていなかった時に、Linux版のGeckoは、現在と同じ、
keydown
keypress
keypress
...
keyup
という順序になるように、keydown
イベントを最初のネイティブのkey pressイベントでしか生成しないように、あえて制限を行っていました。
ところが、Ubuntu 9.4当時のGTK2は、リピート時に、key pressイベントだけではなく、key upイベントもワンセットで送信するように挙動を変更していました。これにより、keydown
をリピートごとに生成しないようにする、というコードが動くことが無くなっていました。
この時点でGeckoの開発者としてはバグに気づくべきでした。想定していた通りのイベントがプラットフォームからは来なくなっていましたので。しかし、残念ながらこれを自動でテストする手段はまだ見つかっていませんので、この問題は発見されていませんでした。
ここで、Web開発者の視点に立ってみると、DOM3で最近提案されたキーイベントの順序とは異なり、余計なkeyup
が来るものの、keypress
イベントの前には常にkeydown
イベントが必ず発生するようにGeckoが修正されたかのように見えます。
ですが、Ubuntu 9.10以降のGTK2では、リピート時に再び、key upイベントを送信してこなくなりました。このため、Geckoのkeydown
イベントの抑制コードが再び動くようになりました。これにより、DOM3のイベント順序案からさらに離れた、昔のイベントの発生順序に戻ってしまい、DOM3を意識したWebアプリケーションの動作に悪影響が出ていたわけです。
今回の修正で、Windows版と同様、DOM3の仕様案通りに、
keydown
keypress
keydown
keypress
...
keyup
という順序でkeypress
イベントの前には必ずkeydown
イベントがリピートされるようになりました。
なお、Mac版の修正はBug-org 599887で承認待ちになっています。