Bug-org 1168079 Ensure to set selection after reframing an editor
初回投稿日時: 2015年06月06日14時12分51秒
カテゴリ: Mozilla Core Mozilla41 バグ修正
SNS:
Tweet (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が開始された際に、選択範囲がもし無かった場合、一旦、エディタの末尾にキャレットをセットすることで選択範囲を生成し、初期化処理が完遂されるようにしています。