Bug-org 1047588 Intermittent 456727-2.html,test_bug611182.html | application crashed [@ mozilla::IMEContentObserver::Init(nsIWidget*, nsPresContext*, nsIContent*)] after "Assertion failure: mEditor (Failed to get editor), at dom/events/IMEContentObserver.cpp:127"
初回投稿日時: 2014年11月21日16時17分44秒
最終更新日時: 2014年11月21日16時18分14秒
カテゴリ: Mozilla Core Mozilla35 Mozilla36 バグ修正
固定リンク: id=2014112100
SNS:
Tweet (list)
Bug-org 496360の修正によるregressionというか、その修正自体のバグです。Bug-org 496360の修正で、IMEContentObserver
は、エディタの編集アクション一回につき、一回だけ通知を発行することで、パフォーマンスを向上させていますが、このためには当然、フォーカスを持ったエディタの取得が必要になります。デバッグビルドでは、エディタの取得に意図せず失敗した場合に、クラッシュするようにしていましたので、これにより、レアケースのバグが自動テストであぶり出された形になります。
ちなみに、リリースビルドではパフォーマンスが従来通り悪いまま、クラッシュせずに動作するようになっていたので、実際のユーザがこれによってデータロス等を経験はしている可能性はあまりないと思います(このレアケースにはまった時に、膨大な量のテキストを貼り付けるとしばらくの間ハングアップするので、その間に強制終了するとなんらかのデータロスが発生している可能性はありますが)。
とにかく発生頻度が低く、1日中テストしてても、2回ぐらいしか再現しないので、原因の特定にすごい日数かかりましたが、結局、どのようにしてその状況に陥るのかは最後まで分からずじまいでした。とりあえず、判明したのは、designMode
をon
に設定した時、なぜか、エディタがフォーカスを取得した時点で、document
は編集可能と状態更新済みなのに、nsDocShell
に編集可能になったことの通知とnsHTMLEditor
へのポインタの受け渡しが終わっていない、という状況が発生しうるということでした。
これにより、IMEStateManager::GetRootEditableNode()
は編集可能と期待通りの結果を返すのに対し、nsContentUtils::GetHTMLEditor()
はまだnsDocShell
にnsHTMLEditor
が登録されていないので、nullptr
を返してしまうことが分かりました。
今回の修正では、問題のコードが呼び出される時は、必ずnsEditorEventListener::Focus()
がスタックに含まれているので、この時経由する全てのメソッドにエディタへのポインタを引数で渡し、IMEContentObserver::Init()
が確実にエディタへのポインタを利用できるようにしています。
比較的安全な修正かつ、このオレンジの頻度が比較的高いということで、Auroraでも修正されています。