Skip to content

Commit cab4c46

Browse files
fracmakscottgonzalez
authored andcommitted
Dialog: Handle escape for all overlays. Fixes #8300 - Dialog: Incorrect behavior for ESCAPE with multiple modal dialogs.
1 parent 32f356b commit cab4c46

File tree

2 files changed

+71
-17
lines changed

2 files changed

+71
-17
lines changed

tests/unit/dialog/dialog_tickets.js

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,26 +117,76 @@ test("#6645: Missing element not found check in overlay", function(){
117117
});
118118

119119
test("#6966: Escape key closes all dialogs, not the top one", function(){
120-
expect(8);
121-
// test with close function removing dialog
122-
d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true});
120+
expect(24);
121+
// test with close function removing dialog triggered through the overlay
122+
d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true, close: function(){ d1.remove(); }});
123+
d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true, close: function(){ d2.remove(); }});
124+
125+
ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog is open');
126+
ok(d2.data('dialog') && d2.dialog('isOpen'), 'second dialog is open');
127+
128+
$( document ).simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE});
129+
ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog still open');
130+
ok(!d2.data('dialog'), 'second dialog is closed');
131+
132+
$( document ).simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE});
133+
ok(!d1.data('dialog'), 'first dialog is closed');
134+
ok(!d2.data('dialog'), 'second dialog is closed');
135+
136+
d2.remove();
137+
d1.remove();
138+
139+
// test with close function removing dialog triggered through the dialog
140+
d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true, close: function(){ d1.remove(); }});
123141
d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true, close: function(){ d2.remove(); }});
142+
143+
ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog is open');
144+
ok(d2.data('dialog') && d2.dialog('isOpen'), 'second dialog is open');
145+
146+
d2.simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE});
147+
ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog still open');
148+
ok(!d2.data('dialog'), 'second dialog is closed');
149+
150+
d1.simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE});
151+
ok(!d1.data('dialog'), 'first dialog is closed');
152+
ok(!d2.data('dialog'), 'second dialog is closed');
153+
154+
d2.remove();
155+
d1.remove();
156+
157+
// test without close function removing dialog
158+
d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true});
159+
d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true});
160+
124161
ok(d1.dialog("isOpen"), 'first dialog is open');
125162
ok(d2.dialog("isOpen"), 'second dialog is open');
163+
126164
d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
127165
ok(d1.dialog("isOpen"), 'first dialog still open');
128-
ok(!d2.data('dialog'), 'second dialog is closed');
166+
ok(!d2.dialog("isOpen"), 'second dialog is closed');
167+
168+
d1.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
169+
ok(!d1.dialog("isOpen"), 'first dialog is closed');
170+
ok(!d2.dialog("isOpen"), 'second dialog is closed');
171+
129172
d2.remove();
130173
d1.remove();
131174

132-
// test without close function removing dialog
175+
// test without close function removing dialog triggered through the overlay
133176
d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true});
134177
d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true});
178+
135179
ok(d1.dialog("isOpen"), 'first dialog is open');
136180
ok(d2.dialog("isOpen"), 'second dialog is open');
137-
d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
181+
182+
$( document ).simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
138183
ok(d1.dialog("isOpen"), 'first dialog still open');
139184
ok(!d2.dialog("isOpen"), 'second dialog is closed');
185+
186+
$( document ).simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE});
187+
ok(!d1.dialog("isOpen"), 'first dialog is closed');
188+
ok(!d2.dialog("isOpen"), 'second dialog is closed');
189+
140190
d2.remove();
141191
d1.remove();
142192
});

ui/jquery.ui.dialog.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -713,21 +713,25 @@ $.extend( $.ui.dialog.overlay, {
713713
}
714714
}, 1 );
715715

716-
// allow closing by pressing the escape key
717-
$( document ).bind( "keydown.dialog-overlay", function( event ) {
718-
if ( dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
719-
event.keyCode === $.ui.keyCode.ESCAPE ) {
720-
721-
dialog.close( event );
722-
event.preventDefault();
723-
}
724-
});
725-
726716
// handle window resize
727717
$( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
728718
}
729-
719+
730720
var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
721+
722+
// allow closing by pressing the escape key
723+
$( document ).bind( "keydown.dialog-overlay", function( event ) {
724+
var instances = $.ui.dialog.overlay.instances;
725+
// only react to the event if we're the top overlay
726+
if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
727+
dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
728+
event.keyCode === $.ui.keyCode.ESCAPE ) {
729+
730+
dialog.close( event );
731+
event.preventDefault();
732+
}
733+
});
734+
731735
$el.appendTo( document.body ).css({
732736
width: this.width(),
733737
height: this.height()

0 commit comments

Comments
 (0)