]> source.dussan.org Git - jquery.git/commitdiff
Fix #8335: Avoid memory leak by never setting data on non-element non-document nodes...
authordanilsomsikov <danilasomsikov@gmail.com>
Fri, 11 Jan 2013 15:04:50 +0000 (16:04 +0100)
committerRichard Gibson <richard.gibson@gmail.com>
Wed, 16 Jan 2013 19:39:53 +0000 (14:39 -0500)
(cherry picked from commit cc324abf739669bd2a4669742c994b86c4ad467b)

src/data.js
test/unit/data.js

index d5a25ff6c9fb39fc53c4542fbc27e4fa7b1e733a..eaa483813c5ac68486a22a8ed7dfa0190ac7de58 100644 (file)
@@ -223,6 +223,11 @@ jQuery.extend({
 
        // A method for determining if a DOM node can handle the data expando
        acceptData: function( elem ) {
+               // Do not set data on non-element because it will not be cleared (#8335).
+               if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+                       return false;
+               }
+
                var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
 
                // nodes accept data unless otherwise specified; rejection can be conditional
index c09149b65e34e73c309f86e1c0b9c9d7100e1c31..8f86d00c4d1913e50478f4503c30d25bd31c487d 100644 (file)
@@ -133,8 +133,16 @@ test("Expando cleanup", 4, function() {
        jQuery(div).remove();
 });
 
+test("Data is not being set on comment and text nodes", function() {
+       expect(2);
+
+       ok( !jQuery.hasData( jQuery("<!-- comment -->").data("foo", 0) ) );
+       ok( !jQuery.hasData( jQuery("<span>text</span>").contents().data("foo", 0) ) );
+
+});
+
 test("jQuery.acceptData", function() {
-       expect(7);
+       expect(9);
 
        ok( jQuery.acceptData( document ), "document" );
        ok( jQuery.acceptData( document.documentElement ), "documentElement" );
@@ -149,6 +157,9 @@ test("jQuery.acceptData", function() {
        var applet = document.createElement("object");
        applet.setAttribute("classid", "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93");
        ok( !jQuery.acceptData( applet ), "applet" );
+
+       ok( !jQuery.acceptData( document.createComment("") ), "comment" );
+       ok( !jQuery.acceptData( document.createTextNode("") ), "text" );
 });
 
 test(".data()", function() {