Skip to content

Commit b6a7d02

Browse files
committed
Fix #12347 and #12384. Use a fresh div in jQuery.clean each time.
Regression was introduced in 22ad872 most likely because the clown who fixed http://bugs.jquery.com/ticket/4011 didn't add a unit test.
1 parent 7d076f5 commit b6a7d02

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/manipulation.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -638,8 +638,8 @@ jQuery.extend({
638638
},
639639

640640
clean: function( elems, context, fragment, scripts ) {
641-
var j, safe, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
642-
i = 0,
641+
var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
642+
safe = context === document && safeFragment,
643643
ret = [];
644644

645645
// Ensure that context is a document
@@ -648,7 +648,7 @@ jQuery.extend({
648648
}
649649

650650
// Use the already-created safe fragment if context permits
651-
for ( safe = context === document && safeFragment; (elem = elems[i]) != null; i++ ) {
651+
for ( i = 0; (elem = elems[i]) != null; i++ ) {
652652
if ( typeof elem === "number" ) {
653653
elem += "";
654654
}
@@ -664,7 +664,8 @@ jQuery.extend({
664664
} else {
665665
// Ensure a safe container in which to render the html
666666
safe = safe || createSafeFragment( context );
667-
div = div || safe.appendChild( context.createElement("div") );
667+
div = context.createElement("div");
668+
safe.appendChild( div );
668669

669670
// Fix "XHTML"-style tags in all browsers
670671
elem = elem.replace(rxhtmlTag, "<$1></$2>");
@@ -707,21 +708,20 @@ jQuery.extend({
707708

708709
elem = div.childNodes;
709710

710-
// Remember the top-level container for proper cleanup
711-
div = safe.lastChild;
711+
// Take out of fragment container (we need a fresh div each time)
712+
div.parentNode.removeChild( div );
712713
}
713714
}
714715

715716
if ( elem.nodeType ) {
716717
ret.push( elem );
717718
} else {
718-
ret = jQuery.merge( ret, elem );
719+
jQuery.merge( ret, elem );
719720
}
720721
}
721722

722723
// Fix #11356: Clear elements from safeFragment
723724
if ( div ) {
724-
safe.removeChild( div );
725725
elem = div = safe = null;
726726
}
727727

test/unit/manipulation.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1934,6 +1934,20 @@ test("checked state is cloned with clone()", function(){
19341934
equal( jQuery(elem).clone().attr("id","clone")[0].checked, true, "Checked true state correctly cloned" );
19351935
});
19361936

1937+
test("manipulate mixed jQuery and text (#12384, #12346)", function() {
1938+
expect(2);
1939+
1940+
var div = jQuery("<div>a</div>").append( "&nbsp;", jQuery("<span>b</span>"), "&nbsp;", jQuery("<span>c</span>") ),
1941+
nbsp = String.fromCharCode(160);
1942+
equal( div.text(), "a" + nbsp + "b" + nbsp+ "c", "Appending mixed jQuery with text nodes" );
1943+
1944+
div = jQuery("<div><div></div></div>")
1945+
.find("div")
1946+
.after("<p>a</p>", "<p>b</p>" )
1947+
.parent();
1948+
equal( div.find("*").length, 3, "added 2 paragraphs after inner div" );
1949+
});
1950+
19371951
testIframeWithCallback( "buildFragment works even if document[0] is iframe's window object in IE9/10 (#12266)", "manipulation/iframe-denied.html", function( test ) {
19381952
expect( 1 );
19391953

0 commit comments

Comments
 (0)