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:
Tweet (list)
Geckoでは、Element.focus()
を呼び出しても、そのJavascriptのコンテキストがアクセスできないノードがフォーカスを持っている場合、例えば、ブラウザのUIや、フレームに読み込まれた別ドメインのサイト等がフォーカスを持っている場合には、フォーカスを奪えないようになっています。
ただし、mousedown
イベントでクリックされたドキュメントからアクセス可能な要素にフォーカスを移そうとしている場合は、例外的にこれを認めるようにしています。例えば、<label>
要素のような、フォーカスのリダイレクトを実現したいという要求を実現するためです。
ちなみに、mousedown
イベントがpreventDefault()
で消費されない限り、mousedown
イベントのデフォルトアクションとして、マウスのボタンが押された時のウインドウがフォーカスを持つようになっています。
今回見つかった問題は、有名サイトである、JSFIDDLEでは、親ドキュメントが、mousedown
イベントのpreventDefault()
を常に呼び出し、mouseup
イベントでフォーカスをリダイレクトしようとしていたものの、サンプルを表示している<iframe>
は、別ドメインなので、うまく機能していなかった、というバグです。
リスクの大きさを考えると、mousedown
のdefaultPrevented
属性値を無視して、マウスボタンの押されたウインドウに常にフォーカスを移動させるような修正はできませんので、mousedown
イベントと同様、mouseup
イベントの発火中も、そのドキュメントからアクセスできるノードには、どこからでもフォーカスを奪えるように、例外措置を拡大して対応しています。