From efdb8a46e4213dcf69f792c42c234c6b112ba471 Mon Sep 17 00:00:00 2001 From: Richard Gibson Date: Mon, 9 Jan 2017 11:37:12 -0800 Subject: [PATCH] Manipulation: Restrict the tbody search to child nodes For performance, use a querySelectorAll path instead of Javascript iteration. http://codepen.io/anon/pen/vywJjx?editors=1010 Fixes gh-3439 Closes gh-3463 --- src/manipulation.js | 3 ++- test/unit/manipulation.js | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/manipulation.js b/src/manipulation.js index 9b4f5e451..4f79f8998 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -47,11 +47,12 @@ var rscriptTypeMasked = /^true\/(.*)/, rcleanScript = /^\s*\s*$/g; +// Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; + return jQuery( ">tbody", elem )[ 0 ] || elem; } return elem; diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 911852451..b1c04dbd5 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -2730,6 +2730,26 @@ QUnit.test( "Make sure col element is appended correctly", function( assert ) { assert.strictEqual( table.find( "td" ).width(), 150 ); } ); +QUnit.test( "Make sure tr is not appended to the wrong tbody (gh-3439)", function( assert ) { + assert.expect( 1 ); + + var htmlOut, + htmlIn = + "" + + "
nested
" + + "", + newRow = "added", + htmlExpected = htmlIn.replace( "", "" + newRow ), + table = supportjQuery( "" ).html( htmlIn ).appendTo( "#qunit-fixture" )[ 0 ]; + + jQuery( table ).append( newRow ); + + // Lowercase and replace spaces to remove possible browser inconsistencies + htmlOut = table.innerHTML.toLowerCase().replace( /\s/g, "" ); + + assert.strictEqual( htmlOut, htmlExpected ); +} ); + QUnit.test( "Insert script with data-URI (gh-1887)", 1, function( assert ) { Globals.register( "testFoo" ); Globals.register( "testSrcFoo" ); -- 2.39.5