]> source.dussan.org Git - jquery.git/commitdiff
Fix for custom attr handles duck-punching the boolean attr handle
authorTimmy Willison <timmywillisn@gmail.com>
Wed, 28 Aug 2013 16:12:37 +0000 (12:12 -0400)
committerTimmy Willison <timmywillisn@gmail.com>
Wed, 28 Aug 2013 16:23:54 +0000 (12:23 -0400)
Conflicts:
src/attributes/attr.js

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

index 202c7028b7ac96a84aa1c57eeb53240587d51140..170e6a39e59401df6aa58ceb0b073efb8a41243e 100644 (file)
@@ -6,7 +6,8 @@ define([
        "../support"
 ], function( jQuery, rnotwhite, strundefined ) {
 
-var nodeHook, boolHook;
+var nodeHook, boolHook,
+       attrHandle = jQuery.expr.attrHandle;
 
 jQuery.fn.extend({
        attr: function( name, value ) {
@@ -120,23 +121,19 @@ boolHook = {
        }
 };
 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-       var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
-
-       jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) {
-               var fn = jQuery.expr.attrHandle[ name ],
-                       ret = isXML ?
-                               undefined :
-                               /* jshint eqeqeq: false */
-                               // Temporarily disable this handler to check existence
-                               (jQuery.expr.attrHandle[ name ] = undefined) !=
-                                       getter( elem, name, isXML ) ?
-
-                                       name.toLowerCase() :
-                                       null;
-
-               // Restore handler
-               jQuery.expr.attrHandle[ name ] = fn;
-
+       var getter = attrHandle[ name ] || jQuery.find.attr;
+
+       attrHandle[ name ] = function( elem, name, isXML ) {
+               var ret, handle;
+               if ( !isXML ) {
+                       // Avoid an infinite loop by temporarily removing this function from the getter
+                       handle = attrHandle[ name ];
+                       attrHandle[ name ] = ret;
+                       ret = getter( elem, name, isXML ) != null ?
+                               name.toLowerCase() :
+                               null;
+                       attrHandle[ name ] = handle;
+               }
                return ret;
        };
 });
index 84ac8c2b28d00f5fba9fecf68284499648aebd90..72da26541b64d659f101b8e441988e34e3c8aedb 100644 (file)
@@ -470,6 +470,20 @@ test( "attr(String, Object)", function() {
        equal( jQuery("#name").attr( "nonexisting", undefined ).attr("nonexisting"), undefined, ".attr('attribute', undefined) does not create attribute (#5571)" );
 });
 
+test( "attr - extending the boolean attrHandle", function() {
+       expect( 1 );
+       var called = false,
+               _handle = jQuery.expr.attrHandle.checked || $.noop;
+       jQuery.expr.attrHandle.checked = function() {
+               called = true;
+               _handle.apply( this, arguments );
+       };
+       jQuery( "input" ).attr( "checked" );
+       called = false;
+       jQuery( "input" ).attr( "checked" );
+       ok( called, "The boolean attrHandle does not drop custom attrHandles" );
+});
+
 test( "attr(String, Object) - Loaded via XML document", function() {
        expect( 2 );
        var xml = createDashboardXML(),