Commit c9bf5c5e authored by Oleg's avatar Oleg Committed by Dave Methvin

Bring back jQuery.buildFragment and remove jQuery.clean

parent 054daa20
...@@ -470,11 +470,12 @@ jQuery.extend({ ...@@ -470,11 +470,12 @@ jQuery.extend({
return [ context.createElement( parsed[1] ) ]; return [ context.createElement( parsed[1] ) ];
} }
parsed = context.createDocumentFragment(); parsed = jQuery.buildFragment( [ data ], context, scripts );
jQuery.clean( [ data ], context, parsed, scripts );
if ( scripts ) { if ( scripts ) {
jQuery( scripts ).remove(); jQuery( scripts ).remove();
} }
return jQuery.merge( [], parsed.childNodes ); return jQuery.merge( [], parsed.childNodes );
}, },
......
...@@ -268,7 +268,7 @@ jQuery.fn.extend({ ...@@ -268,7 +268,7 @@ jQuery.fn.extend({
l = this.length, l = this.length,
set = this, set = this,
iNoClone = l - 1, iNoClone = l - 1,
value = args[0], value = args[ 0 ],
isFunction = jQuery.isFunction( value ); isFunction = jQuery.isFunction( value );
// We can't cloneNode fragments that contain checked, in WebKit // We can't cloneNode fragments that contain checked, in WebKit
...@@ -283,9 +283,7 @@ jQuery.fn.extend({ ...@@ -283,9 +283,7 @@ jQuery.fn.extend({
} }
if ( l ) { if ( l ) {
doc = this[ 0 ].ownerDocument; fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, undefined, this );
first = fragment.firstChild; first = fragment.firstChild;
if ( fragment.childNodes.length === 1 ) { if ( fragment.childNodes.length === 1 ) {
...@@ -423,17 +421,12 @@ jQuery.extend({ ...@@ -423,17 +421,12 @@ jQuery.extend({
return clone; return clone;
}, },
clean: function( elems, context, fragment, scripts, selection ) { buildFragment: function( elems, context, scripts, selection ) {
var elem, tmp, tag, wrap, j, ll, var elem, tmp, tag, wrap, j, ll, contains,
fragment = context.createDocumentFragment(),
i = 0, i = 0,
l = elems.length, l = elems.length,
ret = [], nodes = [];
container = context === document && fragment;
// Ensure that context is a document
if ( !context || typeof context.createDocumentFragment === "undefined" ) {
context = document;
}
for ( ; i < l; i++ ) { for ( ; i < l; i++ ) {
elem = elems[ i ]; elem = elems[ i ];
...@@ -442,18 +435,15 @@ jQuery.extend({ ...@@ -442,18 +435,15 @@ jQuery.extend({
// Add nodes directly // Add nodes directly
if ( jQuery.type( elem ) === "object" ) { if ( jQuery.type( elem ) === "object" ) {
core_push.apply( ret, elem.nodeType ? [ elem ] : elem ); core_push.apply( nodes, elem.nodeType ? [ elem ] : elem );
// Convert non-html into a text node // Convert non-html into a text node
} else if ( !rhtml.test( elem ) ) { } else if ( !rhtml.test( elem ) ) {
ret.push( context.createTextNode( elem ) ); nodes.push( context.createTextNode( elem ) );
// Convert html into DOM nodes // Convert html into DOM nodes
} else { } else {
tmp = tmp || fragment.appendChild( context.createElement("div") );
// Ensure a safe container
container = container || context.createDocumentFragment();
tmp = tmp || container.appendChild( context.createElement("div") );
// Deserialize a standard representation // Deserialize a standard representation
tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase(); tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase();
...@@ -461,59 +451,57 @@ jQuery.extend({ ...@@ -461,59 +451,57 @@ jQuery.extend({
tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ); tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" );
// Descend through wrappers to the right content // Descend through wrappers to the right content
j = wrap[0]; j = wrap[ 0 ];
while ( j-- ) { while ( j-- ) {
tmp = tmp.lastChild; tmp = tmp.firstChild;
} }
core_push.apply( ret, tmp.childNodes ); core_push.apply( nodes, tmp.childNodes );
// Fix #12392 - remove childNodes parent // Remember the top-level container
tmp.textContent = ""; tmp = fragment.firstChild;
// Remember the top-level container for proper cleanup // Fixes #12346
tmp = container.lastChild; // Support: Webkit, IE
tmp.textContent = "";
} }
} }
} }
// Fix #11356: Clear elements from fragment // Remove wrapper from fragment
if ( tmp ) { fragment.textContent = "";
container.removeChild( tmp );
}
if ( fragment ) { for ( i = 0, l = nodes.length; i < l; i++ ) {
for ( i = 0, l = ret.length; i < l; i++ ) { elem = nodes[ i ];
elem = ret[ i ]; contains = jQuery.contains( elem.ownerDocument, elem );
container = jQuery.contains( elem.ownerDocument, elem );
// Append to fragment // #4087 - If origin and destination elements are the same, and this is
// #4087 - If origin and destination elements are the same, and this is // that element, do not do anything
// that element, do not append to fragment if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
if ( !selection || jQuery.inArray( elem, selection ) === -1 ) { continue;
fragment.appendChild( elem ); }
}
tmp = getAll( elem, "script" );
// Preserve script evaluation history // Append to fragment
if ( container ) { tmp = getAll( fragment.appendChild( elem ), "script" );
setGlobalEval( tmp );
}
// Capture executables // Preserve script evaluation history
if ( scripts ) { if ( contains ) {
for ( j = 0, ll = tmp.length; j < ll; j++ ) { setGlobalEval( tmp );
elem = tmp[ j ]; }
if ( rscriptType.test( elem.type || "" ) ) { // Capture executables
scripts.push( elem ); if ( scripts ) {
} for ( j = 0, ll = tmp.length; j < ll; j++ ) {
elem = tmp[ j ];
if ( rscriptType.test( elem.type || "" ) ) {
scripts.push( elem );
} }
} }
} }
} }
return ret; return fragment;
}, },
cleanData: function( elems, /* internal */ acceptData ) { cleanData: function( elems, /* internal */ acceptData ) {
......
...@@ -1210,7 +1210,7 @@ test("jQuery.proxy", function(){ ...@@ -1210,7 +1210,7 @@ test("jQuery.proxy", function(){
}); });
test("jQuery.parseHTML", function() { test("jQuery.parseHTML", function() {
expect( 13 ); expect( 17 );
var html, nodes; var html, nodes;
...@@ -1237,6 +1237,14 @@ test("jQuery.parseHTML", function() { ...@@ -1237,6 +1237,14 @@ test("jQuery.parseHTML", function() {
equal( jQuery.parseHTML( "\t<div></div>" )[0].nodeValue, "\t", "Preserve leading whitespace" ); equal( jQuery.parseHTML( "\t<div></div>" )[0].nodeValue, "\t", "Preserve leading whitespace" );
equal( jQuery.parseHTML(" <div/> ")[0].nodeType, 3, "Leading spaces are treated as text nodes (#11290)" ); equal( jQuery.parseHTML(" <div/> ")[0].nodeType, 3, "Leading spaces are treated as text nodes (#11290)" );
html = jQuery.parseHTML( "<div>test div</div>" );
equal( html[ 0 ].parentNode.nodeType, 11, "parentNode should be documentFragment" );
equal( html[ 0 ].innerHTML, "test div", "Content should be preserved" );
equal( jQuery.parseHTML("<span><span>").length, 1, "Incorrect html-strings should not break anything" );
equal( jQuery.parseHTML("<td><td>")[ 1 ].parentNode.nodeType, 11, "parentNode should be documentFragment" );
}); });
test("jQuery.parseJSON", function(){ test("jQuery.parseJSON", function(){
......
...@@ -463,12 +463,13 @@ var testAppend = function( valueObj ) { ...@@ -463,12 +463,13 @@ var testAppend = function( valueObj ) {
jQuery.each( "thead tbody tfoot colgroup caption tr th td".split(" "), function( i, name ) { jQuery.each( "thead tbody tfoot colgroup caption tr th td".split(" "), function( i, name ) {
$table.append( valueObj( "<" + name + "/>" ) ); $table.append( valueObj( "<" + name + "/>" ) );
equal( $table.find( name ).length, 1, "Append " + name ); equal( $table.find( name ).length, 1, "Append " + name );
ok( jQuery.clean( ["<" + name + "/>"] ).length, name + " wrapped correctly" ); ok( jQuery.parseHTML( "<" + name + "/>" ).length, name + " wrapped correctly" );
}); });
jQuery("#table colgroup").append( valueObj("<col/>") ); jQuery("#table colgroup").append( valueObj("<col/>") );
equal( jQuery("#table colgroup col").length, 1, "Append col" ); equal( jQuery("#table colgroup col").length, 1, "Append col" );
jQuery("#form") jQuery("#form")
.append( valueObj("<select id='appendSelect1'></select>") ) .append( valueObj("<select id='appendSelect1'></select>") )
.append( valueObj("<select id='appendSelect2'><option>Test</option></select>") ); .append( valueObj("<select id='appendSelect2'><option>Test</option></select>") );
...@@ -641,24 +642,6 @@ test( "append HTML5 sectioning elements (Bug #6485)", function() { ...@@ -641,24 +642,6 @@ test( "append HTML5 sectioning elements (Bug #6485)", function() {
equal( aside.length, 1, "HTML5 elements do not collapse their children" ); equal( aside.length, 1, "HTML5 elements do not collapse their children" );
}); });
test( "jQuery.clean, #12392", function() {
expect( 6 );
var elems = jQuery.clean( [ "<div>test div</div>", "<p>test p</p>" ] );
ok( elems[ 0 ].parentNode == null || elems[ 0 ].parentNode.nodeType === 11, "parentNode should be documentFragment or null" );
ok( elems[ 1 ].parentNode == null || elems[ 1 ].parentNode.nodeType === 11, "parentNode should be documentFragment or null" );
equal( elems[ 0 ].innerHTML, "test div", "Content should be preserved" );
equal( elems[ 1 ].innerHTML, "test p", "Content should be preserved" );
equal( jQuery.clean([ "<span><span>" ]).length, 1, "Incorrect html-strings should not break anything" );
elems = jQuery.clean([ "<td><td>" ]);
ok( elems[ 1 ].parentNode == null || elems[ 1 ].parentNode.nodeType === 11, "parentNode should be documentFragment or null" );
});
if ( jQuery.css ) { if ( jQuery.css ) {
test( "HTML5 Elements inherit styles from style rules (Bug #10501)", function() { test( "HTML5 Elements inherit styles from style rules (Bug #10501)", function() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment