]> source.dussan.org Git - jquery.git/commitdiff
Do not iterate over functions. Fixes #12665. Unit tests added. Thanks to @kselden...
authorjaubourg <j@ubourg.net>
Sat, 6 Oct 2012 20:00:43 +0000 (22:00 +0200)
committerjaubourg <j@ubourg.net>
Sat, 6 Oct 2012 20:00:43 +0000 (22:00 +0200)
src/callbacks.js
test/unit/callbacks.js

index 37acabcba0ebca5ddd513a08d90a4e6dd388ce70..6fda47f00ff3723c7753727e364d6de6d773a58c 100644 (file)
@@ -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 );
index 2c708bb59a02cfd0f921fd65bd17e181e65be44c..f0b3fdd5129ebaca47455b570ec9dd8b6fb9544a 100644 (file)
@@ -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" );
                                });
                        });
                });