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

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

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

2015年5月8日

Bug-org 1128787 Firefox 35.0.1 crash repro (null ptr)
初回投稿日時: 2015年05月08日19時06分11秒
カテゴリ: Mozilla Core Mozilla40 バグ修正
SNS: (list)

再現条件の理屈がはっきりとは分からなかったクラッシュバグです。loadイベントが発生する前に<input>要素にフォーカスをセットしておき、type属性値をtextに変更した後、loadイベントハンドラで、designModeonにするとクラッシュしていました。

Geckoでは、designMode内の要素は原則としてフォーカスを持つことができません(プラグインはその限りではありませんでしたが)。ですが、designModeonになる際に、フォーカスを持った要素をリセットしていませんでした。つまり、designModeに入ったことで、本来ならフォーカスを持てない要素が、フォーカスを持ち続けることができたわけです。

<input type="text">は、独立して選択範囲を管理する特殊な要素です。そのため、IMEContentObserverがフォーカスを持った要素からselection controllerを探す際に、本来ならdocumentのものが発見されるべきところで、予期せず、<input type="text">のものが発見され、他のフォーカスを元に取得していない情報と齟齬が生じてクラッシュしていました。

この修正により、designModeが有効になる際には、まず、HTMLエディタ用のUAスタイルシートを最初に追加し、これも含めた最新の情報をもとに、フォーカスを持っている要素がフォーカスを持ち続けられるのかを検査し、フォーカスを持つことができなくなっているのであれば、フォーカスを失わせるようにしました。

つまり、designModeonにすると、フォーカスを持っている要素で新たにblurイベントが発生する可能性があります。例えば、HTML5 Demo: ContentEditableのような奇妙なコードでは、designModeonになった途端にoffになるようになってしまっています。

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

bug-org 1128787を含むエントリ