From 332a490573bbbd9e7df1381bde8f590240cb8679 Mon Sep 17 00:00:00 2001 From: Rick Waldron Date: Mon, 1 Apr 2013 12:48:30 -0400 Subject: [PATCH] Avoid side-effects when calling jQuery.hasData Signed-off-by: Rick Waldron --- src/data.js | 10 ++++++++-- test/unit/data.js | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/data.js b/src/data.js index 585d78b20..189de6259 100644 --- a/src/data.js +++ b/src/data.js @@ -21,11 +21,17 @@ function Data() { Data.uid = 1; Data.prototype = { - key: function( owner ) { + key: function( owner, options ) { var descriptor = {}, // Check if the owner object already has a cache key unlock = owner[ this.expando ]; + // `readonly` calls from hasData, on owners with no key + // should not create new/empty cache records + if ( !unlock && (options && options.readonly) ) { + return null; + } + // If not, create one if ( !unlock ) { unlock = Data.uid++; @@ -158,7 +164,7 @@ Data.prototype = { }, hasData: function( owner ) { return !jQuery.isEmptyObject( - this.cache[ this.key( owner ) ] + this.cache[ this.key( owner, { readonly: true }) ] || {} ); }, discard: function( owner ) { diff --git a/test/unit/data.js b/test/unit/data.js index d813ec82d..2f9c25ed5 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -51,6 +51,17 @@ test( "jQuery._data & _removeData, expected returns", function() { ); }); +test( "jQuery.hasData no side effects", function() { + expect(1); + var obj = {}; + + jQuery.hasData( obj ); + + equal( Object.getOwnPropertyNames( obj ).length, 0, + "No data expandos where added when calling jQuery.hasData(o)" + ); +}); + function dataTests (elem) { var oldCacheLength, dataObj, internalDataObj, expected, actual; -- 2.39.5