Skip to content

Commit

Permalink
Resurrect buildFragment and sacrifice jQuery.clean. See gh-1117.
Browse files Browse the repository at this point in the history
  • Loading branch information
dmethvin committed Jan 8, 2013
1 parent ce67f0c commit 0ed497b
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 46 deletions.
3 changes: 1 addition & 2 deletions src/core.js
Expand Up @@ -496,8 +496,7 @@ jQuery.extend({
return [ context.createElement( parsed[1] ) ];
}

parsed = context.createDocumentFragment();
jQuery.clean( [ data ], context, parsed, scripts );
parsed = jQuery.buildFragment( [ data ], context, scripts );
if ( scripts ) {
jQuery( scripts ).remove();
}
Expand Down
48 changes: 23 additions & 25 deletions src/manipulation.js
Expand Up @@ -310,8 +310,7 @@ jQuery.fn.extend({

if ( this[0] ) {
doc = this[0].ownerDocument;
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, undefined, this );
fragment = jQuery.buildFragment( args, doc, false, this );
first = fragment.firstChild;

if ( fragment.childNodes.length === 1 ) {
Expand Down Expand Up @@ -556,7 +555,7 @@ function getAll( context, tag ) {
found;
}

// Used in clean, fixes the defaultChecked property
// Used in buildFragment, fixes the defaultChecked property
function fixDefaultChecked( elem ) {
if ( manipulation_rcheckableType.test( elem.type ) ) {
elem.defaultChecked = elem.checked;
Expand Down Expand Up @@ -619,9 +618,10 @@ jQuery.extend({
return clone;
},

clean: function( elems, context, fragment, scripts, selection ) {
buildFragment: function( elems, context, scripts, selection ) {
var elem, i, j, tmp, tag, wrap, tbody,
ret = [],
fragment = context.createDocumentFragment(),
safe = context === document && safeFragment;

// Ensure that context is a document
Expand Down Expand Up @@ -708,37 +708,35 @@ jQuery.extend({
jQuery.grep( getAll( ret, "input" ), fixDefaultChecked );
}

if ( fragment ) {
for ( i = 0; (elem = ret[i]) != null; i++ ) {
safe = jQuery.contains( elem.ownerDocument, elem );
for ( i = 0; (elem = ret[i]) != null; i++ ) {
safe = jQuery.contains( elem.ownerDocument, elem );

// Append to fragment
// #4087 - If origin and destination elements are the same, and this is
// that element, do not append to fragment
if ( !selection || jQuery.inArray( elem, selection ) === -1 ) {
fragment.appendChild( elem );
}
tmp = getAll( elem, "script" );
// Append to fragment
// #4087 - If origin and destination elements are the same, and this is
// that element, do not append to fragment
if ( !selection || jQuery.inArray( elem, selection ) === -1 ) {
fragment.appendChild( elem );
}
tmp = getAll( elem, "script" );

// Preserve script evaluation history
if ( safe ) {
setGlobalEval( tmp );
}
// Preserve script evaluation history
if ( safe ) {
setGlobalEval( tmp );
}

// Capture executables
if ( scripts ) {
for ( j = 0; (elem = tmp[j]) != null; j++ ) {
if ( rscriptType.test( elem.type || "" ) ) {
scripts.push( elem );
}
// Capture executables
if ( scripts ) {
for ( j = 0; (elem = tmp[j]) != null; j++ ) {
if ( rscriptType.test( elem.type || "" ) ) {
scripts.push( elem );
}
}
}
}

elem = tmp = safe = null;

return ret;
return fragment;
},

cleanData: function( elems, /* internal */ acceptData ) {
Expand Down
9 changes: 8 additions & 1 deletion test/unit/core.js
Expand Up @@ -1210,7 +1210,7 @@ test("jQuery.proxy", function(){
});

test("jQuery.parseHTML", function() {
expect( 13 );
expect( 17 );

var html, nodes;

Expand All @@ -1237,6 +1237,13 @@ test("jQuery.parseHTML", function() {
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)" );

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(){
Expand Down
18 changes: 0 additions & 18 deletions test/unit/manipulation.js
Expand Up @@ -672,24 +672,6 @@ test( "append HTML5 sectioning elements (Bug #6485)", function() {
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 ) {
test( "HTML5 Elements inherit styles from style rules (Bug #10501)", function() {

Expand Down

0 comments on commit 0ed497b

Please sign in to comment.