Skip to content
Permalink
Browse files

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

Conflicts:
	src/attributes/attr.js
  • Loading branch information
timmywil committed Aug 28, 2013
1 parent a7a3b8c commit 01d5a1a1c9d5469057cafc5a2b27668d0e04ad22
Showing with 29 additions and 18 deletions.
  1. +15 −18 src/attributes/attr.js
  2. +14 −0 test/unit/attributes.js
@@ -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;
};
});
@@ -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(),

0 comments on commit 01d5a1a

Please sign in to comment.
You can’t perform that action at this time.