aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeresig <jeresig@gmail.com>2010-09-24 16:24:07 -0400
committerjeresig <jeresig@gmail.com>2010-09-24 16:24:07 -0400
commit76db8a98220b6d76e98536b9578919bfb70048ed (patch)
tree00b921df3d9c974ab0a73266406b78921cabc041
parentf10057bc481753d92ebfb8dfcef5197af5d76972 (diff)
downloadjquery-76db8a98220b6d76e98536b9578919bfb70048ed.tar.gz
jquery-76db8a98220b6d76e98536b9578919bfb70048ed.zip
Allow data to be bound to Flash objects (but still stopping short of attaching to applets. Fixes #6121.
-rw-r--r--src/data.js20
-rw-r--r--test/unit/data.js18
2 files changed, 35 insertions, 3 deletions
diff --git a/src/data.js b/src/data.js
index ac082dd6e..448e24393 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 1163ddc29..25d519648 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");