Allow data to be bound to Flash objects (but still stopping short of attaching to...
[jquery.git] / src / data.js
index b7a6ab9..448e243 100644 (file)
@@ -17,12 +17,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;
                }
 
@@ -52,9 +53,10 @@ jQuery.extend({
                // want to manipulate it.
                if ( typeof name === "object" ) {
                        if ( isNode ) {
-                               cache[ id ] = jQuery.extend(true, {}, name);
+                               cache[ id ] = jQuery.extend(cache[ id ], name);
+
                        } else {
-                               store = jQuery.extend(true, {}, name);
+                               store = jQuery.extend(cache[ id ], name);
                                cache[ id ] = function() {
                                        return store;
                                };
@@ -63,6 +65,7 @@ jQuery.extend({
                } else if ( !cache[ id ] ) {
                        if ( isNode ) {
                                cache[ id ] = {};
+
                        } else {
                                store = {};
                                cache[ id ] = function() {
@@ -83,7 +86,7 @@ jQuery.extend({
        },
 
        removeData: function( elem, name ) {
-               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+               if ( !jQuery.acceptData( elem ) ) {
                        return;
                }
 
@@ -124,6 +127,19 @@ jQuery.extend({
                                delete cache[ id ];
                        }
                }
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               if ( elem.nodeName ) {
+                       match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+                       if ( match ) {
+                               return !(match === true || elem.getAttribute("classid") !== match);
+                       }
+               }
+
+               return true;
        }
 });