Skip to content

Commit bb38f70

Browse files
committed
Do not iterate over functions. Fixes #12665. Unit tests added. Thanks to @kselden for finding the bug.
1 parent cfe95a8 commit bb38f70

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

src/callbacks.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,10 @@ jQuery.Callbacks = function( options ) {
9393
(function add( args ) {
9494
jQuery.each( args, function( _, arg ) {
9595
var type = jQuery.type( arg );
96-
if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
97-
list.push( arg );
96+
if ( type === "function" ) {
97+
if ( !options.unique || !self.has( arg ) ) {
98+
list.push( arg );
99+
}
98100
} else if ( arg && arg.length && type !== "string" ) {
99101
// Inspect recursively
100102
add( arg );

test/unit/callbacks.js

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ var output,
1212
outputB = addToOutput( "B" ),
1313
outputC = addToOutput( "C" ),
1414
tests = {
15-
"": "XABC X XABCABCC X XBB X XABA X",
16-
"once": "XABC X X X X X XABA X",
17-
"memory": "XABC XABC XABCABCCC XA XBB XB XABA XC",
18-
"unique": "XABC X XABCA X XBB X XAB X",
19-
"stopOnFalse": "XABC X XABCABCC X XBB X XA X",
20-
"once memory": "XABC XABC X XA X XA XABA XC",
21-
"once unique": "XABC X X X X X XAB X",
22-
"once stopOnFalse": "XABC X X X X X XA X",
23-
"memory unique": "XABC XA XABCA XA XBB XB XAB XC",
24-
"memory stopOnFalse": "XABC XABC XABCABCCC XA XBB XB XA X",
25-
"unique stopOnFalse": "XABC X XABCA X XBB X XA X"
15+
"": "XABC X XABCABCC X XBB X XABA X XX",
16+
"once": "XABC X X X X X XABA X XX",
17+
"memory": "XABC XABC XABCABCCC XA XBB XB XABA XC XX",
18+
"unique": "XABC X XABCA X XBB X XAB X X",
19+
"stopOnFalse": "XABC X XABCABCC X XBB X XA X XX",
20+
"once memory": "XABC XABC X XA X XA XABA XC XX",
21+
"once unique": "XABC X X X X X XAB X X",
22+
"once stopOnFalse": "XABC X X X X X XA X XX",
23+
"memory unique": "XABC XA XABCA XA XBB XB XAB XC X",
24+
"memory stopOnFalse": "XABC XABC XABCABCCC XA XBB XB XA X XX",
25+
"unique stopOnFalse": "XABC X XABCA X XBB X XA X X"
2626
},
2727
filters = {
2828
"no filter": undefined,
@@ -32,7 +32,7 @@ var output,
3232
};
3333
}
3434
};
35-
35+
3636
function showFlags( flags ) {
3737
if ( typeof flags === "string" ) {
3838
return '"' + flags + '"';
@@ -60,7 +60,7 @@ jQuery.each( tests, function( strFlags, resultString ) {
6060

6161
test( "jQuery.Callbacks( " + showFlags( flags ) + " ) - " + filterLabel, function() {
6262

63-
expect( 20 );
63+
expect( 21 );
6464

6565
// Give qunit a little breathing room
6666
stop();
@@ -197,6 +197,19 @@ jQuery.each( tests, function( strFlags, resultString ) {
197197
cblist.add( outputC );
198198
strictEqual( output, results.shift(), "Adding a callback after one returned false" );
199199

200+
// Callbacks are not iterated
201+
output = "";
202+
function handler( tmp ) {
203+
output += "X";
204+
}
205+
handler.method = function() {
206+
output += "!";
207+
};
208+
cblist = jQuery.Callbacks( flags );
209+
cblist.add( handler );
210+
cblist.add( handler );
211+
cblist.fire();
212+
strictEqual( output, results.shift(), "No callback iteration" );
200213
});
201214
});
202215
});

0 commit comments

Comments
 (0)