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イベントが発行されるかは期待できない)。