]> source.dussan.org Git - jquery.git/commitdiff
Fix #14074: element id="nodeName". Close gh-1389.
authorRichard Gibson <richard.gibson@gmail.com>
Wed, 18 Sep 2013 13:41:07 +0000 (09:41 -0400)
committerRichard Gibson <richard.gibson@gmail.com>
Thu, 7 Nov 2013 16:37:52 +0000 (11:37 -0500)
src/data.js
src/data/accepts.js
test/data/core/aliased.html [new file with mode: 0644]
test/unit/core.js
test/unit/data.js

index 8b4b0efca8d65f8dc674fa0dd43abe80692eb836..256bed7cd689ba94329b11fc4990b112198c5680 100644 (file)
@@ -238,13 +238,13 @@ function internalRemoveData( elem, name, pvt ) {
 jQuery.extend({
        cache: {},
 
-       // The following elements throw uncatchable exceptions if you
-       // attempt to add expando properties to them.
+       // The following elements (space-suffixed to avoid Object.prototype collisions)
+       // throw uncatchable exceptions if you attempt to set expando properties
        noData: {
-               "applet": true,
-               "embed": true,
-               // Ban all objects except for Flash (which handle expandos)
-               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+               "applet ": true,
+               "embed ": true,
+               // ...but Flash objects (which have this classid) *can* handle expandos
+               "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
        },
 
        hasData: function( elem ) {
index 28ef23a01631342047ee18972ceaea2f3d762237..6e0b1b518d8c343372aafbe0f5cc9aa314644288 100644 (file)
@@ -6,15 +6,15 @@ define([
  * Determines whether an object can have data
  */
 jQuery.acceptData = function( elem ) {
-       // Do not set data on non-element because it will not be cleared (#8335).
-       if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
-               return false;
-       }
+       var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
+               nodeType = +elem.nodeType || 1;
 
-       var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+       // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+       return nodeType !== 1 && nodeType !== 9 ?
+               false :
 
-       // nodes accept data unless otherwise specified; rejection can be conditional
-       return !noData || noData !== true && elem.getAttribute("classid") === noData;
+               // Nodes accept data unless otherwise specified; rejection can be conditional
+               !noData || noData !== true && elem.getAttribute("classid") === noData;
 };
 
 return jQuery.acceptData;
diff --git a/test/data/core/aliased.html b/test/data/core/aliased.html
new file mode 100644 (file)
index 0000000..ed06606
--- /dev/null
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+<head>
+       <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
+       <title>alias-masked DOM properties (#14074)</title>
+       <script>
+               var errors = [];
+               window.onerror = function( errorMessage, filePath, lineNumber ) {
+                       errors.push( errorMessage );
+               };
+       </script>
+       <script src="../../jquery.js"></script>
+</head>
+<body>
+       <form>
+               <input type="text" id="nodeName"/>
+       </form>
+       <script>
+               jQuery(function() {
+                       window.parent.iframeCallback( errors );
+               });
+       </script>
+</body>
+</html>
index 6e4de4864033a58a0d8fb63eeb214870ff8f0b7c..5cfb136a163786f749cf788058ba0f15d9a1c8d4 100644 (file)
@@ -1419,3 +1419,10 @@ testIframeWithCallback( "Conditional compilation compatibility (#13274)", "core/
        deepEqual( errors, [], "No errors" );
        ok( $(), "jQuery executes" );
 });
+
+testIframeWithCallback( "Tolerating alias-masked DOM properties (#14074)", "core/aliased.html",
+       function( errors ) {
+                       expect( 1 );
+                       deepEqual( errors, [], "jQuery loaded" );
+       }
+);
index c62dcf952e532acfb6e7dc70eccef9be91cc5b0d..6aace8a2040df600e48365cbb022d2ba3f5321a8 100644 (file)
@@ -142,26 +142,30 @@ test("Data is not being set on comment and text nodes", function() {
 });
 
 test("jQuery.acceptData", function() {
-       expect(9);
+       expect( 10 );
 
        var flash, applet;
 
        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" );
+       ok( !jQuery.acceptData( document.createElement( "embed" ) ), "embed" );
+       ok( !jQuery.acceptData( document.createElement( "applet" ) ), "applet" );
 
-       flash = document.createElement("object");
-       flash.setAttribute("classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
+       flash = document.createElement( "object" );
+       flash.setAttribute( "classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" );
        ok( jQuery.acceptData( flash ), "flash" );
 
-       applet = document.createElement("object");
-       applet.setAttribute("classid", "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93");
+       applet = document.createElement( "object" );
+       applet.setAttribute( "classid", "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" );
        ok( !jQuery.acceptData( applet ), "applet" );
 
-       ok( !jQuery.acceptData( document.createComment("") ), "comment" );
-       ok( !jQuery.acceptData( document.createTextNode("") ), "text" );
+       ok( !jQuery.acceptData( document.createComment( "" ) ), "comment" );
+       ok( !jQuery.acceptData( document.createTextNode( "" ) ), "text" );
+
+       ok( jQuery.acceptData(
+               jQuery( "#form" ).append( "<input id='nodeType'/><input id='nodeName'/>" )[ 0 ] ),
+               "form with aliased DOM properties" );
 });
 
 // attempting to access the data of an undefined jQuery element should be undefined