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

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

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

2015年11月13日

Bug-org 1092626 [non-e10s] twitter web UI (twitter.com) scrolls up unexpectedly at doing RT or showing image 初回投稿日時: 2015年11月13日08時16分04秒
カテゴリ: Mozilla Core Mozilla43 Mozilla44 Mozilla45 バグ修正
固定リンク: id=2015111300
SNS: (list)

TwitterのWebサイトで、RTしようとして出たダイアログや、画像を拡大表示させた時の全画面表示のダイアログを閉じた時に、スクロール位置が上端まで戻ってしまうことがあるというバグです。Twitterユーザには前々から不評だったバグです。

Geckoは大きなページをレイアウト中にユーザの操作を検出するとレイアウトの処理を一時中断し、出来上がっているところまで表示するinteruptive layoutという機能を実装しています。テストケースによると、この際に<body>要素にreflowが再発生するとスクロール位置をリセットしてしまい、一時的に表示が失われてしまうことがあるようです。

nsGfxScrollFrameで、その元となった要素にreflowが発生し、dirtyな状態になっている場合にはスクロール位置の復元を行わず、そのreflowが処理された後に復元させることで修正されています。

Army of Awesomeでも時々見かける苦情なので、upliftを希望していましたが、無事、Betaでの修正まで承認され、Firefox 43にもパッチが投入されました。

2015年11月21日

Bug-org 1218032 Ctrl-b while editing a mana page crashes the tab (crash in nsContentIterator::NextNode) 初回投稿日時: 2015年11月21日18時21分49秒
カテゴリ: IME Mozilla Core Mozilla45 バグ修正
固定リンク: id=2015112100
SNS: (list)

Bug-org 1215798の修正によるregressionで、リッチテキストエディタでテキストを選択してスタイルを加えたり解除したりした時にクラッシュするというバグです。

nsContentIteratorが様々な状況下で様々なクラスのメソッドが期待通りの値を返してくるのを前提にして返されたポインタのnullptrチェックを怠っていたため、新たに発生するようになった状況下でこのクラッシュが発生するようになってしまっていました。

nsContentIteratorは様々な場所で使われているので安易な修正はさらなるregressionを呼び込みそうなので、今回の修正ではそのようなシチュエーションに陥らないように修正することにしました。そのシチュエーションとは、nsContentIteratorがDOMツリーから削除されているノードを参照していることです。この時、削除されたノードのルートは、nsINode::GetParent()nullptrを返しますが、ここでクラッシュしていたのです。

何故この様なシチュエーションが発生してしまうのか検証してみたところ、ノードが削除された場合にIMEContentObserver::ContentRemoved()が呼び出され、テキストの変更通知をIME、もしくはContentCacheに伝える必要が出てきます。これはnsContentUtils::AddScriptRunner()に登録して発火を待ちますので、最速で全てのmutationが通知された直後に発火されます。おそらくこの時に選択範囲はまだ削除されたノードを参照している可能性があります。そうすると、選択範囲をキャッシュし直そうとする際に、nsContentIteratorが選択範囲のノードの祖先要素を取得しようとした際にクラッシュします。

おそらくこの問題により、e10sモードで多くのwarningがデバッグビルドを実行している最中には発火されていたと思われるので、この「危険な時間帯」にIMEやContentCacheにコンテンツの変更を通知しないようにすると色々と解決します。

今回の修正では、nsContentUtils::AddScriptRunner()を利用せずに、NS_DispatchToCurrentThread()を利用して通知を行うようにしました。ただ、単純にこのメソッドにだけ頼ると通知が遅くなりすぎて次のネイティブイベントを先にハンドリングしてしまう可能性があったり、多くのnsITextInputProcessorの自動テストを非同期で通知を受け取るように書き直す必要があるので、安全と思われるタイミングで強制的にフラッシュするようにしています。

まだ今回の修正では完全に安全な状況以外でも呼び出しが発生してると思われるwarningが散見されますが、以前よりはかなり状況限定になっている様です。

Bug-org 1224101 Backout the patches causing bug 1218032 from Aurora 初回投稿日時: 2015年11月21日18時28分40秒
カテゴリ: IME Mozilla Core Mozilla44 バグ修正
固定リンク: id=2015112101
SNS: (list)

Bug-org 1218032の修正は問題の解決策としては良かったのですが、IMEContentObserverの基本的な設計の変更なので、Auroraにupliftするにはリスキー過ぎます。そこで、Auroraからはregressionの原因となった修正が不要になったのでシンプルにバックアウトすることで修正しています。

Bug-org 1224454 [e10s][IMM][TSF] IMMHandler and TSFTextStore should clean up itself when focused widget being destroyed before NOTIFY_IME_OF_BLUR 初回投稿日時: 2015年11月21日18時37分59秒
カテゴリ: e10s IME Mozilla Core Mozilla45 TSF Windows バグ修正
固定リンク: id=2015112102
SNS: (list)

e10sモードで、Webコンテンツのエディタがフォーカスを持っている時にウインドウの×ボタンでウインドウを閉じてFirefoxを終了させると、NOTIFY_IME_OF_BLURが子プロセスのIMEContentObserverから送信されても、親プロセスのTabParent::GetWidget()が既にnullptrを返してしまうため、適切なnsWindowに通知することができないことが発覚しました。このため、IMEのイベントハンドラであるTSFTextStoreIMMHandler自身のインスタンスやそれが掴んでいる様々なオブジェクトが未解放のままプロセスが終了してしまい、メモリリークを起こしていたというバグです。

他のプラットフォームではIMEのイベントハンドラが関連するnsWindowDestroy()の呼び出し時にきちんと解放していたのですが、Windowsだけはこれを行っていませんでした。