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

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

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

2015年6月6日

Bug-org 1117087 crash in nsEditor::EnsureComposition(mozilla::WidgetGUIEvent*)
初回投稿日時: 2015年06月06日13時19分37秒
最終更新日時: 2015年06月06日13時31分53秒
カテゴリ: GTK Mozilla Core Mozilla40 バグ修正
SNS: (list)

ATOK X3に対応した際のregressionで、Facebookのコメント入力欄が空の場合に、IMEで未確定文字列を入力するとクラッシュするというバグです。

Facebookのコメント入力欄はcontenteditableで作成されていて、placeholderのような入力時に自動的に消える文字は、通常のテキストノードです。

このため、未確定文字列を挿入しようとした際に、このテキストノードがFacebookにより削除され、内部ではselection changeが発生します。selection changeが発生するとGTKアプリでは、gtk_im_context_reset()を呼び出すことになっていますが、iBusは、preedit_startシグナルの送信中にgtk_im_context_reset()が呼び出されても未確定文字列を削除しない、バグっぽい動作を行います。しかし、Gecko内部では空文字列ですでに確定していますので、NS_COMPOSITION_STARTが発生していない状態でNS_COMPOSITION_CHANGEイベントが発生し、あり得ない状況としてGeckoはMOZ_CRASH()を呼び出して安全にクラッシュしていました。

どちらにせよ、preedit_startシグナルの送信中に未確定文字列がキャンセルされるのはユーザの意図する状況とは言えませんので、preedit_startシグナルの送信中にselection changeが発生してもひとまず無視するように修正しました。ただし、IMEを混乱させないように、未確定文字列の開始位置はselection changeが発生した段階で補正するようにはしています。

Web開発者の方は、compsoitionstartイベントの発生時に、選択位置や、コンテンツの内容を書き換えるのはやめてください。おそらく、様々な問題が潜んでいると思います。

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

bug-org 1117087を含むエントリ