Fix for custom attr handles duck-punching the boolean attr handle

This commit is contained in:
Timmy Willison 2013-08-28 12:12:37 -04:00
parent 2af2e74e27
commit 05d907d1b1
2 changed files with 20 additions and 4 deletions

View File

@ -145,17 +145,19 @@ boolHook = {
// Retrieve booleans specially // Retrieve booleans specially
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
var getter = attrHandle[ name ] || jQuery.find.attr, var getter = attrHandle[ name ] || jQuery.find.attr;
fn = attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
function( elem, name, isXML ) { function( elem, name, isXML ) {
var ret; var ret, handle;
if ( !isXML ) { if ( !isXML ) {
// Avoid an infinite loop by temporarily removing this function from the getter // Avoid an infinite loop by temporarily removing this function from the getter
handle = attrHandle[ name ];
attrHandle[ name ] = ret; attrHandle[ name ] = ret;
ret = getter( elem, name, isXML ) != null ? ret = getter( elem, name, isXML ) != null ?
name.toLowerCase() : name.toLowerCase() :
null; null;
attrHandle[ name ] = fn; attrHandle[ name ] = handle;
} }
return ret; return ret;
} : } :

View File

@ -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)" ); 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() { test( "attr(String, Object) - Loaded via XML document", function() {
expect( 2 ); expect( 2 );
var xml = createDashboardXML(), var xml = createDashboardXML(),