Divec has uploaded a new change for review. https://gerrit.wikimedia.org/r/293088
Change subject: Clarify EventSequencer listener slice/splice behaviour ...................................................................... Clarify EventSequencer listener slice/splice behaviour Change-Id: I8a2696e2d5b1b647a7a27e2f99900c8c6f76c636 --- M src/ve.EventSequencer.js 1 file changed, 8 insertions(+), 10 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor refs/changes/88/293088/1 diff --git a/src/ve.EventSequencer.js b/src/ve.EventSequencer.js index 56f35c3..8a2194c 100644 --- a/src/ve.EventSequencer.js +++ b/src/ve.EventSequencer.js @@ -259,9 +259,9 @@ this.doOnLoop(); } - onListeners = this.onListenersForEvent[ eventName ] || []; + // Listener list: take snapshot (for immutability if a listener adds another listener) + onListeners = ( this.onListenersForEvent[ eventName ] || [] ).slice(); - // Length cache 'len' is required, as an onListener could add another onListener for ( i = 0, len = onListeners.length; i < len; i++ ) { onListener = onListeners[ i ]; this.callListener( 'on', eventName, i, onListener, ev ); @@ -297,11 +297,10 @@ ve.EventSequencer.prototype.afterEvent = function ( eventName, ev ) { var i, len, afterListeners, afterOneListeners; - // Snapshot the listener lists, and blank *OneListener list. - // This ensures reasonable behaviour if a function called adds another listener. + // Listener list: take snapshot (for immutability if a listener adds another listener) afterListeners = ( this.afterListenersForEvent[ eventName ] || [] ).slice(); - afterOneListeners = ( this.afterOneListenersForEvent[ eventName ] || [] ).slice(); - ( this.afterOneListenersForEvent[ eventName ] || [] ).length = 0; + // One-time listener list: take snapshot (for immutability) and blank the list + afterOneListeners = ( this.afterOneListenersForEvent[ eventName ] || [] ).splice(); for ( i = 0, len = afterListeners.length; i < len; i++ ) { this.callListener( 'after', eventName, i, afterListeners[ i ], ev ); @@ -342,11 +341,10 @@ } this.afterLoopTimeoutId = null; - // Snapshot the listener lists, and blank *OneListener list. - // This ensures reasonable behaviour if a function called adds another listener. + // Loop listener list: take snapshot (for immutability if a listener adds another listener) afterLoopListeners = this.afterLoopListeners.slice(); - afterLoopOneListeners = this.afterLoopOneListeners.slice(); - this.afterLoopOneListeners.length = 0; + // One-time loop listener list: take snapshot (for immutability) and blank the list + afterLoopOneListeners = this.afterLoopOneListeners.splice(); for ( i = 0, len = afterLoopListeners.length; i < len; i++ ) { this.callListener( 'afterLoop', null, i, this.afterLoopListeners[ i ], null ); -- To view, visit https://gerrit.wikimedia.org/r/293088 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8a2696e2d5b1b647a7a27e2f99900c8c6f76c636 Gerrit-PatchSet: 1 Gerrit-Project: VisualEditor/VisualEditor Gerrit-Branch: master Gerrit-Owner: Divec <da...@troi.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits