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

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

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

2015年6月6日

Bug-org 1168079 Ensure to set selection after reframing an editor
初回投稿日時: 2015年06月06日14時12分51秒
カテゴリ: Mozilla Core Mozilla41 バグ修正
SNS: (list)

Bug 1162818のデバッグ中に見つけたバグです。<input>要素等のテキストエディタのフレームが再生成された際にnsEditorが再初期化される際に、大量のwarningがターミナル上に出力されていました。

WARNING: NS_ENSURE_TRUE(aSelection->RangeCount()) failed: file a:\mozilla\mc-e\src\editor\libeditor\nsEditor.cpp, line 3664
WARNING: NS_ENSURE_SUCCESS(rv, rv) failed with result 0x80004005: file a:\mozilla\mc-e\src\editor\libeditor\nsEditor.cpp, line 3643
WARNING: NS_ENSURE_SUCCESS(res, res) failed with result 0x80004005: file a:\mozilla\mc-e\src\editor\libeditor\nsTextEditRules.cpp, line 437

初回の初期化時には、nsEditorの通常の選択範囲を管理しているSelectionはひとつの選択範囲を持っています。しかし、何故か再初期化の段階ではこれが無く、空の状態になっています。

選択範囲が存在していない場合、nsTextEditRules::Init()の最後の方でエディタの末尾にキャレットを置くことで選択範囲を必ず存在させるという処理がありましたが、その前に、nsTextEditRules::CreateBogusNodeIfNeeded()でbogus nodeが必要だった場合に生成しようとします。しかし、そのエディタ内に編集可能なテキストノードを見つけてしまうと、キャレット位置をセットせずに処理を終了してしまいますが、編集処理後に自動的に走るpost processingでは、選択範囲が存在していることが前提のメソッドが先に呼ばれてしまい、上記のwarningが発生し、なんと初期化処理を途中で投げ出してしまっていました。

今回の修正では、問題のpost processingが開始された際に、選択範囲がもし無かった場合、一旦、エディタの末尾にキャレットをセットすることで選択範囲を生成し、初期化処理が完遂されるようにしています。

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

bug-org 1168079を含むエントリ