From 05d907d1b1ad9ab4789c15060d273bcadae5c91e Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Wed, 28 Aug 2013 12:12:37 -0400 Subject: [PATCH] Fix for custom attr handles duck-punching the boolean attr handle --- src/attributes/attr.js | 10 ++++++---- test/unit/attributes.js | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/attributes/attr.js b/src/attributes/attr.js index 2a32b960c..6fb4d7f7f 100644 --- a/src/attributes/attr.js +++ b/src/attributes/attr.js @@ -145,17 +145,19 @@ boolHook = { // Retrieve booleans specially jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr, - fn = attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? function( elem, name, isXML ) { - var ret; + 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 ] = fn; + attrHandle[ name ] = handle; } return ret; } : diff --git a/test/unit/attributes.js b/test/unit/attributes.js index aa9d3b48c..dc34f9df7 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -473,6 +473,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(),