Arlolra has submitted this change and it was merged.

Change subject: Clean up event listener handling for node 0.10
......................................................................


Clean up event listener handling for node 0.10

f4bd9a43ba13984 fixed most event listener issues with node 0.10. This patch
fixes some additional issues that slipped through and avoids directly pushing
event listeners in general.

The main remaining issue was that event listeners were not removed after being
processed in ApiRequest.prototype._processListeners. It was also questionable
if listeners that are added after the response became available were processed
properly. This patch gets a fresh listener queue copy (which is now spliced in
0.10) before processing the next batch of listeners, and makes sure that each
handler removes itself from the queue on being called by adding it with
once().

Change-Id: Ia7a76abae42e59820ec6c25b8c8b35b84e99f767
---
M js/lib/ext.core.ExtensionHandler.js
M js/lib/ext.core.TemplateHandler.js
M js/lib/mediawiki.ApiRequest.js
3 files changed, 13 insertions(+), 7 deletions(-)

Approvals:
  Arlolra: Looks good to me, approved
  Cscott: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/js/lib/ext.core.ExtensionHandler.js 
b/js/lib/ext.core.ExtensionHandler.js
index 1a82a09..ceed5ce 100644
--- a/js/lib/ext.core.ExtensionHandler.js
+++ b/js/lib/ext.core.ExtensionHandler.js
@@ -97,7 +97,7 @@
                        env.requestQueue[text] = new PHPParseRequest( env, 
title, text );
                }
                // append request, process in document order
-               env.requestQueue[text].listeners( 'src' ).push( cb );
+               env.requestQueue[text].once( 'src', cb );
 
                parentCB ( { async: true } );
        }
diff --git a/js/lib/ext.core.TemplateHandler.js 
b/js/lib/ext.core.TemplateHandler.js
index c5d3f73..f13fec5 100644
--- a/js/lib/ext.core.TemplateHandler.js
+++ b/js/lib/ext.core.TemplateHandler.js
@@ -895,7 +895,7 @@
                //} else {
 
                // append request, process in document order
-               env.requestQueue[title].listeners( 'src' ).push( function(err, 
page) {
+               env.requestQueue[title].once( 'src', function(err, page) {
                        cb(err, page ? page.revision['*'] : null);
                });
 
diff --git a/js/lib/mediawiki.ApiRequest.js b/js/lib/mediawiki.ApiRequest.js
index 6959579..1517f9f 100644
--- a/js/lib/mediawiki.ApiRequest.js
+++ b/js/lib/mediawiki.ApiRequest.js
@@ -88,22 +88,28 @@
 ApiRequest.prototype._processListeners = function ( error, src ) {
        // Process only a few callbacks in each event loop iteration to
        // reduce memory usage.
-       var self = this,
-               listeners = this.listeners( 'src' );
+       var self = this;
 
        var processSome = function () {
-               // XXX: experiment a bit with the number of callbacks per
-               // iteration!
-               var maxIters = Math.min(1, listeners.length);
+                       // listeners() returns a copy (slice) of the listeners 
array in
+                       // 0.10. Get a new copy including new additions before 
processing
+                       // each batch.
+               var listeners = self.listeners( 'src' ),
+                       // XXX: experiment a bit with the number of callbacks 
per
+                       // iteration!
+                       maxIters = Math.min(1, listeners.length);
                for ( var it = 0; it < maxIters; it++ ) {
                        var nextListener = listeners.shift();
 
                        // We only retrieve text/x-mediawiki source currently.
+                       // We expect these listeners to remove themselves when 
being
+                       // called- always add them with once().
                        nextListener.call( self, error || null, src, 
'text/x-mediawiki' );
                }
                if ( listeners.length ) {
                        process.nextTick( processSome );
                }
+
        };
 
        process.nextTick( processSome );

-- 
To view, visit https://gerrit.wikimedia.org/r/79161
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia7a76abae42e59820ec6c25b8c8b35b84e99f767
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: GWicke <[email protected]>
Gerrit-Reviewer: Arlolra <[email protected]>
Gerrit-Reviewer: Cscott <[email protected]>
Gerrit-Reviewer: GWicke <[email protected]>
Gerrit-Reviewer: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to