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

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

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

2015年8月30日

Bug-org 1199224 [TSF] MS Korean IME doesn't replace composition string properly after ASCII character
初回投稿日時: 2015年08月30日10時31分44秒
カテゴリ: IME Mozilla Core Mozilla41 Mozilla42 Mozilla43 TSF Windows バグ修正
SNS: (list)

TSFモードで、ハングルのTIPを利用している時に、半角記号の後ろでハングル文字を入力しようとすると最初のハングル文字の合成中に、最初に入力した文字が確定され、その後、二文字目以降が合成された未確定文字がその前に挿入されるというバグです。

ハングルのIMEは基本的にはQWERTYキーボードのアルファベットキーを押した時だけ未確定文字列を生成し、ハングル文字を一文字ずつ合成していく(ローマ字入力がかな一文字ずつ完成するたびにコミットされるイメージ)のですが、記号のキーを押した場合にはそのままキーイベント経由で文字が入力されます。そのため、日本人とは比較にならないぐらいに半角記号混じりの文章を入力するようで、これが原因でTSFTextStoreの設計ミスを洗い出してくれていました。

TSFTextStoreはTSFのドキュメントロックをエミュレートするため、ロックが要求された時点でフォーカスを持つエディタの情報を収集・キャッシュし、この情報からTSFの問い合わせに応答するようになります。そして、ドキュメントがアンロックされた時にこれを破棄し、コンテンツのリアルタイムの情報を取得しにいくようになります。

このドキュメントのアンロック時のキャッシュ破棄に問題がありました。なんと、リード・オンリーなロックの場合、破棄していなかったのです。

ハングルのTIPの場合、半角記号がそのままキーイベント経由で入力されるため、TSFTextStoreを経由せずに文字入力が行われます。しかし、その直前にTIPがリード・オンリーなロックをかけた状態でコンテンツを取得しに来ていると半角記号が入力される前のコンテンツをキャッシュしているわけです。この古いキャッシュをハングル文字の入力を開始した時にも利用しているため、実際のキャレット位置がキャッシュしているコンテンツの外側になってしまうことになります(キャレット位置の情報はコンテンツ側から更新通知が来て、リアルタイムに更新されます)。この矛盾によりTIPは混乱し、未確定文字列を一旦確定させてしまうものの、二文字目以降の合成は何故か継続されるという不思議な挙動(これはこれでTIPのバグ)を起こして、このバグのような症状になっていた訳です。

今回の修正では単純にリード・オンリーなロックのアンロック時にもキャッシュを破棄すれば良いだけの話だったので、TSFが最初に有効になるBetaでの修正も申請中です。

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

bug-org 1199224を含むエントリ