aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Waldron <waldron.rick@gmail.com>2013-04-01 12:48:30 -0400
committerRick Waldron <waldron.rick@gmail.com>2013-04-01 12:48:30 -0400
commit332a490573bbbd9e7df1381bde8f590240cb8679 (patch)
treea5b0e46fb4a25f41a146bb9e50ce0f4240588904
parent1f530e286755416369f4452d20f5ab6bb175451d (diff)
downloadjquery-332a490573bbbd9e7df1381bde8f590240cb8679.tar.gz
jquery-332a490573bbbd9e7df1381bde8f590240cb8679.zip
Avoid side-effects when calling jQuery.hasData
Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
-rw-r--r--src/data.js10
-rw-r--r--test/unit/data.js11
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;