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

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

もずはっく日記(2014年6月)

2014年6月10日

Bug-org 976673 While mouseup event is being dispatched, event handlers cannot steal focus from inaccessible element if preceding mousedown event's preventDefault() is called
初回投稿日時: 2014年06月10日03時57分26秒
最終更新日時: 2014年06月18日19時22分01秒
カテゴリ: Events Mozilla Core Mozilla33 バグ修正
SNS: (list)

Geckoでは、Element.focus()を呼び出しても、そのJavascriptのコンテキストがアクセスできないノードがフォーカスを持っている場合、例えば、ブラウザのUIや、フレームに読み込まれた別ドメインのサイト等がフォーカスを持っている場合には、フォーカスを奪えないようになっています。

ただし、mousedownイベントでクリックされたドキュメントからアクセス可能な要素にフォーカスを移そうとしている場合は、例外的にこれを認めるようにしています。例えば、<label>要素のような、フォーカスのリダイレクトを実現したいという要求を実現するためです。

ちなみに、mousedownイベントがpreventDefault()で消費されない限り、mousedownイベントのデフォルトアクションとして、マウスのボタンが押された時のウインドウがフォーカスを持つようになっています。

今回見つかった問題は、有名サイトである、JSFIDDLEでは、親ドキュメントが、mousedownイベントのpreventDefault()を常に呼び出し、mouseupイベントでフォーカスをリダイレクトしようとしていたものの、サンプルを表示している<iframe>は、別ドメインなので、うまく機能していなかった、というバグです。

リスクの大きさを考えると、mousedowndefaultPrevented属性値を無視して、マウスボタンの押されたウインドウに常にフォーカスを移動させるような修正はできませんので、mousedownイベントと同様、mouseupイベントの発火中も、そのドキュメントからアクセスできるノードには、どこからでもフォーカスを奪えるように、例外措置を拡大して対応しています。

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

bug-org 976673を含むエントリ