From 1e8baf568365f8edc833439315f76e5efe1ba9b6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B6rn=20Zaefferer?= Date: Tue, 4 Dec 2012 01:08:34 +0100 Subject: [PATCH] Dialog: Remove the instance-storing for the overlay, just create one whenever it is needed. Heavily simplifies the code, while the memorly leak should be hardly an issue anymore, since fixed positioning restricts the overlay size to the window dimensions. Fixes #6058 - Dialog overlays are not properly reused when multiple instances of a Dialog exist. --- tests/unit/dialog/dialog_tickets.js | 11 ----------- ui/jquery.ui.dialog.js | 27 +++++++-------------------- 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/tests/unit/dialog/dialog_tickets.js b/tests/unit/dialog/dialog_tickets.js index 655f1e445..389a243b3 100644 --- a/tests/unit/dialog/dialog_tickets.js +++ b/tests/unit/dialog/dialog_tickets.js @@ -107,17 +107,6 @@ test("#6137: dialog('open') causes form elements to reset on IE7", function() { d1.remove(); }); -test("#6645: Missing element not found check in overlay", function(){ - expect(2); - var d1 = $('
Dialog 1
').dialog({modal: true}), - d2 = $('
Dialog 2
').dialog({modal: true, close: function(){ d2.remove(); }}); - - equal($.ui.dialog.overlay.instances.length, 2, 'two overlays created'); - d2.dialog('close'); - equal($.ui.dialog.overlay.instances.length, 1, 'one overlay remains after closing the 2nd overlay'); - d1.add(d2).remove(); -}); - // TODO merge this with the main destroy test test("#4980: Destroy should place element back in original DOM position", function(){ expect( 2 ); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 382008e08..77392cb19 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -661,13 +661,13 @@ $.widget("ui.dialog", { if ( !this.options.modal ) { return; } - if ( $.ui.dialog.overlay.instances.length === 0 ) { + if ( $.ui.dialog.overlayInstances === 0 ) { // prevent use of anchors and inputs // we use a setTimeout in case the overlay is created from an // event that we're going to be cancelling (see #2804) setTimeout(function() { // handle $(el).dialog().dialog('close') (see #4065) - if ( $.ui.dialog.overlay.instances.length ) { + if ( $.ui.dialog.overlayInstances ) { $( document ).bind( "focusin.dialog-overlay", function( event ) { if ( !$( event.target ).closest( ".ui-dialog").length ) { event.preventDefault(); @@ -678,40 +678,27 @@ $.widget("ui.dialog", { }, 1 ); } - // reuse old instances due to IE memory leak with alpha transparency (see #5185) - var $el = this.overlay = ( $.ui.dialog.overlay.oldInstances.pop() || $( "
" ).addClass( "ui-widget-overlay ui-front" ) ); - + var $el = this.overlay = $( "
" ).addClass( "ui-widget-overlay ui-front" ); $el.appendTo( this.document[ 0 ].body ); - this._on( $el, { mousedown: "_keepFocus" }); - - $.ui.dialog.overlay.instances.push( $el ); + $.ui.dialog.overlayInstances += 1; }, _destroyOverlay: function() { if ( !this.options.modal ) { return; } - var indexOf = $.inArray( this.overlay, $.ui.dialog.overlay.instances ); - - if ( indexOf !== -1 ) { - $.ui.dialog.overlay.oldInstances.push( $.ui.dialog.overlay.instances.splice( indexOf, 1 )[ 0 ] ); - } - - if ( $.ui.dialog.overlay.instances.length === 0 ) { + $.ui.dialog.overlayInstances -= 1; + if ( $.ui.dialog.overlayInstances === 0 ) { $( [ document, window ] ).unbind( ".dialog-overlay" ); } - this.overlay.remove(); } }); -$.ui.dialog.overlay = { - instances: [], - oldInstances: [] -}; +$.ui.dialog.overlayInstances = 0; // DEPRECATED if ( $.uiBackCompat !== false ) { -- 2.39.5