From f9996682b5739661c21548f0de3d4c4883c5119d Mon Sep 17 00:00:00 2001 From: Jay Merrifield Date: Tue, 8 Mar 2011 09:42:10 -0500 Subject: [PATCH] Dialog: Before handling escape key presses, check if the default action has been prevented. Fixes #6966 - Pressing ESC on dialog when 2 dialogs are open closes both dialogs. --- tests/unit/dialog/dialog_tickets.js | 25 +++++++++++++++++++++++++ ui/jquery.ui.dialog.js | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/tests/unit/dialog/dialog_tickets.js b/tests/unit/dialog/dialog_tickets.js index b9bf2f972..def2452de 100644 --- a/tests/unit/dialog/dialog_tickets.js +++ b/tests/unit/dialog/dialog_tickets.js @@ -88,4 +88,29 @@ test("#6645: Missing element not found check in overlay", function(){ d1.add(d2).remove(); }); +test("#6966: Escape key closes all dialogs, not the top one", function(){ + expect(8); + // test with close function removing dialog + d1 = $('
Dialog 1
').dialog({modal: true}); + d2 = $('
Dialog 2
').dialog({modal: true, close: function(){ d2.remove()}}); + ok(d1.dialog("isOpen"), 'first dialog is open'); + ok(d2.dialog("isOpen"), 'second dialog is open'); + d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); + ok(d1.dialog("isOpen"), 'first dialog still open'); + ok(!d2.data('dialog'), 'second dialog is closed'); + d2.remove(); + d1.remove(); + + // test without close function removing dialog + d1 = $('
Dialog 1
').dialog({modal: true}); + d2 = $('
Dialog 2
').dialog({modal: true}); + ok(d1.dialog("isOpen"), 'first dialog is open'); + ok(d2.dialog("isOpen"), 'second dialog is open'); + d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); + ok(d1.dialog("isOpen"), 'first dialog still open'); + ok(!d2.dialog("isOpen"), 'second dialog is closed'); + d2.remove(); + d1.remove(); +}); + })(jQuery); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 493783896..c14237b6a 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -97,7 +97,7 @@ $.widget("ui.dialog", { // TODO: move to stylesheet .css( "outline", 0 ) .keydown(function( event ) { - if ( options.closeOnEscape && event.keyCode && + if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && event.keyCode === $.ui.keyCode.ESCAPE ) { self.close( event ); event.preventDefault(); @@ -699,7 +699,7 @@ $.extend( $.ui.dialog.overlay, { // allow closing by pressing the escape key $( document ).bind( "keydown.dialog-overlay", function( event ) { - if ( dialog.options.closeOnEscape && event.keyCode && + if ( dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && event.keyCode === $.ui.keyCode.ESCAPE ) { dialog.close( event );