mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Allows traditional options object for $.Callbacks flags. Fixes #11011. Unit tests added.
This commit is contained in:
parent
a29d482894
commit
7fa0da08b8
@ -38,9 +38,9 @@ function createFlags( flags ) {
|
|||||||
*/
|
*/
|
||||||
jQuery.Callbacks = function( flags ) {
|
jQuery.Callbacks = function( flags ) {
|
||||||
|
|
||||||
// Convert flags from String-formatted to Object-formatted
|
// Convert flags from String-formatted to Object-formatted if needed
|
||||||
// (we check in cache first)
|
// (we check in cache first)
|
||||||
flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
|
flags = typeof flags === "string" ? ( flagsCache[ flags ] || createFlags( flags ) ) : ( flags || {} );
|
||||||
|
|
||||||
var // Actual callback list
|
var // Actual callback list
|
||||||
list = [],
|
list = [],
|
||||||
|
@ -33,149 +33,171 @@ var output,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
jQuery.each( tests, function( flags, resultString ) {
|
function showFlags( flags ) {
|
||||||
|
if ( typeof flags === "string" ) {
|
||||||
|
return '"' + flags + '"';
|
||||||
|
}
|
||||||
|
var output = [], key;
|
||||||
|
for ( key in flags ) {
|
||||||
|
output.push( '"' + key + '": ' + flags[ key ] );
|
||||||
|
}
|
||||||
|
return "{ " + output.join( ", " ) + " }";
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.each( tests, function( strFlags, resultString ) {
|
||||||
|
|
||||||
|
var objectFlags = {};
|
||||||
|
|
||||||
|
jQuery.each( strFlags.split( " " ), function() {
|
||||||
|
if ( this.length ) {
|
||||||
|
objectFlags[ this ] = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
jQuery.each( filters, function( filterLabel, filter ) {
|
jQuery.each( filters, function( filterLabel, filter ) {
|
||||||
|
|
||||||
test( "jQuery.Callbacks( \"" + flags + "\" ) - " + filterLabel, function() {
|
jQuery.each( { "string": strFlags, "object": objectFlags }, function( flagsTypes, flags ) {
|
||||||
|
|
||||||
expect( 20 );
|
test( "jQuery.Callbacks( " + showFlags( flags ) + " ) - " + filterLabel, function() {
|
||||||
|
|
||||||
// Give qunit a little breathing room
|
expect( 20 );
|
||||||
stop();
|
|
||||||
setTimeout( start, 0 );
|
|
||||||
|
|
||||||
var cblist;
|
// Give qunit a little breathing room
|
||||||
results = resultString.split( /\s+/ );
|
stop();
|
||||||
|
setTimeout( start, 0 );
|
||||||
|
|
||||||
// Basic binding and firing
|
var cblist;
|
||||||
output = "X";
|
results = resultString.split( /\s+/ );
|
||||||
cblist = jQuery.Callbacks( flags );
|
|
||||||
cblist.add(function( str ) {
|
|
||||||
output += str;
|
|
||||||
});
|
|
||||||
cblist.fire( "A" );
|
|
||||||
strictEqual( output, "XA", "Basic binding and firing" );
|
|
||||||
strictEqual( cblist.fired(), true, ".fired() detects firing" );
|
|
||||||
output = "X";
|
|
||||||
cblist.disable();
|
|
||||||
cblist.add(function( str ) {
|
|
||||||
output += str;
|
|
||||||
});
|
|
||||||
strictEqual( output, "X", "Adding a callback after disabling" );
|
|
||||||
cblist.fire( "A" );
|
|
||||||
strictEqual( output, "X", "Firing after disabling" );
|
|
||||||
|
|
||||||
// Basic binding and firing (context, arguments)
|
// Basic binding and firing
|
||||||
output = "X";
|
output = "X";
|
||||||
cblist = jQuery.Callbacks( flags );
|
cblist = jQuery.Callbacks( flags );
|
||||||
cblist.add(function() {
|
cblist.add(function( str ) {
|
||||||
equal( this, window, "Basic binding and firing (context)" );
|
output += str;
|
||||||
output += Array.prototype.join.call( arguments, "" );
|
});
|
||||||
});
|
cblist.fire( "A" );
|
||||||
cblist.fireWith( window, [ "A", "B" ] );
|
strictEqual( output, "XA", "Basic binding and firing" );
|
||||||
strictEqual( output, "XAB", "Basic binding and firing (arguments)" );
|
strictEqual( cblist.fired(), true, ".fired() detects firing" );
|
||||||
|
output = "X";
|
||||||
|
cblist.disable();
|
||||||
|
cblist.add(function( str ) {
|
||||||
|
output += str;
|
||||||
|
});
|
||||||
|
strictEqual( output, "X", "Adding a callback after disabling" );
|
||||||
|
cblist.fire( "A" );
|
||||||
|
strictEqual( output, "X", "Firing after disabling" );
|
||||||
|
|
||||||
// fireWith with no arguments
|
// Basic binding and firing (context, arguments)
|
||||||
output = "";
|
output = "X";
|
||||||
cblist = jQuery.Callbacks( flags );
|
cblist = jQuery.Callbacks( flags );
|
||||||
cblist.add(function() {
|
cblist.add(function() {
|
||||||
equal( this, window, "fireWith with no arguments (context is window)" );
|
equal( this, window, "Basic binding and firing (context)" );
|
||||||
strictEqual( arguments.length, 0, "fireWith with no arguments (no arguments)" );
|
output += Array.prototype.join.call( arguments, "" );
|
||||||
});
|
});
|
||||||
cblist.fireWith();
|
cblist.fireWith( window, [ "A", "B" ] );
|
||||||
|
strictEqual( output, "XAB", "Basic binding and firing (arguments)" );
|
||||||
|
|
||||||
// Basic binding, removing and firing
|
// fireWith with no arguments
|
||||||
output = "X";
|
output = "";
|
||||||
cblist = jQuery.Callbacks( flags );
|
cblist = jQuery.Callbacks( flags );
|
||||||
cblist.add( outputA, outputB, outputC );
|
cblist.add(function() {
|
||||||
cblist.remove( outputB, outputC );
|
equal( this, window, "fireWith with no arguments (context is window)" );
|
||||||
cblist.fire();
|
strictEqual( arguments.length, 0, "fireWith with no arguments (no arguments)" );
|
||||||
strictEqual( output, "XA", "Basic binding, removing and firing" );
|
});
|
||||||
|
cblist.fireWith();
|
||||||
|
|
||||||
// Empty
|
// Basic binding, removing and firing
|
||||||
output = "X";
|
output = "X";
|
||||||
cblist = jQuery.Callbacks( flags );
|
cblist = jQuery.Callbacks( flags );
|
||||||
cblist.add( outputA );
|
cblist.add( outputA, outputB, outputC );
|
||||||
cblist.add( outputB );
|
cblist.remove( outputB, outputC );
|
||||||
cblist.add( outputC );
|
cblist.fire();
|
||||||
cblist.empty();
|
strictEqual( output, "XA", "Basic binding, removing and firing" );
|
||||||
cblist.fire();
|
|
||||||
strictEqual( output, "X", "Empty" );
|
|
||||||
|
|
||||||
// Locking
|
// Empty
|
||||||
output = "X";
|
output = "X";
|
||||||
cblist = jQuery.Callbacks( flags );
|
cblist = jQuery.Callbacks( flags );
|
||||||
cblist.add( function( str ) {
|
cblist.add( outputA );
|
||||||
output += str;
|
cblist.add( outputB );
|
||||||
});
|
|
||||||
cblist.lock();
|
|
||||||
cblist.add( function( str ) {
|
|
||||||
output += str;
|
|
||||||
});
|
|
||||||
cblist.fire( "A" );
|
|
||||||
cblist.add( function( str ) {
|
|
||||||
output += str;
|
|
||||||
});
|
|
||||||
strictEqual( output, "X", "Lock early" );
|
|
||||||
|
|
||||||
// Ordering
|
|
||||||
output = "X";
|
|
||||||
cblist = jQuery.Callbacks( flags );
|
|
||||||
cblist.add( function() {
|
|
||||||
cblist.add( outputC );
|
cblist.add( outputC );
|
||||||
outputA();
|
cblist.empty();
|
||||||
}, outputB );
|
cblist.fire();
|
||||||
cblist.fire();
|
strictEqual( output, "X", "Empty" );
|
||||||
strictEqual( output, results.shift(), "Proper ordering" );
|
|
||||||
|
|
||||||
// Add and fire again
|
// Locking
|
||||||
output = "X";
|
output = "X";
|
||||||
cblist.add( function() {
|
cblist = jQuery.Callbacks( flags );
|
||||||
|
cblist.add( function( str ) {
|
||||||
|
output += str;
|
||||||
|
});
|
||||||
|
cblist.lock();
|
||||||
|
cblist.add( function( str ) {
|
||||||
|
output += str;
|
||||||
|
});
|
||||||
|
cblist.fire( "A" );
|
||||||
|
cblist.add( function( str ) {
|
||||||
|
output += str;
|
||||||
|
});
|
||||||
|
strictEqual( output, "X", "Lock early" );
|
||||||
|
|
||||||
|
// Ordering
|
||||||
|
output = "X";
|
||||||
|
cblist = jQuery.Callbacks( flags );
|
||||||
|
cblist.add( function() {
|
||||||
|
cblist.add( outputC );
|
||||||
|
outputA();
|
||||||
|
}, outputB );
|
||||||
|
cblist.fire();
|
||||||
|
strictEqual( output, results.shift(), "Proper ordering" );
|
||||||
|
|
||||||
|
// Add and fire again
|
||||||
|
output = "X";
|
||||||
|
cblist.add( function() {
|
||||||
|
cblist.add( outputC );
|
||||||
|
outputA();
|
||||||
|
}, outputB );
|
||||||
|
strictEqual( output, results.shift(), "Add after fire" );
|
||||||
|
|
||||||
|
output = "X";
|
||||||
|
cblist.fire();
|
||||||
|
strictEqual( output, results.shift(), "Fire again" );
|
||||||
|
|
||||||
|
// Multiple fire
|
||||||
|
output = "X";
|
||||||
|
cblist = jQuery.Callbacks( flags );
|
||||||
|
cblist.add( function( str ) {
|
||||||
|
output += str;
|
||||||
|
} );
|
||||||
|
cblist.fire( "A" );
|
||||||
|
strictEqual( output, "XA", "Multiple fire (first fire)" );
|
||||||
|
output = "X";
|
||||||
|
cblist.add( function( str ) {
|
||||||
|
output += str;
|
||||||
|
} );
|
||||||
|
strictEqual( output, results.shift(), "Multiple fire (first new callback)" );
|
||||||
|
output = "X";
|
||||||
|
cblist.fire( "B" );
|
||||||
|
strictEqual( output, results.shift(), "Multiple fire (second fire)" );
|
||||||
|
output = "X";
|
||||||
|
cblist.add( function( str ) {
|
||||||
|
output += str;
|
||||||
|
} );
|
||||||
|
strictEqual( output, results.shift(), "Multiple fire (second new callback)" );
|
||||||
|
|
||||||
|
// Return false
|
||||||
|
output = "X";
|
||||||
|
cblist = jQuery.Callbacks( flags );
|
||||||
|
cblist.add( outputA, function() { return false; }, outputB );
|
||||||
|
cblist.add( outputA );
|
||||||
|
cblist.fire();
|
||||||
|
strictEqual( output, results.shift(), "Callback returning false" );
|
||||||
|
|
||||||
|
// Add another callback (to control lists with memory do not fire anymore)
|
||||||
|
output = "X";
|
||||||
cblist.add( outputC );
|
cblist.add( outputC );
|
||||||
outputA();
|
strictEqual( output, results.shift(), "Adding a callback after one returned false" );
|
||||||
}, outputB );
|
|
||||||
strictEqual( output, results.shift(), "Add after fire" );
|
|
||||||
|
|
||||||
output = "X";
|
|
||||||
cblist.fire();
|
|
||||||
strictEqual( output, results.shift(), "Fire again" );
|
|
||||||
|
|
||||||
// Multiple fire
|
|
||||||
output = "X";
|
|
||||||
cblist = jQuery.Callbacks( flags );
|
|
||||||
cblist.add( function( str ) {
|
|
||||||
output += str;
|
|
||||||
} );
|
|
||||||
cblist.fire( "A" );
|
|
||||||
strictEqual( output, "XA", "Multiple fire (first fire)" );
|
|
||||||
output = "X";
|
|
||||||
cblist.add( function( str ) {
|
|
||||||
output += str;
|
|
||||||
} );
|
|
||||||
strictEqual( output, results.shift(), "Multiple fire (first new callback)" );
|
|
||||||
output = "X";
|
|
||||||
cblist.fire( "B" );
|
|
||||||
strictEqual( output, results.shift(), "Multiple fire (second fire)" );
|
|
||||||
output = "X";
|
|
||||||
cblist.add( function( str ) {
|
|
||||||
output += str;
|
|
||||||
} );
|
|
||||||
strictEqual( output, results.shift(), "Multiple fire (second new callback)" );
|
|
||||||
|
|
||||||
// Return false
|
|
||||||
output = "X";
|
|
||||||
cblist = jQuery.Callbacks( flags );
|
|
||||||
cblist.add( outputA, function() { return false; }, outputB );
|
|
||||||
cblist.add( outputA );
|
|
||||||
cblist.fire();
|
|
||||||
strictEqual( output, results.shift(), "Callback returning false" );
|
|
||||||
|
|
||||||
// Add another callback (to control lists with memory do not fire anymore)
|
|
||||||
output = "X";
|
|
||||||
cblist.add( outputC );
|
|
||||||
strictEqual( output, results.shift(), "Adding a callback after one returned false" );
|
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user