Bug-org 907657 Firefox24 hangs if synchronous XMLHttpRequest was sent inside onkeydown
初回投稿日時: 2013年08月31日12時40分22秒
カテゴリ: Mozilla Core Mozilla24 Mozilla25 Mozilla26 Windows バグ修正
SNS:
Tweet (list)
keydown
イベントハンドラで、XMLHttpRequest.send()
を同期通信として使用すると、ハングアップするというバグです。ギリギリ、Betaで重大なバグが発見され、報告されました。本当に助かります。
同期通信が行われた場合、本来なら、その通信が終わってから、keydown
イベントが全ての必要な要素に配信された後に、keypress
イベントが発生すべきです。しかし、Geckoの現在の設計でこれを行ってしまうと、通信中はウインドウを閉じたりすることすらできなくなってしまいます。これを解決するために、Geckoではメッセージループをネストさせて、chromeには次のWM_CHAR
メッセージを元にkeypress
イベントを発生させ、contentには、通信終了後にキューにためておいたDOMイベントを発生させる、という実にトリッキーなことをやっています。
このため、keydown
イベントの送信前に、WM_CHAR
メッセージの有無を確認しておき、送信後にWM_CHAR
メッセージをGetMessageW()
で取得しにいったら、既にキューからは削除されているために、GetMessageW()
から処理が返ってこない、というのが原因でした。
今回の修正では、送信前にWM_CHAR
メッセージの有無を確認してキャッシュするのではなく、リアルタイムで、WM_CHAR
メッセージの有無を確認後に、GetMessageW()
を使用するように変更し、ハングアップを回避しています。
しかし、実にハッキーなことをやっているため、keydown
イベントでpreventDefault()
を呼んでも一切、無視されていますし、その後contentに送信されてくるイベントも正確性に欠くので、Web開発者の方は、同期通信を使わないようにした方が余計なバグを生み出さずに済むので良いでしょう(そもそもレスポンスの面から、使うことは希だと思うのですが、実情は全く知りません)。