Commit 332a4905 authored by Rick Waldron's avatar Rick Waldron

Avoid side-effects when calling jQuery.hasData

Signed-off-by: 's avatarRick Waldron <waldron.rick@gmail.com>
parent 1f530e28
...@@ -21,11 +21,17 @@ function Data() { ...@@ -21,11 +21,17 @@ function Data() {
Data.uid = 1; Data.uid = 1;
Data.prototype = { Data.prototype = {
key: function( owner ) { key: function( owner, options ) {
var descriptor = {}, var descriptor = {},
// Check if the owner object already has a cache key // Check if the owner object already has a cache key
unlock = owner[ this.expando ]; 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 not, create one
if ( !unlock ) { if ( !unlock ) {
unlock = Data.uid++; unlock = Data.uid++;
...@@ -158,7 +164,7 @@ Data.prototype = { ...@@ -158,7 +164,7 @@ Data.prototype = {
}, },
hasData: function( owner ) { hasData: function( owner ) {
return !jQuery.isEmptyObject( return !jQuery.isEmptyObject(
this.cache[ this.key( owner ) ] this.cache[ this.key( owner, { readonly: true }) ] || {}
); );
}, },
discard: function( owner ) { discard: function( owner ) {
......
...@@ -51,6 +51,17 @@ test( "jQuery._data & _removeData, expected returns", function() { ...@@ -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) { function dataTests (elem) {
var oldCacheLength, dataObj, internalDataObj, expected, actual; var oldCacheLength, dataObj, internalDataObj, expected, actual;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment