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

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

もずはっく日記(2015年9月)

2015年9月17日

Bug-org 1199997 [TSF] Selected text isn't replaced with composition string when you use MS Pinyin, MS Wubi, MS Changjie and MS Quick on Win8.1 and Win10
初回投稿日時: 2015年09月17日21時16分44秒
カテゴリ: IME Mozilla Core Mozilla41 Mozilla42 Mozilla43 TSF Windows バグ修正
SNS: (list)

TSFで、Win8.1やWin10に付属しているMS製のTIP、MS Pinyin、MS Wubi、MS Changjie、MS Quickでは、未確定文字列を入力しても、選択文字列が置換されず、選択範囲の先頭に未確定文字列が挿入されるというバグです。

TSFTextStoreのログを見ると、これらのTIPでは未確定文字列の入力開始時にITextStoreACP::QueryInsert()が呼び出され、その返り値が未確定文字列が置き換える範囲となってITfContextOwnerCompositionSink::OnStartComposition()が呼び出されていました(元に、QueryInsert()の返り値を選択範囲そのままで返すと正しく置換されました)。

GeckoのQueryInsert()の戻り値もちょっとおかしいのですが、その値が未確定文字列の置き換え範囲として利用されるのはこのケースでは明らかにおかしいので、TIPから利用しているカウンターパートを探してみたところ、ITfRange::AdjustForInsert()の呼び出し時に呼び出されてそうです。このドキュメントによると、

This method should be used to prepare a range to initiate a new composition, before editing begins. It should be used only when the text is not inserted at the current selection.

とあります。そこで、中国語のTIPのバグだと断定し、ハックを入れることで対処することにしました。

入れたハックはややリスキーなもので、QueryInsert()の戻り値をこれらのTIPがアクティブな時に書き換えるというものです。本当はOnStartComposition()の方で読み替えて対応したかったんですが、それを行うと、続いて呼び出される様々なメソッド全てにハックが必要で不可能に近いことに思えたので、このようにしています。

TSF対応最初のバージョンである41にも修正を入れています。

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

bug-org 1199997を含むエントリ