Arlolra has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/76114


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().

* 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 .gitignore
M .jshintignore
M js/lib/ext.core.TemplateHandler.js
M js/lib/html5/parser.js
M js/lib/html5/parser/after_after_body_phase.js
M js/lib/html5/parser/after_body_phase.js
M js/lib/html5/parser/after_frameset_phase.js
M js/lib/html5/parser/after_head_phase.js
M js/lib/html5/parser/before_head_phase.js
M js/lib/html5/parser/before_html_phase.js
M js/lib/html5/parser/in_body_phase.js
M js/lib/html5/parser/in_caption_phase.js
M js/lib/html5/parser/in_cell_phase.js
M js/lib/html5/parser/in_column_group_phase.js
M js/lib/html5/parser/in_foreign_content_phase.js
M js/lib/html5/parser/in_frameset_phase.js
M js/lib/html5/parser/in_head_phase.js
M js/lib/html5/parser/in_row_phase.js
M js/lib/html5/parser/in_select_in_table_phase.js
M js/lib/html5/parser/in_select_phase.js
M js/lib/html5/parser/in_table_body_phase.js
M js/lib/html5/parser/in_table_phase.js
M js/lib/html5/parser/initial_phase.js
M js/lib/html5/parser/root_element_phase.js
M js/lib/html5/parser/trailing_end_phase.js
M js/lib/html5/tokenizer.js
M js/lib/html5/treewalker.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/dumpGrepper.js
34 files changed, 95 insertions(+), 62 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Parsoid 
refs/changes/14/76114/1

diff --git a/.gitignore b/.gitignore
index cbbd961..bf9cd49 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,6 @@
 js/api/npm-debug.log
 js/node_modules/
 js/tests/parserTests.cache
+js/tests/server/pages.db
+js/tests/client/config.js
 js/doc
diff --git a/.jshintignore b/.jshintignore
index d11a3c8..801790c 100644
--- a/.jshintignore
+++ b/.jshintignore
@@ -2,3 +2,4 @@
 js/node_modules
 js/api/scripts/jquery.js
 js/doc
+js/tests/server/node_modules
diff --git a/js/lib/ext.core.TemplateHandler.js 
b/js/lib/ext.core.TemplateHandler.js
index e8ac1f3..36600f0 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/html5/parser.js b/js/lib/html5/parser.js
index c71d39f..857e147 100644
--- a/js/lib/html5/parser.js
+++ b/js/lib/html5/parser.js
@@ -1,6 +1,7 @@
 var HTML5 = exports.HTML5 = require('../html5');
 
-var events = require('events');
+var events = require('events'),
+       util = require('util');
 
 require('./treebuilder');
 require('../mediawiki.HTML5TreeBuilder.node');
@@ -37,7 +38,7 @@
        this.tree = new HTML5.TreeBuilder(this.document);
 }
 
