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:
Tweet (list)
TSFモードで、ハングルのTIPを利用している時に、半角記号の後ろでハングル文字を入力しようとすると最初のハングル文字の合成中に、最初に入力した文字が確定され、その後、二文字目以降が合成された未確定文字がその前に挿入されるというバグです。
ハングルのIMEは基本的にはQWERTYキーボードのアルファベットキーを押した時だけ未確定文字列を生成し、ハングル文字を一文字ずつ合成していく(ローマ字入力がかな一文字ずつ完成するたびにコミットされるイメージ)のですが、記号のキーを押した場合にはそのままキーイベント経由で文字が入力されます。そのため、日本人とは比較にならないぐらいに半角記号混じりの文章を入力するようで、これが原因でTSFTextStore
の設計ミスを洗い出してくれていました。
TSFTextStore
はTSFのドキュメントロックをエミュレートするため、ロックが要求された時点でフォーカスを持つエディタの情報を収集・キャッシュし、この情報からTSFの問い合わせに応答するようになります。そして、ドキュメントがアンロックされた時にこれを破棄し、コンテンツのリアルタイムの情報を取得しにいくようになります。
このドキュメントのアンロック時のキャッシュ破棄に問題がありました。なんと、リード・オンリーなロックの場合、破棄していなかったのです。
ハングルのTIPの場合、半角記号がそのままキーイベント経由で入力されるため、TSFTextStore
を経由せずに文字入力が行われます。しかし、その直前にTIPがリード・オンリーなロックをかけた状態でコンテンツを取得しに来ていると半角記号が入力される前のコンテンツをキャッシュしているわけです。この古いキャッシュをハングル文字の入力を開始した時にも利用しているため、実際のキャレット位置がキャッシュしているコンテンツの外側になってしまうことになります(キャレット位置の情報はコンテンツ側から更新通知が来て、リアルタイムに更新されます)。この矛盾によりTIPは混乱し、未確定文字列を一旦確定させてしまうものの、二文字目以降の合成は何故か継続されるという不思議な挙動(これはこれでTIPのバグ)を起こして、このバグのような症状になっていた訳です。
今回の修正では単純にリード・オンリーなロックのアンロック時にもキャッシュを破棄すれば良いだけの話だったので、TSFが最初に有効になるBetaでの修正も申請中です。