Bug-org 1179632 [e10s][TSF] Remaining composition in child process causes hitting assertion aCompositionEvent->message == (2200) in child process
初回投稿日時: 2015年12月30日13時47分04秒
最終更新日時: 2015年12月30日13時47分47秒
カテゴリ: e10s IME Mozilla Core Mozilla45 TSF Windows バグ修正
SNS:
Tweet (list)
e10sモードで、コンテンツ内のテキストエディタに未確定文字列がある際に、ウインドウを×ボタンで閉じるとクラッシュするというバグです。
このバグの原因は、×ボタンでウインドウを閉じた場合、TabParent
と閉じようとしているネイティブウインドウをラッピングしているnsIWidget
のインスタンスの関連付けが先に失われてしまい、子プロセス内から親プロセスのIMEにアクセスしようとしても失敗し、それによって発生する矛盾した動作を検出して、MOZ_CRASH()
を呼び出していたことでした。
まず、子プロセスから親プロセスのIMEにアクセスする際に、プロセス間通信を利用して、親プロセスのネイティブのIMEコンテキストを同期的に取得しようとする所に問題があることが分かります。そもそも、この無駄なプロセス間通信自体を無くしてしまい、子プロセスの方で最新の未確定文字列を発生させているネイティブのIMEコンテキストを識別するIDをキャッシュしておく方がよさそうです。そこで、今回の修正の準備として、nsIWidget::GetInputContext()
からネイティブのIMEコンテキストのIDを削除し、代わりに、WidgetCompositionEvent
がこれを運ぶように修正しました。
そして、プロセス間通信を行わないnsIWidget::GetNativeIMEContext()
を新設し、PuppetWidget
は親プロセスから来たWidgetCompositionEvent
を発火する際にキャッシュしておいたネイティブIMEのコンテキストの値をこのメソッドで返すようになっています。
これらの修正により、XP部分から見れば、未確定文字列がある場合は、必ず、そのnsIWidget
インスタンスに紐付いているネイティブのIMEコンテキストが返ってくる状態になっていますので、今までのコードが確実に動作するようになっています。
なお、自動的にネイティブIMEコンテキストを初期化するためにnsIWidget::GetNativeData(NS_NATIVE_IME_CONTEXT)
という手段も用意されていますが、PuppetWidget
に対してこれを呼び出すと(安全に)クラッシュするようになっているので混同しないように注意してください。