Bug-org 1128787 Firefox 35.0.1 crash repro (null ptr)
初回投稿日時: 2015年05月08日19時06分11秒
カテゴリ: Mozilla Core Mozilla40 バグ修正
SNS:
Tweet (list)
再現条件の理屈がはっきりとは分からなかったクラッシュバグです。load
イベントが発生する前に<input>
要素にフォーカスをセットしておき、type
属性値をtext
に変更した後、load
イベントハンドラで、designMode
をon
にするとクラッシュしていました。
Geckoでは、designMode
内の要素は原則としてフォーカスを持つことができません(プラグインはその限りではありませんでしたが)。ですが、designMode
がon
になる際に、フォーカスを持った要素をリセットしていませんでした。つまり、designMode
に入ったことで、本来ならフォーカスを持てない要素が、フォーカスを持ち続けることができたわけです。
<input type="text">
は、独立して選択範囲を管理する特殊な要素です。そのため、IMEContentObserver
がフォーカスを持った要素からselection controller
を探す際に、本来ならdocument
のものが発見されるべきところで、予期せず、<input type="text">
のものが発見され、他のフォーカスを元に取得していない情報と齟齬が生じてクラッシュしていました。
この修正により、designMode
が有効になる際には、まず、HTMLエディタ用のUAスタイルシートを最初に追加し、これも含めた最新の情報をもとに、フォーカスを持っている要素がフォーカスを持ち続けられるのかを検査し、フォーカスを持つことができなくなっているのであれば、フォーカスを失わせるようにしました。
つまり、designMode
をon
にすると、フォーカスを持っている要素で新たにblur
イベントが発生する可能性があります。例えば、HTML5 Demo: ContentEditableのような奇妙なコードでは、designMode
がon
になった途端にoff
になるようになってしまっています。