この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2011年10月)

2011年10月6日

Bug-org 685073 Manage nested key events for IME
初回投稿日時: 2011年10月06日18時45分10秒
カテゴリ: Mozilla Core Mozilla10 バグ修正
SNS: (list)

Cocoaのキーイベントは、[NSResponder keyDown:]が呼ばれて、その時に[super interpretKeyEvents:]を呼び出すとIMEにキーイベントを引き渡すことができますが、原理上、interpretsKeyEventsを呼び出し中にIMEはkeyDownを再度呼び出すことが可能です。そのような挙動を実際に確認していませんが、もし発生するとGecko内部の処理が破綻するので処理中のキーイベントを配列で管理するように修正しています。

なお、もしキーイベントがこのように入れ子になった場合、元のキーイベントに対するkeypressイベントは既にpreventDefault()が呼び出された状態で送信されます。ですので、defaultPreventedをきちんと確認しているWebアプリケーションではそういったケースでも適切に処理することができます。

実際にキーイベントがどのように発生するかというと、Aキーを押した時に、Bキーを押したイベントがIMEによって擬似的に生成された場合、

  1. Aキーのkeydownイベント
  2. Bキーのkeydownイベント
  3. Bキーのkeypressイベント
  4. Aキーのkeypressイベント (defaultPreventedtrueを返す)
  5. Aキーのkeyupイベント

となります。Bキーのkeyupイベントが来るかどうかはIMEの実装次第ですが、期待すべきではありません(基本的には物理キーであっても、keyupイベントが発行されるかは期待できない)。

関連するかもしれないエントリ

bug-org 685073を含むエントリ