-Parser.prototype = new events.EventEmitter;
+util.inherits(Parser, events.EventEmitter);
 
 // normally accepts the source
 Parser.prototype.parse = function(tokenizer) {
diff --git a/js/lib/html5/parser/after_after_body_phase.js 
b/js/lib/html5/parser/after_after_body_phase.js
index 690dacb..830d9fe 100644
--- a/js/lib/html5/parser/after_after_body_phase.js
+++ b/js/lib/html5/parser/after_after_body_phase.js
@@ -1,5 +1,6 @@
 var Phase = require('./phase').Phase;
 var inBody = require('./in_body_phase').Phase;
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -11,7 +12,7 @@
        this.start_tag_handlers = start_tag_handlers;
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processComment = function(data) {
        this.tree.insert_comment(data);
diff --git a/js/lib/html5/parser/after_body_phase.js 
b/js/lib/html5/parser/after_body_phase.js
index e09a56c..e76659d 100644
--- a/js/lib/html5/parser/after_body_phase.js
+++ b/js/lib/html5/parser/after_body_phase.js
@@ -1,4 +1,5 @@
 var Phase = require('./phase').Phase;
+var util = require('util');
 
 var end_tag_handlers = {
        html: 'endTagHtml',
@@ -10,7 +11,7 @@
        this.end_tag_handlers = end_tag_handlers;
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processComment = function(data) {
        // This is needed because data is to be appended to the html element 
here
diff --git a/js/lib/html5/parser/after_frameset_phase.js 
b/js/lib/html5/parser/after_frameset_phase.js
index 1039c10..f3f0d76 100644
--- a/js/lib/html5/parser/after_frameset_phase.js
+++ b/js/lib/html5/parser/after_frameset_phase.js
@@ -1,5 +1,6 @@
 var Phase = require('./phase').Phase;
 var inBody = require('./in_body_phase').Phase;
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -18,7 +19,7 @@
        this.end_tag_handlers = end_tag_handlers;
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processCharacters = function(data) {
        this.parse_error("unexpected-char-after-frameset");
diff --git a/js/lib/html5/parser/after_head_phase.js 
b/js/lib/html5/parser/after_head_phase.js
index 134f449..d7e8566 100644
--- a/js/lib/html5/parser/after_head_phase.js
+++ b/js/lib/html5/parser/after_head_phase.js
@@ -1,5 +1,6 @@
 var Phase = require('./phase').Phase;
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -23,14 +24,12 @@
 
 var p = exports.Phase = function AfterHeadPhase(parser, tree) {
        Phase.call(this, parser, tree);
-        this.start_tag_handlers = start_tag_handlers;
-        this.end_tag_handlers = end_tag_handlers;
-
+       this.start_tag_handlers = start_tag_handlers;
+       this.end_tag_handlers = end_tag_handlers;
        this.name = 'after_head_phase';
 }
 
-p.prototype = new Phase;
-
+util.inherits(p, Phase);
 
 p.prototype.processEOF = function() {
        this.anything_else();
diff --git a/js/lib/html5/parser/before_head_phase.js 
b/js/lib/html5/parser/before_head_phase.js
index a100ee1..75db053 100644
--- a/js/lib/html5/parser/before_head_phase.js
+++ b/js/lib/html5/parser/before_head_phase.js
@@ -1,4 +1,5 @@
 var Phase = require('./phase').Phase;
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -22,7 +23,7 @@
        this.name = 'before_head_phase';
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processEOF = function() {
        this.startTagHead('head', {});
diff --git a/js/lib/html5/parser/before_html_phase.js 
b/js/lib/html5/parser/before_html_phase.js
index 4e39817..889acfe 100644
--- a/js/lib/html5/parser/before_html_phase.js
+++ b/js/lib/html5/parser/before_html_phase.js
@@ -1,12 +1,13 @@
 var Phase = require('./phase').Phase;
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var p = exports.Phase = function BeforeHtmlPhase(parser, tree) {
        Phase.call(this, parser, tree);
        this.name = 'before_html_phase'
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processEOF = function() {
        this.insert_html_element();
diff --git a/js/lib/html5/parser/in_body_phase.js 
b/js/lib/html5/parser/in_body_phase.js
index 76cf084..7058509 100644
--- a/js/lib/html5/parser/in_body_phase.js
+++ b/js/lib/html5/parser/in_body_phase.js
@@ -1,6 +1,7 @@
 var HTML5 = require('../../html5');
 var Phase = require('./phase').Phase;
-var assert = require('assert')
+var assert = require('assert');
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -201,7 +202,7 @@
        this.name = 'in_body_phase';
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processSpaceCharactersDropNewline = function(data) {
        this.dropNewline = false
diff --git a/js/lib/html5/parser/in_caption_phase.js 
b/js/lib/html5/parser/in_caption_phase.js
index eaf5245..55e5fa3 100644
--- a/js/lib/html5/parser/in_caption_phase.js
+++ b/js/lib/html5/parser/in_caption_phase.js
@@ -2,6 +2,7 @@
 var inBody = require('./in_body_phase').Phase;
 var assert = require('assert');
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var starts = {
        html: 'startTagHtml',
@@ -37,7 +38,7 @@
        this.end_tag_handlers = ends;
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.ignoreEndTagCaption = function() {
        return !this.inScope('caption', HTML5.TABLE_SCOPING_ELEMENTS);
diff --git a/js/lib/html5/parser/in_cell_phase.js 
b/js/lib/html5/parser/in_cell_phase.js
index 4b83504..05e4344 100644
--- a/js/lib/html5/parser/in_cell_phase.js
+++ b/js/lib/html5/parser/in_cell_phase.js
@@ -1,6 +1,7 @@
 var Phase = require('./phase').Phase;
 var inBody = require('./in_body_phase').Phase;
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var starts = {
        html: 'startTagHtml',
@@ -38,8 +39,7 @@
        this.end_tag_handlers = ends;
 }
 
-exports.Phase.prototype = new Phase;
-
+util.inherits(exports.Phase, Phase);
 var p = exports.Phase.prototype;
 
 p.processCharacters = function(data) {
diff --git a/js/lib/html5/parser/in_column_group_phase.js 
b/js/lib/html5/parser/in_column_group_phase.js
index f89d4c5..28eab79 100644
--- a/js/lib/html5/parser/in_column_group_phase.js
+++ b/js/lib/html5/parser/in_column_group_phase.js
@@ -1,6 +1,7 @@
 var Phase = require('./phase').Phase
 var HTML5 = require('../../html5')
-var assert = require('assert')
+var assert = require('assert');
+var util = require('util');
 
 var start = {
        html: 'startTagHtml',
@@ -20,7 +21,8 @@
        this.end_tag_handlers = end
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.ignoreEndTagColgroup = function() {
        return this.tree.open_elements.last().tagName.toLowerCase() == 'html'
diff --git a/js/lib/html5/parser/in_foreign_content_phase.js 
b/js/lib/html5/parser/in_foreign_content_phase.js
index 1b4f4be..dc815b4 100644
--- a/js/lib/html5/parser/in_foreign_content_phase.js
+++ b/js/lib/html5/parser/in_foreign_content_phase.js
@@ -1,4 +1,5 @@
 var Phase = require('./phase').Phase;
+var util = require('util');
 
 var starts = {
        '-default': 'startTagOther'
@@ -15,7 +16,8 @@
        this.end_tag_handlers = ends;
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.startTagOther = function(name, attributes, self_closing) {
        if(['mglyph', 'malignmark'].indexOf(name) != -1 
diff --git a/js/lib/html5/parser/in_frameset_phase.js 
b/js/lib/html5/parser/in_frameset_phase.js
index 038979c..a5aef27 100644
--- a/js/lib/html5/parser/in_frameset_phase.js
+++ b/js/lib/html5/parser/in_frameset_phase.js
@@ -1,5 +1,6 @@
 var Phase = require('./phase').Phase;
 var inBody = require('./in_body_phase').Phase;
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -21,7 +22,7 @@
        this.end_tag_handlers = end_tag_handlers;
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processCharacters = function(data) {
        this.parse_error("unexpected-char-in-frameset");
diff --git a/js/lib/html5/parser/in_head_phase.js 
b/js/lib/html5/parser/in_head_phase.js
index 497a471..ade21e1 100644
--- a/js/lib/html5/parser/in_head_phase.js
+++ b/js/lib/html5/parser/in_head_phase.js
@@ -1,5 +1,6 @@
 var Phase = require('./phase').Phase;
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -35,7 +36,7 @@
        this.end_tag_handlers = end_tag_handlers;
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processEOF = function() {
        var name = this.tree.open_elements.last().tagName.toLowerCase()
diff --git a/js/lib/html5/parser/in_row_phase.js 
b/js/lib/html5/parser/in_row_phase.js
index 4d1d936..192d24b 100644
--- a/js/lib/html5/parser/in_row_phase.js
+++ b/js/lib/html5/parser/in_row_phase.js
@@ -2,6 +2,7 @@
 var HTML5 = require('../../html5')
 var inTable = require('./in_table_phase').Phase;
 var assert = require('assert');
+var util = require('util');
 
 var starts = {
        html: 'startTagHtml',
@@ -39,7 +40,8 @@
        this.end_tag_handlers = ends;
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.processCharacters = function(data) {
        new inTable(this.parser, this.tree).processCharacters(data);
diff --git a/js/lib/html5/parser/in_select_in_table_phase.js 
b/js/lib/html5/parser/in_select_in_table_phase.js
index 6cebe9c..b0c216b 100644
--- a/js/lib/html5/parser/in_select_in_table_phase.js
+++ b/js/lib/html5/parser/in_select_in_table_phase.js
@@ -1,6 +1,7 @@
 var HTML5 = require('../../html5')
 var Phase = require('./phase').Phase;
 var inSelect = require('./in_select_phase').Phase;
+var util = require('util');
 
 var start_tag_handlers = {
        caption: 'startTagTable',
@@ -27,13 +28,14 @@
 }
 
 exports.Phase = function InSelectInTablePhase(parser, tree) {
-        Phase.call(this, parser, tree);
-        this.start_tag_handlers = start_tag_handlers;
-        this.end_tag_handlers = end_tag_handlers;
-        this.name = 'in_select_in_table';
+       Phase.call(this, parser, tree);
+       this.start_tag_handlers = start_tag_handlers;
+       this.end_tag_handlers = end_tag_handlers;
+       this.name = 'in_select_in_table';
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.processCharacters = function(data) {
        new inSelect(this.parser, this.tree).processCharacters(data)
diff --git a/js/lib/html5/parser/in_select_phase.js 
b/js/lib/html5/parser/in_select_phase.js
index 7279af0..acc1db3 100644
--- a/js/lib/html5/parser/in_select_phase.js
+++ b/js/lib/html5/parser/in_select_phase.js
@@ -1,5 +1,6 @@
 var Phase = require('./phase').Phase;
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var starts = {
        html: 'startTagHtml',
@@ -30,7 +31,8 @@
        this.end_tag_handlers = ends;
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.processCharacters = function(data) {
        this.tree.insert_text(data);
diff --git a/js/lib/html5/parser/in_table_body_phase.js 
b/js/lib/html5/parser/in_table_body_phase.js
index 7e93b8f..a4f7195 100644
--- a/js/lib/html5/parser/in_table_body_phase.js
+++ b/js/lib/html5/parser/in_table_body_phase.js
@@ -1,6 +1,7 @@
 var Phase = require('./phase').Phase;
 var inTable = require('./in_table_phase').Phase
 var HTML5 = require('../../html5');
+var util = require('util');
 
 var starts = {
        html: 'startTagHtml',
@@ -38,7 +39,8 @@
        this.end_tag_handlers = ends;
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.processCharacters = function(data) {
        new inTable(this.parser, this.tree).processCharacters(data);
diff --git a/js/lib/html5/parser/in_table_phase.js 
b/js/lib/html5/parser/in_table_phase.js
index 4be0b27..0728b14 100644
--- a/js/lib/html5/parser/in_table_phase.js
+++ b/js/lib/html5/parser/in_table_phase.js
@@ -1,6 +1,7 @@
 var Phase = require('./phase').Phase;
 var inBody = require('./in_body_phase').Phase;
-var HTML5 = require('../../html5')
+var HTML5 = require('../../html5');
+var util = require('util');
 
 var start_tag_handlers = {
        html: 'startTagHtml',
@@ -39,7 +40,7 @@
        this.end_tag_handlers = end_tag_handlers;
 };
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processCharacters =  function(data) {
        this.parse_error("unexpected-char-implies-table-voodoo");
diff --git a/js/lib/html5/parser/initial_phase.js 
b/js/lib/html5/parser/initial_phase.js
index 7454272..2f31f4e 100644
--- a/js/lib/html5/parser/initial_phase.js
+++ b/js/lib/html5/parser/initial_phase.js
@@ -1,11 +1,12 @@
 var Phase = require('./phase').Phase;
+var util = require('util');
 
 var p = exports.Phase = function InitialPhase(parser, tree) {
        Phase.call(this, parser, tree);
        this.name = 'initial_phase';
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processEOF = function() {
        this.parse_error("expected-doctype-but-got-eof");
diff --git a/js/lib/html5/parser/root_element_phase.js 
b/js/lib/html5/parser/root_element_phase.js
index 832cecd..2faeeaa 100644
--- a/js/lib/html5/parser/root_element_phase.js
+++ b/js/lib/html5/parser/root_element_phase.js
@@ -1,10 +1,12 @@
 var Phase = require('./phase').Phase
+var util = require('util');
 
 exports.Phase = function rootElementPhase(parser, tree) {
        Phase.call(this, parser, tree)
 }
 
-var p = exports.Phase.prototype = new Phase;
+util.inherits(exports.Phase, Phase);
+var p = exports.Phase.prototype;
 
 p.processEOF = function() {
        this.insert_html_element()
diff --git a/js/lib/html5/parser/trailing_end_phase.js 
b/js/lib/html5/parser/trailing_end_phase.js
index 07fc555..8f11154 100644
--- a/js/lib/html5/parser/trailing_end_phase.js
+++ b/js/lib/html5/parser/trailing_end_phase.js
@@ -1,10 +1,11 @@
 var Phase = require('./phase').Phase;
+var util = require('util');
 
 var p = exports.Phase = function TrailingEndPhase(parser, tree) {
        Phase.call(this, parser, tree);
 }
 
-p.prototype = new Phase;
+util.inherits(p, Phase);
 
 p.prototype.processEOF = function() {};
 
diff --git a/js/lib/html5/tokenizer.js b/js/lib/html5/tokenizer.js
index bc507d2..640b781 100644
--- a/js/lib/html5/tokenizer.js
+++ b/js/lib/html5/tokenizer.js
@@ -1,6 +1,7 @@
 require('../core-upgrade');
 var HTML5 = require('../html5');
 var events = require('events');
+var util = require('util');
 var Buffer = require('./buffer').Buffer;
 var Models = HTML5.Models;
 
@@ -13,6 +14,8 @@
 }
 
 var t = HTML5.Tokenizer = function HTML5Tokenizer(input, document) {
+       events.EventEmitter.call(this);
+
        var state;
        var buffer = new Buffer();
        var escapeFlag = false;
@@ -932,4 +935,4 @@
 
 }
 
-t.prototype = new events.EventEmitter;
+util.inherits(t, events.EventEmitter);
diff --git a/js/lib/html5/treewalker.js b/js/lib/html5/treewalker.js
index 1e1b902..e17d280 100644
--- a/js/lib/html5/treewalker.js
+++ b/js/lib/html5/treewalker.js
@@ -1,5 +1,6 @@
-var HTML5 = require('../html5');
-var events = require('events');
+var HTML5 = require('../html5'),
+       events = require('events'),
+       util = require('util');
 
 function error(msg) {
        return {type: 'SerializeError', data: msg};
@@ -53,6 +54,7 @@
 HTML5.TreeWalker = function(document, dest) {
        if(dest instanceof Function) this.addListener('token', dest);
        walk(document, this);
+       events.EventEmitter.call(this);
 };
 
 function walk(node, dest) {
@@ -93,4 +95,4 @@
        }
 }              
 
-HTML5.TreeWalker.prototype = new events.EventEmitter;
+util.inherits(HTML5.TreeWalker, events.EventEmitter);
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 f569fe4..3a764a0 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,
@@ -2924,11 +2925,11 @@
        domVisitor2.addHandler( 'li', cleanUpLIHack.bind( null, env ) );
        domVisitor2.addHandler( null, saveDataParsoid );
        this.processors.push(domVisitor2.traverse.bind(domVisitor2));
+       events.EventEmitter.call(this);
 }
 
 // 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 5bf7b7a..c64a00c 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'),
@@ -36,11 +37,12 @@
 
        // Assigned to start tags
        this.tagId = 1;
+
+       events.EventEmitter.call(this);
 };
 
 // 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..f676c4c 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
@@ -65,6 +66,7 @@
 function TokenTransformManager( env, options, pipeFactory, phaseEndRank, 
attributeType ) {
        // Separate the constructor, so that we can call it from subclasses.
        this._construct();
+       events.EventEmitter.call(this);
 }
 
 function tokenTransformersKey(tkType, tagName) {
@@ -84,8 +86,7 @@
 };
 
 // Inherit from EventEmitter
-TokenTransformManager.prototype = new events.EventEmitter();
-TokenTransformManager.prototype.constructor = TokenTransformManager;
+util.inherits(TokenTransformManager, events.EventEmitter);
 
 TokenTransformManager.prototype._construct = function () {
        this.defaultTransformers = [];  // any transforms
@@ -268,12 +269,11 @@
        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();
+       TokenTransformManager.call(this);
 }
 
 // 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() {
@@ -831,12 +831,11 @@
        this.phaseEndRank = phaseEndRank;
        this.attributeType = attributeType;
        this.trace = env.conf.parsoid.traceFlags && 
(env.conf.parsoid.traceFlags.indexOf("sync:" + phaseEndRank) !== -1);
-       this._construct();
+       TokenTransformManager.call(this);
 }
 
 // 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 6757544..4cef31c 100644
--- a/js/lib/mediawiki.tokenizer.peg.js
+++ b/js/lib/mediawiki.tokenizer.peg.js
@@ -12,7 +12,8 @@
        path = require('path'),
        LRU = require("lru-cache"),
        fs = require('fs'),
-       events = require('events');
+       events = require('events'),
+       util = require('util');
 
 function PegTokenizer( env, canCache ) {
        this.env = env;
@@ -21,11 +22,11 @@
        if ( this.canCache ) {
                this.cacheAccum = { chunks: [] };
        }
+       events.EventEmitter.call(this);
 }
 
 // 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/dumpGrepper.js b/js/tests/dumpGrepper.js
index 3200eda..38cde50 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 ) {
        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: newchange
Gerrit-Change-Id: Ic588060b5ebbc073839cce7c144e266bc4a5ab79
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>

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

Reply via email to