Bug-org 685073 Manage nested key events for IME
初回投稿日時: 2011年10月06日18時45分10秒
カテゴリ: Mozilla Core Mozilla10 バグ修正
SNS:
Tweet (list)
Cocoaのキーイベントは、[NSResponder keyDown:]
が呼ばれて、その時に[super interpretKeyEvents:]
を呼び出すとIMEにキーイベントを引き渡すことができますが、原理上、interpretsKeyEvents
を呼び出し中にIMEはkeyDown
を再度呼び出すことが可能です。そのような挙動を実際に確認していませんが、もし発生するとGecko内部の処理が破綻するので処理中のキーイベントを配列で管理するように修正しています。
なお、もしキーイベントがこのように入れ子になった場合、元のキーイベントに対するkeypress
イベントは既にpreventDefault()
が呼び出された状態で送信されます。ですので、defaultPrevented
をきちんと確認しているWebアプリケーションではそういったケースでも適切に処理することができます。
実際にキーイベントがどのように発生するかというと、Aキーを押した時に、Bキーを押したイベントがIMEによって擬似的に生成された場合、
- Aキーの
keydown
イベント - Bキーの
keydown
イベント - Bキーの
keypress
イベント - Aキーの
keypress
イベント (defaultPrevented
はtrue
を返す) - Aキーの
keyup
イベント
となります。Bキーのkeyup
イベントが来るかどうかはIMEの実装次第ですが、期待すべきではありません(基本的には物理キーであっても、keyup
イベントが発行されるかは期待できない)。