jenkins-bot has submitted this change and it was merged.

Change subject: Node v0.10.x Compatibility
......................................................................


Node v0.10.x Compatibility

* Removes the freeze on the WikiConfig prototype which was preventing
  prototype values from being overwritten during init().

* Fix in TemplateHandler where a src listener was being pushed onto the
  array instead of added via once().

* Resume response in tests/client/client.js for backwards stream
  compatibility.

* Moves away from the inheritance pattern,

  function Child() {}
  Child.prototype = new Parent();

  Better would be,

  function Child() {
    Parent.call(this);
  }
  function Ctor() {
    this.constructor = Child;
  }
  Ctor.prototype = Parent.prototype;
  Child.prototype = new Ctor();

  But recommended is,

  function Child() {
    Parent.call(this);
  }
  // util.inherits(Child, Parent);
  Child.prototype = Object.create(Parent.prototype, {
    constructor: {
      value: Child,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });

  This was causing event emitter values initialized in the constructor to
  be shared on the prototype of the TokenTransformManagers, resulting in
  an infinite recursion.

Bug: 45994
Change-Id: Ic588060b5ebbc073839cce7c144e266bc4a5ab79
---
M js/lib/ext.core.TemplateHandler.js
M js/lib/mediawiki.ApiRequest.js
M js/lib/mediawiki.DOMPostProcessor.js
M js/lib/mediawiki.HTML5TreeBuilder.node.js
M js/lib/mediawiki.TokenTransformManager.js
M js/lib/mediawiki.WikiConfig.js
M js/lib/mediawiki.tokenizer.peg.js
M js/tests/client/client.js
M js/tests/dumpGrepper.js
9 files changed, 26 insertions(+), 31 deletions(-)

Approvals:
  Subramanya Sastry: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/js/lib/ext.core.TemplateHandler.js 
b/js/lib/ext.core.TemplateHandler.js
index eb529b4..25c28ac 100644
--- a/js/lib/ext.core.TemplateHandler.js
+++ b/js/lib/ext.core.TemplateHandler.js
@@ -925,7 +925,7 @@
                        env.requestQueue[text] = new Processor( 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/mediawiki.ApiRequest.js b/js/lib/mediawiki.ApiRequest.js
index 0fc7d2d..6959579 100644
--- a/js/lib/mediawiki.ApiRequest.js
+++ b/js/lib/mediawiki.ApiRequest.js
@@ -371,8 +371,6 @@
 
 
 // Inherit from ApiRequest
-//PreprocessorRequest.prototype = new ApiRequest();
-//PreprocessorRequest.prototype.constructor = PreprocessorRequest;
 util.inherits( PreprocessorRequest, ApiRequest );
 
 /**
diff --git a/js/lib/mediawiki.DOMPostProcessor.js 
b/js/lib/mediawiki.DOMPostProcessor.js
index 5d1b005..d3b8193 100644
--- a/js/lib/mediawiki.DOMPostProcessor.js
+++ b/js/lib/mediawiki.DOMPostProcessor.js
@@ -3,6 +3,7 @@
 "use strict";
 
 var events = require('events'),
+       util = require('util'),
        Util = require('./mediawiki.Util.js').Util,
        DU = require('./mediawiki.DOMUtils.js').DOMUtils,
        Node = require('./mediawiki.wikitext.constants.js').Node,
@@ -2989,6 +2990,7 @@
 }
 
 function DOMPostProcessor(env, options) {
+       events.EventEmitter.call(this);
        this.env = env;
        this.options = options;
 
@@ -3038,8 +3040,7 @@
 }
 
 // Inherit from EventEmitter
-DOMPostProcessor.prototype = new events.EventEmitter();
-DOMPostProcessor.prototype.constructor = DOMPostProcessor;
+util.inherits(DOMPostProcessor, events.EventEmitter);
 
 DOMPostProcessor.prototype.setSourceOffsets = function(start, end) {
        this.options.sourceOffsets = [start, end];
diff --git a/js/lib/mediawiki.HTML5TreeBuilder.node.js 
b/js/lib/mediawiki.HTML5TreeBuilder.node.js
index 85574f8..2e24c84 100644
--- a/js/lib/mediawiki.HTML5TreeBuilder.node.js
+++ b/js/lib/mediawiki.HTML5TreeBuilder.node.js
@@ -6,6 +6,7 @@
  * or .body(). */
 
 var events = require('events'),
+       util = require('util'),
        $ = require( './fakejquery' ),
        HTML5 = require('./html5/index'),
        defines = require('./mediawiki.parser.defines.js'),
@@ -22,6 +23,8 @@
 
 
 FauxHTML5.TreeBuilder = function ( env ) {
+       events.EventEmitter.call(this);
+
        // The parser we are going to emit our tokens to
        this.parser = new HTML5.Parser();
 
@@ -39,8 +42,7 @@
 };
 
 // Inherit from EventEmitter
-FauxHTML5.TreeBuilder.prototype = new events.EventEmitter();
-FauxHTML5.TreeBuilder.prototype.constructor = FauxHTML5.TreeBuilder;
+util.inherits(FauxHTML5.TreeBuilder, events.EventEmitter);
 
 /**
  * Register for (token) 'chunk' and 'end' events from a token emitter,
diff --git a/js/lib/mediawiki.TokenTransformManager.js 
b/js/lib/mediawiki.TokenTransformManager.js
index cea772a..e3aa16a 100644
--- a/js/lib/mediawiki.TokenTransformManager.js
+++ b/js/lib/mediawiki.TokenTransformManager.js
@@ -18,6 +18,7 @@
 var events = require('events'),
        LRU = require("lru-cache"),
        crypto = require('crypto'),
+       util = require('util'),
        Util = require('./mediawiki.Util.js').Util,
        defines = require('./mediawiki.parser.defines.js');
 // define some constructor shortcuts
@@ -63,8 +64,10 @@
  * its only argument.
  */
 function TokenTransformManager( env, options, pipeFactory, phaseEndRank, 
attributeType ) {
-       // Separate the constructor, so that we can call it from subclasses.
-       this._construct();
+       events.EventEmitter.call(this);
+       this.defaultTransformers = [];  // any transforms
+       this.tokenTransformers   = {};  // non-any transforms
+       this.cachedTransformers  = {};  // merged any + non-any transforms
 }
 
 function tokenTransformersKey(tkType, tagName) {
@@ -84,14 +87,7 @@
 };
 
 // Inherit from EventEmitter
-TokenTransformManager.prototype = new events.EventEmitter();
-TokenTransformManager.prototype.constructor = TokenTransformManager;
-
-TokenTransformManager.prototype._construct = function () {
-       this.defaultTransformers = [];  // any transforms
-       this.tokenTransformers   = {};  // non-any transforms
-       this.cachedTransformers  = {};  // merged any + non-any transforms
-};
+util.inherits(TokenTransformManager, events.EventEmitter);
 
 /**
  * Register to a token source, normally the tokenizer.
@@ -259,6 +255,7 @@
  * @param {string} attributeType
  */
 function AsyncTokenTransformManager ( env, options, pipeFactory, phaseEndRank, 
attributeType ) {
+       TokenTransformManager.call(this);
        this.uid = auid++; // useful for debugging
        this.env = env;
        this.options = options;
@@ -268,12 +265,10 @@
        this.setFrame( null, null, [] );
        this.debug = env.conf.parsoid.debug;
        this.trace = env.conf.parsoid.traceFlags && 
(env.conf.parsoid.traceFlags.indexOf("async:" + phaseEndRank) !== -1);
-       this._construct();
 }
 
 // Inherit from TokenTransformManager, and thus also from EventEmitter.
-AsyncTokenTransformManager.prototype = new TokenTransformManager();
-AsyncTokenTransformManager.prototype.constructor = AsyncTokenTransformManager;
+util.inherits(AsyncTokenTransformManager, TokenTransformManager);
 
 // Reset state between uses
 AsyncTokenTransformManager.prototype.reset = function() {
@@ -825,18 +820,17 @@
  * @param {string} attributeType
  */
 function SyncTokenTransformManager ( env, options, pipeFactory, phaseEndRank, 
attributeType ) {
+       TokenTransformManager.call(this);
        this.env = env;
        this.options = options;
        this.pipeFactory = pipeFactory;
        this.phaseEndRank = phaseEndRank;
        this.attributeType = attributeType;
        this.trace = env.conf.parsoid.traceFlags && 
(env.conf.parsoid.traceFlags.indexOf("sync:" + phaseEndRank) !== -1);
-       this._construct();
 }
 
 // Inherit from TokenTransformManager, and thus also from EventEmitter.
-SyncTokenTransformManager.prototype = new TokenTransformManager();
-SyncTokenTransformManager.prototype.constructor = SyncTokenTransformManager;
+util.inherits(SyncTokenTransformManager, TokenTransformManager);
 
 /**
  * @method
diff --git a/js/lib/mediawiki.WikiConfig.js b/js/lib/mediawiki.WikiConfig.js
index 776fb23..c789e8a 100644
--- a/js/lib/mediawiki.WikiConfig.js
+++ b/js/lib/mediawiki.WikiConfig.js
@@ -527,8 +527,6 @@
                delete this.extensionTags[tagName];
        }
 };
-// Make sure the prototype is never modified
-Util.deepFreeze(WikiConfig.prototype);
 
 if ( typeof module === 'object' ) {
        module.exports.WikiConfig = WikiConfig;
diff --git a/js/lib/mediawiki.tokenizer.peg.js 
b/js/lib/mediawiki.tokenizer.peg.js
index 6fb9c70..dd69e99 100644
--- a/js/lib/mediawiki.tokenizer.peg.js
+++ b/js/lib/mediawiki.tokenizer.peg.js
@@ -12,9 +12,11 @@
        path = require('path'),
        LRU = require("lru-cache"),
        fs = require('fs'),
-       events = require('events');
+       events = require('events'),
+       util = require('util');
 
 function PegTokenizer( env, options ) {
+       events.EventEmitter.call(this);
        this.env = env;
        this.options = options || {};
        this.offsets = {};
@@ -25,8 +27,7 @@
 }
 
 // Inherit from EventEmitter
-PegTokenizer.prototype = new events.EventEmitter();
-PegTokenizer.prototype.constructor = PegTokenizer;
+util.inherits(PegTokenizer, events.EventEmitter);
 
 PegTokenizer.src = false;
 
diff --git a/js/tests/client/client.js b/js/tests/client/client.js
index 1238a6d..ba9f96f 100755
--- a/js/tests/client/client.js
+++ b/js/tests/client/client.js
@@ -143,6 +143,7 @@
                                        cb( 'start' );
                                }
                        } );
+                       res.resume();
                } );
 
                req.write( result, 'utf8' );
diff --git a/js/tests/dumpGrepper.js b/js/tests/dumpGrepper.js
index 5186615..a290885 100755
--- a/js/tests/dumpGrepper.js
+++ b/js/tests/dumpGrepper.js
@@ -5,17 +5,17 @@
 
 var dumpReader = require('./dumpReader.js'),
        events = require('events'),
+       util = require('util'),
        optimist = require('optimist'),
        Util = require( '../lib/mediawiki.Util.js' ).Util;
 
 function DumpGrepper ( regexp ) {
        // inherit from EventEmitter
-       //events.EventEmitter.call(this);
+       events.EventEmitter.call(this);
        this.re = regexp;
 }
 
-DumpGrepper.prototype = new events.EventEmitter();
-DumpGrepper.prototype.constructor = DumpGrepper;
+util.inherits(DumpGrepper, events.EventEmitter);
 
 DumpGrepper.prototype.grepRev = function ( revision, onlyFirst ) {
        var result = this.re.exec( revision.text ),

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic588060b5ebbc073839cce7c144e266bc4a5ab79
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>
Gerrit-Reviewer: Arlolra <[email protected]>
Gerrit-Reviewer: Cscott <[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