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

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

もずはっく日記(2013年12月)

2013年12月19日

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: (list)

Geckoや、Firefox等のXULアプリは、DOMイベントをハンドリングすることで、イベントのデフォルトアクションを実装しています。前者で、イベントのディスパッチが完全に終了した後以外にハンドリングした場合には、他の要素がデフォルトアクションを二重実行してしまわないように、Event.preventDefault()が呼び出されています。これが原因で、イベントを保存しておいて、イベントのディスパッチが終了した後にEvent.defaultPreventedの値を確認すると、WebアプリがEvent.preventDefault()を呼び出したわけでもないのに、trueになっている、という奇妙な状態になっていました。

今回の修正で、Event.preventDefault()が、content権限のJavascriptから呼ばれた場合にのみ、mozilla::EventFlags::mDefaultPreventedByContenttrueにし、content権限のJavascriptがEvent.defaultPreventedの値を確認した場合には、mozilla::EventFlags::mDefaultPreventedByContenttrueでなければ、trueに見えないようになっています。

つまり、chrome権限で動作している(はず)のアドオンから見ると、動作は一切変わっていませんので、互換性に問題が出ないように配慮しています。

また、Event.defaultPreventedが提案されるまで、独自に実装していたEvent.getPreventDefault()は、そもそもWebコンテンツでは利用されるべきではありませんし、これを未だに利用しているWebアプリがこの修正により不具合が出たしてもメンテされる可能性が低いので、互換性維持の観点から、元の動作のままにしてあります。

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

bug-org 930374を含むエントリ