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

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

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

2015年12月30日

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: (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に対してこれを呼び出すと(安全に)クラッシュするようになっているので混同しないように注意してください。

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

bug-org 1179632を含むエントリ