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

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

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

2014年10月30日

Bug-org 1081993 [TSF] Candidate window position is always the top-left of browser window or just disappeared if IMM IME is active in TSF mode (~ATOK 2010, Japanist)
初回投稿日時: 2014年10月30日17時42分06秒
カテゴリ: Mozilla Core Mozilla35 Mozilla36 TSF Windows バグ修正
SNS: (list)

TSFモードで、IMMのIME (ATOK 2010以前やJapanist、Windows 7かVistaでGoogle日本語入力)を利用していると、候補ウインドウがキャレット位置に正しく表示されず、ウインドウの左上に表示されたり、全く表示されなかったりする、というバグです。Bug-org 975383の修正によるregressionです。

IMMのIMEは、TSFモードであっても、ITextStoreACPを利用せず、IMMのメッセージとAPIを利用して、従来通りにハンドリングしなくてはいけません。ですので、nsIWidget::NotifyIME(NOTIFY_IME_OF_COMPOSITION_UPDATE)が呼び出された場合、ImmSetCandidateWindow() APIでウインドウ位置をTSFモードであっても指定しておく必要があります。しかし、これまではTSFモードでは無い場合、NOTIFY_IME_OF_COMPOSITION_UPDATEを無視していました。

では、なぜ、今までは問題なかったのか、ということになるのですが、Bug-org 975383の修正で、NS_COMPOSITION_UPDATEの発火コードをnsIMM32Handlerから削除した際、誤ってImmSetCandidateWindow()を呼び出していたコードを正しく削除してしまったのが、このバグが表面化した理由でした。つまり、元々バグっていたのですが、バグにより、過剰な呼び出しがあったので、それに救われていたものの、その過剰な呼び出しが削除されたということです。

今回、IMMとTSFのどちらに処理を任せるか判断しているIMEHandlerクラスの処理を見直して、TSFモードでIMM IMEが有効かどうかをきちんと確認するようにしました。これにより、TSFモードでIMM IMEを利用している場合にのみ、未確定文字列があってもKeyboardEventが発生するバグがありましたが、このバグも修正されています。

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

bug-org 1081993を含むエントリ