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

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

もずはっく日記(2012年2月)

2012年2月10日

Bug-org 724471 [IMM] two sets of composition events are fired for a composition of Korean IME
初回投稿日時: 2012年02月10日16時32分51秒
カテゴリ: Mozilla Core Mozilla13 バグ修正
SNS: (list)

古いIMEのコードの整理第二弾も兼ねたバグです。かなり古いバグでハングル文字用のIMEの挙動のために特殊なコードが入っていましたが、そのコードが原因で、ハングルを一文字確定するために2回、compositionstartcompositionupdatecompositionendがセットで発生していました。

ハングルのIMEは一文字、ハングル文字が完成するたびに確定されていく感じなのですが、スペースキーや、Enterキーを押した時に、編集中の文字はそのまま確定し、そのままスペースや改行が入力されるようになっています。

問題のハックは、スペースキーを押したときのハングルIMEの変な挙動に対応するものでした。ハングルIMEは、スペースキーを押した時に次のようにメッセージを送信してきます。

  1. WM_KEYDOWN (VK_PROCESSKEY)
  2. WM_IME_ENDCOMPOSITION
  3. WM_IME_COMPOSITION (GCS_RESULTSTR)
  4. WM_KEYDOWN (VK_SPACE)

普通は、WM_IME_ENDCOMPOSITIONは全てが終わってから送信されるべきなのですが、WM_IME_COMPOSITIONで未確定文字列を確定するイベントが後からやってきます。

このため、意図しないWM_IME_ENDCOMPOSITIONが来た場合には空の文字列で確定し、意図しないWM_IME_COMPOSITIONが来たら、それをWM_IME_STARTCOMPOSITIONを送信し忘れていると見なして処理する、という形になっていました。

今回の修正で、WM_IME_ENDCOMPOSITIONを受け取った時に、WM_IME_COMPOSITIONが確認できて、なおかつそれが確定しようとしているのであれば、WM_IME_ENDCOMPOSITIONでは何も処理しないようにしています。

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

bug-org 724471を含むエントリ