]> source.dussan.org Git - jquery.git/commitdiff
Elements created from html strings have a parentnode. Fixes #12392
authorOleg <markelog@gmail.com>
Fri, 26 Oct 2012 00:41:47 +0000 (20:41 -0400)
committerRick Waldron <waldron.rick@gmail.com>
Fri, 26 Oct 2012 00:41:47 +0000 (20:41 -0400)
src/manipulation.js
test/unit/manipulation.js

index f0f65ecff292077b21e1cde95034c42663c4f018..55fe524574d8224a7cb222b51a34eb648fa82133 100644 (file)
@@ -1,6 +1,6 @@
 function createSafeFragment( document ) {
        var list = nodeNames.split( "|" ),
-       safeFrag = document.createDocumentFragment();
+               safeFrag = document.createDocumentFragment();
 
        if ( safeFrag.createElement ) {
                while ( list.length ) {
@@ -49,9 +49,9 @@ wrapMap.th = wrapMap.td;
 // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
 // unless wrapped in a div with non-breaking characters in front of it.
 if ( !jQuery.support.htmlSerialize ) {
-       wrapMap._default = [ 1, "X<div>", "</div>" ];
+       wrapMap._default = [ 1, "X<div>", "" ];
        // Fixes #11280
-       wrapMap.param = [ 1, "X<object>", "</object>" ];
+       wrapMap.param = [ 1, "X<object>", "" ];
        // Fixes #11280. HTMLParam name attribute added to avoid IE6-8 parsing issue.
        addMandatoryAttributes = function( elem ) {
                // If it's a param
@@ -650,7 +650,7 @@ jQuery.extend({
        },
 
        clean: function( elems, context, fragment, scripts ) {
-               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, handleScript, jsTags,
+               var i, j, elem, tag, wrap, depth, parent, div, hasBody, tbody, handleScript, jsTags,
                        safe = context === document && safeFragment,
                        ret = [];
 
@@ -676,8 +676,7 @@ jQuery.extend({
                                } else {
                                        // Ensure a safe container in which to render the html
                                        safe = safe || createSafeFragment( context );
-                                       div = context.createElement("div");
-                                       safe.appendChild( div );
+                                       div = div || safe.appendChild( context.createElement("div") );
 
                                        // Fix "XHTML"-style tags in all browsers
                                        elem = elem.replace(rxhtmlTag, "<$1></$2>");
@@ -719,9 +718,10 @@ jQuery.extend({
                                        }
 
                                        elem = div.childNodes;
+                                       parent = div;
 
-                                       // Take out of fragment container (we need a fresh div each time)
-                                       div.parentNode.removeChild( div );
+                                       // Remember the top-level container for proper cleanup
+                                       div = safe.lastChild;
                                }
                        }
 
@@ -729,14 +729,31 @@ jQuery.extend({
                                ret.push( elem );
                        } else {
                                jQuery.merge( ret, elem );
+
+                               // Fix #12392
+                               if ( parent ) {
+
+                                       // for WebKit and IE > 9
+                                       parent.textContent = "";
+
+                                       // for oldIE
+                                       while ( parent.firstChild ) {
+                                               parent.removeChild( parent.firstChild );
+                                       }
+
+                                       parent = null;
+                               }
                        }
                }
 
                // Fix #11356: Clear elements from safeFragment
                if ( div ) {
-                       elem = div = safe = null;
+                       safe.removeChild( div );
                }
 
+               elem = div = safe = null;
+
+
                // Reset defaultChecked for any radios and checkboxes
                // about to be appended to the DOM in IE 6/7 (#8060)
                if ( !jQuery.support.appendChecked ) {
index 7b5fee19778043735dd63b2125b81ffdd7590435..06e8b305027a2dcdcb10f52988b025b1519ad483 100644 (file)
@@ -473,11 +473,11 @@ test("append(param) to object, see #11280", function() {
        expect(11);
 
        var objectElement = document.createElement("object"),
-           $objectElement = jQuery( objectElement ),
-           paramElement = jQuery("<param type='wmode' value='transparent'/>"),
-           paramElement2 = jQuery("<param name='' type='wmode2' value='transparent2' />"),
-           paramElement3 = jQuery("<param type='wmode' name='foo' >"),
-           newObject = jQuery("<object><param type='foo' ><param name='' value='foo2'/><param type='baz' name='bar'></object>");
+               $objectElement = jQuery( objectElement ),
+               paramElement = jQuery("<param type='wmode' value='transparent'/>"),
+               paramElement2 = jQuery("<param name='' type='wmode2' value='transparent2' />"),
+               paramElement3 = jQuery("<param type='wmode' name='foo' >"),
+               newObject = jQuery("<object><param type='foo' ><param name='' value='foo2'/><param type='baz' name='bar'></object>");
 
        equal( objectElement.childNodes.length, 0, "object did not have childNodes previously" );
 
@@ -613,6 +613,23 @@ 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 () {
                expect(1);