Skip to content

Commit ebb39c2

Browse files
committed
Ensures a list with memory will not called further callbacks before the next fire/fireWith is in stopOnFalse mode and a callback returned false. Unit tests added.
1 parent 8dcf7ec commit ebb39c2

File tree

2 files changed

+36
-28
lines changed

2 files changed

+36
-28
lines changed

src/callbacks.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,9 @@ jQuery.Callbacks = function( flags, filter ) {
113113
firingLength = list.length;
114114
}
115115
// With memory, if we're not firing then
116-
// we should call right away
117-
} else if ( flags.memory && memory ) {
116+
// we should call right away, unless previous
117+
// firing was halted (stopOnFalse)
118+
} else if ( memory && memory !== true ) {
118119
var tmp = memory;
119120
memory = undefined;
120121
firingStart = length;
@@ -179,7 +180,7 @@ jQuery.Callbacks = function( flags, filter ) {
179180
// Lock the list in its current state
180181
lock: function() {
181182
stack = undefined;
182-
if ( !memory ) {
183+
if ( !memory || memory === true ) {
183184
object.disable();
184185
}
185186
return this;
@@ -197,13 +198,14 @@ jQuery.Callbacks = function( flags, filter ) {
197198
}
198199
} else if ( !( flags.once && memory ) ) {
199200
args = args || [];
200-
memory = [ context, args ];
201+
memory = !flags.memory || [ context, args ];
201202
firing = true;
202203
firingIndex = firingStart || 0;
203204
firingStart = 0;
204205
firingLength = list.length;
205206
for ( ; list && firingIndex < firingLength; firingIndex++ ) {
206207
if ( list[ firingIndex ][ 1 ].apply( context, args ) === false && flags.stopOnFalse ) {
208+
memory = true; // Mark as halted
207209
break;
208210
}
209211
}
@@ -214,7 +216,7 @@ jQuery.Callbacks = function( flags, filter ) {
214216
memory = stack.shift();
215217
object.fireWith( memory[ 0 ], memory[ 1 ] );
216218
}
217-
} else if ( !flags.memory ) {
219+
} else if ( memory === true ) {
218220
object.disable();
219221
} else {
220222
list = [];

test/unit/callbacks.js

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,28 @@ var output,
1212
outputB = addToOutput( "B" ),
1313
outputC = addToOutput( "C" ),
1414
tests = {
15-
"": "XABC X XABCABCC X XBB X XABA",
16-
"once": "XABC X X X X X XABA",
17-
"memory": "XABC XABC XABCABCCC XA XBB XB XABA",
18-
"unique": "XABC X XABCA X XBB X XAB",
19-
"relocate": "XABC X XAABC X XBB X XBA",
20-
"stopOnFalse": "XABC X XABCABCC X XBB X XA",
21-
"addAfterFire": "XAB X XABCAB X XBB X XABA",
22-
"once memory": "XABC XABC X XA X XA XABA",
23-
"once unique": "XABC X X X X X XAB",
24-
"once relocate": "XABC X X X X X XBA",
25-
"once stopOnFalse": "XABC X X X X X XA",
26-
"once addAfterFire": "XAB X X X X X XABA",
27-
"memory unique": "XABC XA XABCA XA XBB XB XAB",
28-
"memory relocate": "XABC XB XAABC XA XBB XB XBA",
29-
"memory stopOnFalse": "XABC XABC XABCABCCC XA XBB XB XA",
30-
"memory addAfterFire": "XAB XAB XABCABC XA XBB XB XABA",
31-
"unique relocate": "XABC X XAABC X XBB X XBA",
32-
"unique stopOnFalse": "XABC X XABCA X XBB X XA",
33-
"unique addAfterFire": "XAB X XABCA X XBB X XAB",
34-
"relocate stopOnFalse": "XABC X XAABC X XBB X X",
35-
"relocate addAfterFire": "XAB X XAA X XBB X XBA",
36-
"stopOnFalse addAfterFire": "XAB X XABCAB X XBB X XA"
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+
"relocate": "XABC X XAABC X XBB X XBA X",
20+
"stopOnFalse": "XABC X XABCABCC X XBB X XA X",
21+
"addAfterFire": "XAB X XABCAB X XBB X XABA X",
22+
"once memory": "XABC XABC X XA X XA XABA XC",
23+
"once unique": "XABC X X X X X XAB X",
24+
"once relocate": "XABC X X X X X XBA X",
25+
"once stopOnFalse": "XABC X X X X X XA X",
26+
"once addAfterFire": "XAB X X X X X XABA X",
27+
"memory unique": "XABC XA XABCA XA XBB XB XAB XC",
28+
"memory relocate": "XABC XB XAABC XA XBB XB XBA XC",
29+
"memory stopOnFalse": "XABC XABC XABCABCCC XA XBB XB XA X",
30+
"memory addAfterFire": "XAB XAB XABCABC XA XBB XB XABA XC",
31+
"unique relocate": "XABC X XAABC X XBB X XBA X",
32+
"unique stopOnFalse": "XABC X XABCA X XBB X XA X",
33+
"unique addAfterFire": "XAB X XABCA X XBB X XAB X",
34+
"relocate stopOnFalse": "XABC X XAABC X XBB X X X",
35+
"relocate addAfterFire": "XAB X XAA X XBB X XBA X",
36+
"stopOnFalse addAfterFire": "XAB X XABCAB X XBB X XA X"
3737
},
3838
filters = {
3939
"no filter": undefined,
@@ -50,7 +50,7 @@ jQuery.each( tests, function( flags, resultString ) {
5050

5151
test( "jQuery.Callbacks( \"" + flags + "\" ) - " + filterLabel, function() {
5252

53-
expect( 18 );
53+
expect( 19 );
5454

5555
// Give qunit a little breathing room
5656
stop();
@@ -182,6 +182,12 @@ jQuery.each( tests, function( flags, resultString ) {
182182
cblist.add( outputA );
183183
cblist.fire();
184184
strictEqual( output, results.shift(), "Callback returning false" );
185+
186+
// Add another callback (to control lists with memory do not fire anymore)
187+
output = "X";
188+
cblist.add( outputC );
189+
strictEqual( output, results.shift(), "Adding a callback after one returned false" );
190+
185191
});
186192
});
187193
});

0 commit comments

Comments
 (0)