Bug-org 930374 Event.defaultPrevented shouldn't become true if preventDefault() was called by our internal handler for default action
初回投稿日時: 2013年12月19日14時55分33秒
カテゴリ: Events Mozilla Core Mozilla28 バグ修正
SNS:
Tweet (list)
Geckoや、Firefox等のXULアプリは、DOMイベントをハンドリングすることで、イベントのデフォルトアクションを実装しています。前者で、イベントのディスパッチが完全に終了した後以外にハンドリングした場合には、他の要素がデフォルトアクションを二重実行してしまわないように、Event.preventDefault()
が呼び出されています。これが原因で、イベントを保存しておいて、イベントのディスパッチが終了した後にEvent.defaultPrevented
の値を確認すると、WebアプリがEvent.preventDefault()
を呼び出したわけでもないのに、true
になっている、という奇妙な状態になっていました。
今回の修正で、Event.preventDefault()
が、content権限のJavascriptから呼ばれた場合にのみ、mozilla::EventFlags::mDefaultPreventedByContent
をtrue
にし、content権限のJavascriptがEvent.defaultPrevented
の値を確認した場合には、mozilla::EventFlags::mDefaultPreventedByContent
もtrue
でなければ、true
に見えないようになっています。
つまり、chrome権限で動作している(はず)のアドオンから見ると、動作は一切変わっていませんので、互換性に問題が出ないように配慮しています。
また、Event.defaultPrevented
が提案されるまで、独自に実装していたEvent.getPreventDefault()
は、そもそもWebコンテンツでは利用されるべきではありませんし、これを未だに利用しているWebアプリがこの修正により不具合が出たしてもメンテされる可能性が低いので、互換性維持の観点から、元の動作のままにしてあります。