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

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

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

2014年9月30日

Bug-org 1065835 TextComposition should have API to commit or cancel composition and if widget doesn't perform it synchronously, it should synthesize composition end event
初回投稿日時: 2014年09月30日18時12分53秒
カテゴリ: e10s GTK Mozilla Core Mozilla35 バグ修正
SNS: (list)

TextCompositionに、IMEの未確定文字列を強制確定、もしくは強制キャンセルさせるAPIを追加し、TextComposition自身が同期的にこれを実行することを保証すべき、というバグです。

現在、これらのリクエストは、ネイティブのAPIを利用して、IMEにリクエストし、それがどのように実行されるかは各OSやIMEの挙動に依存する、という形になっています。このため、iBusのように、非同期で未確定文字列を操作されてしまうと、Gecko内部でAPIを呼び出した側は、まだ、未確定文字列が残っているかどうかを意識して処理を行わなければいけません。

これはもちろん、Gecko本体のみならず、Webアプリにも、OSやIME依存のバグが産まれやすいことを意味していて、非常によくありません。また、e10sでは確実に非同期での確定になってしまいますので、e10s対応のためにもどうにかしなければいけない話です。

今回の修正では、nsIWidget::NotifyIME()を呼び出し、その呼び出し直後に確定やキャンセルが実行されていない場合にはDOMイベントを発火し、これをエミュレートし、その後にやってくる非同期で実行されたネイティブイベントは無視するようにしました。

また、Linuxのように、明示的に確定や破棄といったネイティブAPIが存在しない環境のために、それぞれのリクエストで期待した確定文字列が来ていない場合には、確定文字列を期待される文字列で上書きする機能も入れています(ただし、全角スペースをプレースホルダーとして未確定文字列に挿入する中国語のIMEでは、非同期確定の場合には期待通りに動作しませんが……)。

この修正により、nsGtkIMModuleは、同期確定・キャンセルをエミュレートするコードが削除されたので、処理が単純化しています。強制確定に絡んだバグがもしあったら、それも同時に修正されているかもしれません。

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

bug-org 1065835を含むエントリ