From 3cad5c435aa2333c39baa55a8bceb2b6bf1e2721 Mon Sep 17 00:00:00 2001 From: ac-mmi <79802170+ac-mmi@users.noreply.github.com> Date: Wed, 11 Sep 2024 03:48:53 +0530 Subject: Manipulation: Make jQuery.cleanData not skip elements during cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When passing a result of `getElementByTagsName` to `jQuery.cleanData`, convert it to an array first. Otherwise, a live NodeList is passed and if any of the event cleanups remove the element itself, a collection is modified during the iteration, making `jQuery.cleanData` skip cleanup for some elements. Fixes gh-5214 Closes gh-5523 Co-authored-by: Michał Gołębiowski-Owczarek Co-authored-by: Richard Gibson --- test/unit/manipulation.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'test') diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index ff1995cb1..8300b4b9c 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -3099,3 +3099,43 @@ testIframe( } ); } ); + +QUnit.test( "should handle node removal in event's remove hook (gh-5214)", function( assert ) { + + assert.expect( 4 ); + + jQuery( + "
" + + "
" + + " Guarded 1" + + "
" + + "
" + + " Guarded 2" + + "
" + + "
" + + " Guarded 3" + + "
" + + "
" + ).appendTo( "#qunit-fixture" ); + + // Define the custom event handler + jQuery.event.special.removeondestroy = { + remove: function( ) { + var $t = jQuery( this ); + assert.step( $t.data( "elt" ) ); + if ( $t.is( ".removeself" ) ) { + $t.remove(); + } + } + }; + + // Attach an empty handler to trigger the `remove` + // logic for the custom event when the element is removed. + jQuery( ".guarded" ).on( "removeondestroy", function( ) { } ); + + // Trigger the event's removal logic by emptying the container + jQuery( "#container" ).empty(); + + assert.verifySteps( [ "one", "two", "three" ], "All elements were processed in order" ); +} ); + -- cgit v1.2.3