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

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

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

2014年10月30日

Bug-org 1084302 nsGtkIMModule::DeleteText() calls DispatchCompositionChangeEvent() with wrong argument
初回投稿日時: 2014年10月30日22時59分48秒
カテゴリ: GTK Mozilla Core Mozilla36 バグ修正
SNS: (list)

GTKのIMEでは、南アジアの言語でキャレット周囲の文字を含めて、未確定文字列を生成する場合や、日本語の再変換の実装のために、キャレット前後の任意の文字を削除するシグナルが存在しています。これを処理する場合、アプリ側は未確定文字列を含まない、元の文字列でその削除される範囲を決めなくてはいけません。また、nsEditorは、未確定文字列がある状態での、未確定文字列外の文字の編集をサポートしていません。このため、文字列を削除するシグナルを、未確定文字列が存在する際に受け取った場合、まずは、確定してから、文字を削除し、再度、未確定文字列を復元する必要があります。しかし、その実装であるnsGtkIMModule::DeleteText()では、未確定文字列の文節状態を含んだまま、NS_COMPOSITION_ENDを発火し、復元時には逆に、文節状態を含まないまま、NS_COMPOSITION_CHANGEイベントを発火していました。これは、NS_COMPOSITION_CHANGEイベントを発火するメソッドが、boolの引数で文節情報を含めるかどうかを決めるという設計だったため、呼び出し側のDeleteText()が単純に、truefalseを指定しなくてはいけないところ、それぞれ、逆を指定してしまっていました。

ちなみに、これは、nsGtkIMModuleのリファクタリングの作業中にコード上で発見したバグで、実際にこれが問題になっている環境は無いのかもしれません。かなり前から存在しているバグで、発生したら目立つにも関わらず、バグ報告が今まで無いので。

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

bug-org 1084302を含むエントリ