Fixes acceptData defining in the global scope.
[jquery.git] / src / data.js
index abe4689..732e923 100644 (file)
@@ -1,8 +1,7 @@
 (function( jQuery ) {
 
 var windowData = {},
-       rnum = /^-?\d+(?:\.\d+)$/,
-       rbrace = /^(?:{.*}|\[.*\])$/;
+       rbrace = /^(?:\{.*\}|\[.*\])$/;
 
 jQuery.extend({
        cache: {},
@@ -17,12 +16,13 @@ jQuery.extend({
        // attempt to add expando properties to them.
        noData: {
                "embed": true,
-               "object": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
                "applet": true
        },
 
        data: function( elem, name, data ) {
-               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+               if ( !jQuery.acceptData( elem ) ) {
                        return;
                }
 
@@ -30,18 +30,17 @@ jQuery.extend({
                        windowData :
                        elem;
 
-               var id = elem[ jQuery.expando ], cache = jQuery.cache, thisCache,
-                       isNode = elem.nodeType,
-                       store;
+               var isNode = elem.nodeType,
+                       id = isNode ? elem[ jQuery.expando ] : null,
+                       cache = jQuery.cache, thisCache;
 
-               if ( !id && typeof name === "string" && data === undefined ) {
+               if ( isNode && !id && typeof name === "string" && data === undefined ) {
                        return;
                }
 
                // Get the data from the object directly
                if ( !isNode ) {
                        cache = elem;
-                       id = jQuery.expando;
 
                // Compute a unique ID for the element
                } else if ( !id ) {
@@ -52,27 +51,17 @@ jQuery.extend({
                // want to manipulate it.
                if ( typeof name === "object" ) {
                        if ( isNode ) {
-                               cache[ id ] = jQuery.extend(true, {}, name);
-                       } else {
-                               store = jQuery.extend(true, {}, name);
-                               cache[ id ] = function() {
-                                       return store;
-                               };
-                       }
+                               cache[ id ] = jQuery.extend(cache[ id ], name);
 
-               } else if ( !cache[ id ] ) {
-                       if ( isNode ) {
-                               cache[ id ] = {};
                        } else {
-                               store = {};
-                               cache[ id ] = function() {
-                                       return store;
-                               };
+                               jQuery.extend( cache, name );
                        }
-                       
+
+               } else if ( isNode && !cache[ id ] ) {
+                       cache[ id ] = {};
                }
 
-               thisCache = isNode ? cache[ id ] : cache[ id ]();
+               thisCache = isNode ? cache[ id ] : cache;
 
                // Prevent overriding the named cache with undefined values
                if ( data !== undefined ) {
@@ -83,7 +72,7 @@ jQuery.extend({
        },
 
        removeData: function( elem, name ) {
-               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+               if ( !jQuery.acceptData( elem ) ) {
                        return;
                }
 
@@ -92,11 +81,9 @@ jQuery.extend({
                        elem;
 
                var isNode = elem.nodeType,
-                       id = elem[ jQuery.expando ], cache = jQuery.cache;
-               if ( id && !isNode ) {
-                       id = id();
-               }
-               var thisCache = cache[ id ];
+                       id = isNode ? elem[ jQuery.expando ] : elem,
+                       cache = jQuery.cache,
+                       thisCache = isNode ? cache[ id ] : id;
 
                // If we want to remove a specific section of the element's data
                if ( name ) {
@@ -105,32 +92,50 @@ jQuery.extend({
                                delete thisCache[ name ];
 
                                // If we've removed all the data, remove the element's cache
-                               if ( jQuery.isEmptyObject(thisCache) ) {
+                               if ( isNode && jQuery.isEmptyObject(thisCache) ) {
                                        jQuery.removeData( elem );
                                }
                        }
 
                // Otherwise, we want to remove all of the element's data
                } else {
-                       if ( jQuery.support.deleteExpando || !isNode ) {
+                       if ( isNode && jQuery.support.deleteExpando ) {
                                delete elem[ jQuery.expando ];
 
                        } else if ( elem.removeAttribute ) {
                                elem.removeAttribute( jQuery.expando );
-                       }
 
                        // Completely remove the data cache
-                       if ( isNode ) {
+                       } else if ( isNode ) {
                                delete cache[ id ];
+
+                       // Remove all fields from the object
+                       } else {
+                               for ( var n in elem ) {
+                                       delete elem[ n ];
+                               }
+                       }
+               }
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               if ( elem.nodeName ) {
+                       var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+                       if ( match ) {
+                               return !(match === true || elem.getAttribute("classid") !== match);
                        }
                }
+
+               return true;
        }
 });
 
 jQuery.fn.extend({
        data: function( key, value ) {
-               if ( typeof key === "undefined" && this.length ) {
-                       return jQuery.data( this[0] );
+               if ( typeof key === "undefined" ) {
+                       return this.length ? jQuery.data( this[0] ) : null;
 
                } else if ( typeof key === "object" ) {
                        return this.each(function() {
@@ -158,7 +163,7 @@ jQuery.fn.extend({
                                                        data = data === "true" ? true :
                                                                data === "false" ? false :
                                                                data === "null" ? null :
-                                                               rnum.test( data ) ? parseFloat( data ) :
+                                                               !jQuery.isNaN( data ) ? parseFloat( data ) :
                                                                rbrace.test( data ) ? jQuery.parseJSON( data ) :
                                                                data;
                                                } catch( e ) {}