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:
Tweet (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
は、同期確定・キャンセルをエミュレートするコードが削除されたので、処理が単純化しています。強制確定に絡んだバグがもしあったら、それも同時に修正されているかもしれません。