From: Timo Tijhof Date: Fri, 27 Mar 2015 23:55:20 +0000 (+0000) Subject: mw.track: Implement trackUnsubscribe X-Git-Tag: 1.31.0-rc.0~11510^2 X-Git-Url: http://git.cyclocoop.org//%27%40script%40/%27?a=commitdiff_plain;h=0e62e43941bc82a398b7cdf62795811a5e87d8fe;p=lhc%2Fweb%2Fwiklou.git mw.track: Implement trackUnsubscribe Bug: T93986 Change-Id: I38219319cb7963f1f19ee81857dd084709fb6be1 --- diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js index 237157c75f..e556ed8892 100644 --- a/resources/src/mediawiki/mediawiki.js +++ b/resources/src/mediawiki/mediawiki.js @@ -14,6 +14,7 @@ hasOwn = Object.prototype.hasOwnProperty, slice = Array.prototype.slice, trackCallbacks = $.Callbacks( 'memory' ), + trackHandlers = [], trackQueue = []; /** @@ -461,8 +462,7 @@ */ trackSubscribe: function ( topic, callback ) { var seen = 0; - - trackCallbacks.add( function ( trackQueue ) { + function handler( trackQueue ) { var event; for ( ; seen < trackQueue.length; seen++ ) { event = trackQueue[ seen ]; @@ -470,6 +470,26 @@ callback.call( event, event.topic, event.data ); } } + } + + trackHandlers.push( [ handler, callback ] ); + + trackCallbacks.add( handler ); + }, + + /** + * Stop handling events for a particular handler + * + * @param {Function} callback + */ + trackUnsubscribe: function ( callback ) { + trackHandlers = $.grep( trackHandlers, function ( fns ) { + if ( fns[1] === callback ) { + trackCallbacks.remove( fns[0] ); + // Ensure the tuple is removed to avoid holding on to closures + return false; + } + return true; } ); }, diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js index cdb2624404..5329be6a9c 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js @@ -39,4 +39,22 @@ assert.assertTrue( this.timeStamp >= now, 'thisValue has sane timestamp' ); } ); } ); + + QUnit.test( 'trackUnsubscribe', 1, function ( assert ) { + var sequence = []; + function unsubber( topic, data ) { + sequence.push( [ topic, data ] ); + } + + mw.track( 'unsub', { key: 1 } ); + mw.trackSubscribe( 'unsub', unsubber ); + mw.track( 'unsub', { key: 2 } ); + mw.trackUnsubscribe( unsubber ); + mw.track( 'unsub', { key: 3 } ); + + assert.deepEqual( sequence, [ + [ 'unsub', { key: 1 } ], + [ 'unsub', { key: 2 } ] + ], 'Stop when unsubscribing' ); + } ); }( mediaWiki ) );