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

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

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

2014年4月30日

Bug-org 998188 ContentEventHandler::OnQueryCaretRect() converts native text offset with wrong node
初回投稿日時: 2014年04月30日23時39分35秒
最終更新日時: 2014年04月30日23時40分36秒
カテゴリ: Mozilla Core Mozilla31 バグ修正
SNS: (list)

デバッグビルドでTwitter等、contenteditable等で作成されたリッチテキストエディタでIMEを使っていると、mozilla::ContentEventHandler内でオフセットの異常を検知して強制終了するというバグです。

このバグの原因は、Metro版Firefoxのchromeのコードから、nsIDOMWindowUtils.sendQueryContentEvent()を呼び出す際に、JS上で取得した文字列のオフセットを利用して、キャレットの位置を取得できるようにするために、アドホックな修正を入れてたことで混入していました。

ただし、デバッグビルドで発生する異常検知も、エディタ内のテキストノードが複数存在する場合にのみ検知できていたので、これまで、バグの混入に誰も気付いていなかったという感じです。IMEを利用した場合、未確定文字列が独立したテキストノードとして挿入されているので、この条件が整っていたわけです。

今回の修正では、まず、アドホックな修正そのものを取り除き、nsIDOMWindowUtils.sendQueryContentEvent()と、nsIDOMWindowUtils.sendSelectionSetEvent()の引数にフラグを追加し、指定するオフセットや、長さ、前者の戻り値のオフセット、長さ、文字列それぞれが、改行文字列が、JSで扱いやすい\nのみXPモードと、ネイティブAPIとの通信に必要な、ネイティブの改行文字列、例えばWindowsでは\r\nであるネイティブモードを選択可能にしました。

nsIDOMWindowUtils.sendSelectionSetEvent()には注意が必要で、最後にあったbooleanの引数は削除され、新設したフラグの一つとなっています。互換性を失っていますが、これは、addons.mozilla.orgに登録されているアドオンのソースコードを横断検索し、利用しているアドオンが存在しないことを確認した上でのことです。ですので、自前のWebサイト等で配布されている、いわゆる、野良拡張や、企業等で組織内での利用のために作成されたアドオンがこのメソッドを利用していると、動作が壊れている可能性があることに注意してください(ただし、その引数がfalseの場合は問題なく、利用していたとしても、falseであることが通常のはず)。

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

bug-org 998188を含むエントリ