From cc324abf739669bd2a4669742c994b86c4ad467b Mon Sep 17 00:00:00 2001 From: danilsomsikov Date: Fri, 11 Jan 2013 16:04:50 +0100 Subject: [PATCH] Fix #8335: Avoid memory leak by never setting data on non-element non-document nodes. Close gh-1127. --- src/data.js | 5 +++++ test/unit/data.js | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/data.js b/src/data.js index d5a25ff6c..eaa483813 100644 --- a/src/data.js +++ b/src/data.js @@ -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 diff --git a/test/unit/data.js b/test/unit/data.js index 6d1d856f5..34c98140b 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -99,8 +99,16 @@ test("jQuery.data(document)", 25, function() { QUnit.expectJqData(document, "foo"); }); +test("Data is not being set on comment and text nodes", function() { + expect(2); + + ok( !jQuery.hasData( jQuery("").data("foo", 0) ) ); + ok( !jQuery.hasData( jQuery("text").contents().data("foo", 0) ) ); + +}); + test("jQuery.acceptData", function() { - expect(7); + expect(9); ok( jQuery.acceptData( document ), "document" ); ok( jQuery.acceptData( document.documentElement ), "documentElement" ); @@ -115,6 +123,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() {