aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJörn Zaefferer <joern.zaefferer@gmail.com>2012-11-09 18:44:29 +0100
committerJörn Zaefferer <joern.zaefferer@gmail.com>2012-11-26 10:26:12 +0100
commit0848040d3ee041e443e2492c18a5a69c78ab9c12 (patch)
tree73ce1d6df13391e6228b7e16634462f143899c0c
parent6edce867339c5808eda428fa2566aa40da4b0202 (diff)
downloadjquery-ui-0848040d3ee041e443e2492c18a5a69c78ab9c12.tar.gz
jquery-ui-0848040d3ee041e443e2492c18a5a69c78ab9c12.zip
Dialog: Focus tabbable only when dialog lost focus before.
-rw-r--r--tests/unit/dialog/dialog_events.js45
-rw-r--r--ui/jquery.ui.dialog.js23
2 files changed, 60 insertions, 8 deletions
diff --git a/tests/unit/dialog/dialog_events.js b/tests/unit/dialog/dialog_events.js
index ee7a8bcb3..eeb17eb93 100644
--- a/tests/unit/dialog/dialog_events.js
+++ b/tests/unit/dialog/dialog_events.js
@@ -39,6 +39,51 @@ test("open", function() {
el.remove();
});
+
+test( "focus", function() {
+ expect( 5 );
+ var el, other;
+ el = $("#dialog1").dialog({
+ autoOpen: false
+ });
+ other = $("#dialog2").dialog({
+ autoOpen: false
+ });
+
+ el.one( "dialogopen", function() {
+ ok( true, "open, just once" );
+ });
+ el.one( "dialogfocus", function() {
+ ok( true, "focus on open" );
+ });
+ other.dialog( "open" );
+
+ el.one( "dialogfocus", function() {
+ ok( true, "when opening and already open and wasn't on top" );
+ });
+ other.dialog( "open" );
+ el.dialog( "open" );
+
+ el.one( "dialogfocus", function() {
+ ok( true, "when calling moveToTop and wasn't on top" );
+ });
+ other.dialog( "moveToTop" );
+ el.dialog( "moveToTop" );
+
+ el.bind( "dialogfocus", function() {
+ ok( true, "when mousedown anywhere on the dialog and it wasn't on top" );
+ });
+ other.dialog( "moveToTop" );
+ el.trigger( "mousedown" );
+
+ // triggers just once when already on top
+ el.dialog( "open" );
+ el.dialog( "moveToTop" );
+ el.trigger( "mousedown" );
+
+ el.add( other ).remove();
+});
+
test("dragStart", function() {
expect(9);
diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js
index 451203cae..b860a8b18 100644
--- a/ui/jquery.ui.dialog.js
+++ b/ui/jquery.ui.dialog.js
@@ -117,7 +117,9 @@ $.widget("ui.dialog", {
}
})
.mousedown(function( event ) {
- that.moveToTop( event );
+ if ( that._moveToTop( event ) ) {
+ that._focusTabbable();
+ }
})
.appendTo( this.document[ 0 ].body );
@@ -292,18 +294,23 @@ $.widget("ui.dialog", {
return this._isOpen;
},
- moveToTop: function( event, silent ) {
- var moved = this.uiDialog.nextAll( ":visible" ).insertBefore( this.uiDialog );
- if ( !silent && moved.length ) {
+ moveToTop: function() {
+ this._moveToTop();
+ },
+
+ _moveToTop: function( event, silent ) {
+ var moved = !!this.uiDialog.nextAll( ":visible" ).insertBefore( this.uiDialog ).length;
+ if ( !silent && moved ) {
this._trigger( "focus", event );
}
+ return moved;
},
open: function() {
if ( this._isOpen ) {
- this.moveToTop( null );
- // TODO run this only when dialog wasn't focused?
- this._focusTabbable();
+ if ( this._moveToTop() ) {
+ this._focusTabbable();
+ }
return;
}
@@ -316,7 +323,7 @@ $.widget("ui.dialog", {
this._size();
this._position( options.position );
this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
- this.moveToTop( null, true );
+ this._moveToTop( null, true );
this._show( uiDialog, options.show );
this._focusTabbable();