From: jeresig <jeresig@gmail.com>
Date: Fri, 24 Sep 2010 20:24:07 +0000 (-0400)
Subject: Allow data to be bound to Flash objects (but still stopping short of attaching to... 
X-Git-Url: http://git.asbjorn.biz/?a=commitdiff_plain;h=76db8a98220b6d76e98536b9578919bfb70048ed;p=jquery.git

Allow data to be bound to Flash objects (but still stopping short of attaching to applets. Fixes #6121.
---

diff --git a/src/data.js b/src/data.js
index ac082dd..448e243 100644
--- a/src/data.js
+++ b/src/data.js
@@ -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;
 		}
 
@@ -85,7 +86,7 @@ jQuery.extend({
 	},
 
 	removeData: function( elem, name ) {
-		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+		if ( !jQuery.acceptData( elem ) ) {
 			return;
 		}
 
@@ -126,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;
 	}
 });
 
diff --git a/test/unit/data.js b/test/unit/data.js
index 1163ddc..25d5196 100644
--- a/test/unit/data.js
+++ b/test/unit/data.js
@@ -24,6 +24,24 @@ test("expando", function(){
 	equals( id.foo, "bar", "jQuery.data worked correctly" );
 });
 
+test("jQuery.acceptData", function() {
+	expect(7);
+
+	ok( jQuery.acceptData( document ), "document" );
+	ok( jQuery.acceptData( document.documentElement ), "documentElement" );
+	ok( jQuery.acceptData( {} ), "object" );
+	ok( !jQuery.acceptData( document.createElement("embed") ), "embed" );
+	ok( !jQuery.acceptData( document.createElement("applet") ), "applet" );
+
+	var flash = document.createElement("object");
+	flash.setAttribute("classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
+	ok( jQuery.acceptData( flash ), "flash" );
+
+	var applet = document.createElement("object");
+	applet.setAttribute("classid", "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93");
+	ok( !jQuery.acceptData( applet ), "applet" );
+});
+
 test("jQuery.data", function() {
 	expect(13);
 	var div = document.createElement("div");