From bb38f706463a4d7598505b2f7adf3ed83935f298 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Sat, 6 Oct 2012 22:00:43 +0200 Subject: [PATCH] Do not iterate over functions. Fixes #12665. Unit tests added. Thanks to @kselden for finding the bug. --- src/callbacks.js | 6 ++++-- test/unit/callbacks.js | 39 ++++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/callbacks.js b/src/callbacks.js index 37acabcba..6fda47f00 100644 --- a/src/callbacks.js +++ b/src/callbacks.js @@ -93,8 +93,10 @@ jQuery.Callbacks = function( options ) { (function add( args ) { jQuery.each( args, function( _, arg ) { var type = jQuery.type( arg ); - if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) { - list.push( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } } else if ( arg && arg.length && type !== "string" ) { // Inspect recursively add( arg ); diff --git a/test/unit/callbacks.js b/test/unit/callbacks.js index 2c708bb59..f0b3fdd51 100644 --- a/test/unit/callbacks.js +++ b/test/unit/callbacks.js @@ -12,17 +12,17 @@ var output, outputB = addToOutput( "B" ), outputC = addToOutput( "C" ), tests = { - "": "XABC X XABCABCC X XBB X XABA X", - "once": "XABC X X X X X XABA X", - "memory": "XABC XABC XABCABCCC XA XBB XB XABA XC", - "unique": "XABC X XABCA X XBB X XAB X", - "stopOnFalse": "XABC X XABCABCC X XBB X XA X", - "once memory": "XABC XABC X XA X XA XABA XC", - "once unique": "XABC X X X X X XAB X", - "once stopOnFalse": "XABC X X X X X XA X", - "memory unique": "XABC XA XABCA XA XBB XB XAB XC", - "memory stopOnFalse": "XABC XABC XABCABCCC XA XBB XB XA X", - "unique stopOnFalse": "XABC X XABCA X XBB X XA X" + "": "XABC X XABCABCC X XBB X XABA X XX", + "once": "XABC X X X X X XABA X XX", + "memory": "XABC XABC XABCABCCC XA XBB XB XABA XC XX", + "unique": "XABC X XABCA X XBB X XAB X X", + "stopOnFalse": "XABC X XABCABCC X XBB X XA X XX", + "once memory": "XABC XABC X XA X XA XABA XC XX", + "once unique": "XABC X X X X X XAB X X", + "once stopOnFalse": "XABC X X X X X XA X XX", + "memory unique": "XABC XA XABCA XA XBB XB XAB XC X", + "memory stopOnFalse": "XABC XABC XABCABCCC XA XBB XB XA X XX", + "unique stopOnFalse": "XABC X XABCA X XBB X XA X X" }, filters = { "no filter": undefined, @@ -32,7 +32,7 @@ var output, }; } }; - + function showFlags( flags ) { if ( typeof flags === "string" ) { return '"' + flags + '"'; @@ -60,7 +60,7 @@ jQuery.each( tests, function( strFlags, resultString ) { test( "jQuery.Callbacks( " + showFlags( flags ) + " ) - " + filterLabel, function() { - expect( 20 ); + expect( 21 ); // Give qunit a little breathing room stop(); @@ -197,6 +197,19 @@ jQuery.each( tests, function( strFlags, resultString ) { cblist.add( outputC ); strictEqual( output, results.shift(), "Adding a callback after one returned false" ); + // Callbacks are not iterated + output = ""; + function handler( tmp ) { + output += "X"; + } + handler.method = function() { + output += "!"; + }; + cblist = jQuery.Callbacks( flags ); + cblist.add( handler ); + cblist.add( handler ); + cblist.fire(); + strictEqual( output, results.shift(), "No callback iteration" ); }); }); });