Skip to content

Commit c9815f1

Browse files
committed
Dialog: Search the correct document for focus trapping. Fixes #9439 - Dialog: Context is not respected for modals.
1 parent 92d5421 commit c9815f1

File tree

2 files changed

+37
-28
lines changed

2 files changed

+37
-28
lines changed

tests/unit/dialog/dialog_methods.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,21 @@ test("destroy", function() {
6363
// Don't throw errors when destroying a never opened modal dialog (#9004)
6464
$( "#dialog1" ).dialog({ autoOpen: false, modal: true }).dialog( "destroy" );
6565
equal( $( ".ui-widget-overlay" ).length, 0, "overlay does not exist" );
66-
equal( $.ui.dialog.overlayInstances, 0, "overlayInstances equals the number of open overlays");
66+
equal( $( document ).data( "ui-dialog-overlays" ), undefined, "ui-dialog-overlays equals the number of open overlays");
6767

6868
element = $( "#dialog1" ).dialog({ modal: true }),
6969
element2 = $( "#dialog2" ).dialog({ modal: true });
7070
equal( $( ".ui-widget-overlay" ).length, 2, "overlays created when dialogs are open" );
71-
equal( $.ui.dialog.overlayInstances, 2, "overlayInstances equals the number of open overlays" );
71+
equal( $( document ).data( "ui-dialog-overlays" ), 2, "ui-dialog-overlays equals the number of open overlays" );
7272
element.dialog( "close" );
7373
equal( $( ".ui-widget-overlay" ).length, 1, "overlay remains after closing one dialog" );
74-
equal( $.ui.dialog.overlayInstances, 1, "overlayInstances equals the number of open overlays" );
74+
equal( $( document ).data( "ui-dialog-overlays" ), 1, "ui-dialog-overlays equals the number of open overlays" );
7575
element.dialog( "destroy" );
7676
equal( $( ".ui-widget-overlay" ).length, 1, "overlay remains after destroying one dialog" );
77-
equal( $.ui.dialog.overlayInstances, 1, "overlayInstances equals the number of open overlays" );
77+
equal( $( document ).data( "ui-dialog-overlays" ), 1, "ui-dialog-overlays equals the number of open overlays" );
7878
element2.dialog( "destroy" );
7979
equal( $( ".ui-widget-overlay" ).length, 0, "overlays removed when all dialogs are destoryed" );
80-
equal( $.ui.dialog.overlayInstances, 0, "overlayInstances equals the number of open overlays" );
80+
equal( $( document ).data( "ui-dialog-overlays" ), undefined, "ui-dialog-overlays equals the number of open overlays" );
8181
});
8282

8383
asyncTest("#9000: Dialog leaves broken event handler after close/destroy in certain cases", function() {

ui/jquery.ui.dialog.js

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -724,22 +724,27 @@ $.widget( "ui.dialog", {
724724
return;
725725
}
726726

727-
var that = this,
728-
widgetFullName = this.widgetFullName;
729-
if ( !$.ui.dialog.overlayInstances ) {
730-
// Prevent use of anchors and inputs.
731-
// We use a delay in case the overlay is created from an
732-
// event that we're going to be cancelling. (#2804)
733-
this._delay(function() {
734-
// Handle .dialog().dialog("close") (#4065)
735-
if ( $.ui.dialog.overlayInstances ) {
736-
this.document.bind( "focusin.dialog", function( event ) {
737-
if ( !that._allowInteraction( event ) ) {
738-
event.preventDefault();
739-
$(".ui-dialog:visible:last .ui-dialog-content")
740-
.data( widgetFullName )._focusTabbable();
741-
}
742-
});
727+
// We use a delay in case the overlay is created from an
728+
// event that we're going to be cancelling (#2804)
729+
var isOpening = true;
730+
this._delay(function() {
731+
isOpening = false;
732+
});
733+
734+
if ( !this.document.data( "ui-dialog-overlays" ) ) {
735+
736+
// Prevent use of anchors and inputs
737+
this._on( this.document, {
738+
focusin: function( event ) {
739+
if ( isOpening ) {
740+
return;
741+
}
742+
743+
if ( !this._allowInteraction( event ) ) {
744+
event.preventDefault();
745+
this.document.find( ".ui-dialog:visible:last .ui-dialog-content" )
746+
.data( this.widgetFullName )._focusTabbable();
747+
}
743748
}
744749
});
745750
}
@@ -750,7 +755,8 @@ $.widget( "ui.dialog", {
750755
this._on( this.overlay, {
751756
mousedown: "_keepFocus"
752757
});
753-
$.ui.dialog.overlayInstances++;
758+
this.document.data( "ui-dialog-overlays",
759+
(this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
754760
},
755761

756762
_destroyOverlay: function() {
@@ -759,17 +765,20 @@ $.widget( "ui.dialog", {
759765
}
760766

761767
if ( this.overlay ) {
762-
$.ui.dialog.overlayInstances--;
763-
764-
if ( !$.ui.dialog.overlayInstances ) {
765-
this.document.unbind( "focusin.dialog" );
768+
var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
769+
770+
if ( !overlays ) {
771+
this.document
772+
.off( "focusin" )
773+
.removeData( "ui-dialog-overlays" );
774+
} else {
775+
this.document.data( "ui-dialog-overlays", overlays );
766776
}
777+
767778
this.overlay.remove();
768779
this.overlay = null;
769780
}
770781
}
771782
});
772783

773-
$.ui.dialog.overlayInstances = 0;
774-
775784
}( jQuery ) );

0 commit comments

Comments
 (0)