]> source.dussan.org Git - jquery.git/commitdiff
Attributes: Avoid infinite recursion on non-lowercase attribute getters 3134/head
authorMichał Gołębiowski <m.goleb@gmail.com>
Sun, 29 May 2016 20:24:28 +0000 (22:24 +0200)
committerMichał Gołębiowski <m.goleb@gmail.com>
Fri, 3 Jun 2016 20:48:43 +0000 (22:48 +0200)
Attribute hooks are determined for the lowercase versions of attribute names
but this has not been reflected in the bool attribute hooks. The code that
temporarily removed a handler to avoid an infinite loop was removing an
incorrect handler causing stack overflow.

Fixes gh-3133
Refs gh-2914
Refs gh-2916
Closes gh-3134

src/attributes/attr.js
test/unit/attributes.js

index af9b3d09b8b626e3d857fa3e15019ada7ea880c8..5d85f4f19fec0df6827cb92038eec15de96c7c30 100644 (file)
@@ -117,16 +117,18 @@ jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name )
        var getter = attrHandle[ name ] || jQuery.find.attr;
 
        attrHandle[ name ] = function( elem, name, isXML ) {
-               var ret, handle;
+               var ret, handle,
+                       lowercaseName = name.toLowerCase();
+
                if ( !isXML ) {
 
                        // Avoid an infinite loop by temporarily removing this function from the getter
-                       handle = attrHandle[ name ];
-                       attrHandle[ name ] = ret;
+                       handle = attrHandle[ lowercaseName ];
+                       attrHandle[ lowercaseName ] = ret;
                        ret = getter( elem, name, isXML ) != null ?
-                               name.toLowerCase() :
+                               lowercaseName :
                                null;
-                       attrHandle[ name ] = handle;
+                       attrHandle[ lowercaseName ] = handle;
                }
                return ret;
        };
index 45efddfe4ebb065caf04f6c64ecb2d5804d9bcce..127eb3e1e5f608b8204552e80ecc48fc4201f03e 100644 (file)
@@ -1642,3 +1642,22 @@ QUnit.test( "SVG class manipulation (gh-2199)", function( assert ) {
                assert.ok( !elem.hasClass( "awesome" ), "SVG element (" + this + ") toggles the class off" );
        } );
 } );
+
+QUnit.test( "non-lowercase boolean attribute getters should not crash", function( assert ) {
+       assert.expect( 3 );
+
+       var elem = jQuery( "<input checked required autofocus type='checkbox'>" );
+
+       jQuery.each( {
+               checked: "Checked",
+               required: "requiRed",
+               autofocus: "AUTOFOCUS"
+       }, function( lowercased, original ) {
+           try {
+                       assert.strictEqual( elem.attr( original ), lowercased,
+                               "The '" + this + "' attribute getter should return the lowercased name" );
+               } catch ( e ) {
+                       assert.ok( false, "The '" + this + "' attribute getter threw" );
+               }
+       } );
+} );