Skip to content

Commit

Permalink
Dialog: Don't use ._on() for modal event handlers. Fixes #9048 - Dial…
Browse files Browse the repository at this point in the history
…og: broken focusin event handler when beforeclose event of a modal opens another modal.
  • Loading branch information
scottgonzalez committed Feb 3, 2013
1 parent 9c6b8f8 commit 8724092
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 11 deletions.
13 changes: 13 additions & 0 deletions tests/unit/dialog/dialog_core.js
Expand Up @@ -147,4 +147,17 @@ asyncTest( "Prevent tabbing out of dialogs", function() {
});
});

asyncTest( "#9048: multiple modal dialogs opened and closed in different order", function() {
expect( 1 );
$( "#dialog1, #dialog2" ).dialog({ autoOpen: false, modal:true });
$( "#dialog1" ).dialog( "open" );
$( "#dialog2" ).dialog( "open" );
$( "#dialog1" ).dialog( "close" );
setTimeout(function() {
$( "#dialog2" ).dialog( "close" );
$( "#favorite-animal" ).focus();
ok( true, "event handlers cleaned up (no errors thrown)" );
start();
});
});
})(jQuery);
20 changes: 9 additions & 11 deletions ui/jquery.ui.dialog.js
Expand Up @@ -678,16 +678,14 @@ $.widget( "ui.dialog", {
this._delay(function() {
// Handle .dialog().dialog("close") (#4065)
if ( $.ui.dialog.overlayInstances ) {
this._on( this.document, {
focusin: function( event ) {
if ( !$( event.target ).closest(".ui-dialog").length &&
// TODO: Remove hack when datepicker implements
// the .ui-front logic (#8989)
!$( event.target ).closest(".ui-datepicker").length ) {
event.preventDefault();
$(".ui-dialog:visible:last .ui-dialog-content")
.data("ui-dialog")._focusTabbable();
}
this.document.bind( "focusin.dialog", function( event ) {
if ( !$( event.target ).closest(".ui-dialog").length &&
// TODO: Remove hack when datepicker implements
// the .ui-front logic (#8989)
!$( event.target ).closest(".ui-datepicker").length ) {
event.preventDefault();
$(".ui-dialog:visible:last .ui-dialog-content")
.data("ui-dialog")._focusTabbable();
}
});
}
Expand All @@ -712,7 +710,7 @@ $.widget( "ui.dialog", {
$.ui.dialog.overlayInstances--;

if ( !$.ui.dialog.overlayInstances ) {
this._off( this.document, "focusin" );
this.document.unbind( "focusin.dialog" );
}
this.overlay.remove();
this.overlay = null;
Expand Down

0 comments on commit 8724092

Please sign in to comment.