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

Reply via email to