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イベントの発火中も、そのドキュメントからアクセスできるノードには、どこからでもフォーカスを奪えるように、例外措置を拡大して対応しています。