Skip to content
Permalink
Browse files

Dialog: Focus tabbable only when dialog lost focus before.

  • Loading branch information...
jzaefferer committed Nov 9, 2012
1 parent 6edce86 commit 0848040d3ee041e443e2492c18a5a69c78ab9c12
Showing with 60 additions and 8 deletions.
  1. +45 −0 tests/unit/dialog/dialog_events.js
  2. +15 −8 ui/jquery.ui.dialog.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);

@@ -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();

0 comments on commit 0848040

Please sign in to comment.
You can’t perform that action at this time.