From 76db8a98220b6d76e98536b9578919bfb70048ed Mon Sep 17 00:00:00 2001 From: jeresig Date: Fri, 24 Sep 2010 16:24:07 -0400 Subject: [PATCH] Allow data to be bound to Flash objects (but still stopping short of attaching to applets. Fixes #6121. --- src/data.js | 20 +++++++++++++++++--- test/unit/data.js | 18 ++++++++++++++++++ 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"); -- 2.39.5