Arlolra has uploaded a new change for review.

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

Change subject: Remove chunk callback from serializeDOM
......................................................................

Remove chunk callback from serializeDOM

 * We only ever return one large chunk (accumulation happens internally)
   and this process is sync. Just pass it all in the final callback.

Change-Id: I0122f1e015f35badb4598a74b39ebc6a7d8ef377
---
M api/routes.js
M lib/mediawiki.SelectiveSerializer.js
M lib/mediawiki.WikitextSerializer.js
M tests/mocha/parse.js
M tests/parserTests.js
5 files changed, 30 insertions(+), 50 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid 
refs/changes/95/200095/1

diff --git a/api/routes.js b/api/routes.js
index 97b18ee..3ff6e73 100644
--- a/api/routes.js
+++ b/api/routes.js
@@ -124,8 +124,6 @@
 };
 
 var roundTripDiff = function( env, req, res, selser, doc ) {
-       var out = [];
-
        // Re-parse the HTML to uncover foster-parenting issues
        doc = domino.createDocument( doc.outerHTML );
 
@@ -133,17 +131,14 @@
                serializer = new Serializer({ env: env });
 
        return Promise.promisify( serializer.serializeDOM, false, serializer )(
-               doc.body, function( chunk ) { out.push(chunk); }, false
-       ).then(function() {
-               var i;
-               out = out.join('');
-
+               doc.body, false
+       ).then(function( out ) {
                // Strip selser trigger comment
                out = out.replace(/<!--rtSelserEditTestComment-->\n*$/, '');
 
                // Emit base href so all relative urls resolve properly
                var hNodes = doc.body.firstChild.childNodes;
-               var headNodes = "";
+               var i, headNodes = "";
                for (i = 0; i < hNodes.length; i++) {
                        if (hNodes[i].nodeName.toLowerCase() === 'base') {
                                headNodes += DU.serializeNode(hNodes[i]);
@@ -270,7 +265,6 @@
                                                   env.conf.parsoid.allowCORS );
        }
 
-       var out = [];
        var p = new Promise(function( resolve, reject ) {
                if ( v2 && v2.original && v2.original.wikitext ) {
                        env.setPageSrcInfo( v2.original.wikitext.body );
@@ -323,11 +317,10 @@
                        }
                }
                return Promise.promisify( serializer.serializeDOM, false, 
serializer )(
-                       doc.body, function( chunk ) { out.push( chunk ); }, 
false
+                       doc.body, false
                );
-       }).timeout( REQ_TIMEOUT ).then(function() {
-               var output = out.join(''),
-                       contentType = 
'text/plain;profile=mediawiki.org/specs/wikitext/1.0.0;charset=utf-8';
+       }).timeout( REQ_TIMEOUT ).then(function( output ) {
+               var contentType = 
'text/plain;profile=mediawiki.org/specs/wikitext/1.0.0;charset=utf-8';
                if ( v2 ) {
                        apiUtils.jsonResponse(res, env, {
                                wikitext: {
diff --git a/lib/mediawiki.SelectiveSerializer.js 
b/lib/mediawiki.SelectiveSerializer.js
index 788a8bf..e525854 100644
--- a/lib/mediawiki.SelectiveSerializer.js
+++ b/lib/mediawiki.SelectiveSerializer.js
@@ -50,11 +50,9 @@
  *
  * @param {Error} err
  * @param {Node} body
- * @param {Function} cb Callback that is called for each chunk.
- * @param {string} cb.res The wikitext of the chunk we've just serialized.
  * @param {Function} finalcb The callback for when we've finished serializing 
the DOM.
  */
-SSP.doSerializeDOM = function( err, body, cb, finalcb ) {
+SSP.doSerializeDOM = function( err, body, finalcb ) {
        var self = this;
        var startTimers = new Map();
 
@@ -64,7 +62,7 @@
                }
 
                // If there's no old source, fall back to non-selective 
serialization.
-               this.wts.serializeDOM( body, cb, false, finalcb );
+               this.wts.serializeDOM( body, false, finalcb );
 
                if ( this.timer ) {
                        this.timer.timing( 'html2wt.full.serialize', '', ( 
Date.now() - startTimers.get( 'html2wt.full.serialize' )) );
@@ -97,7 +95,7 @@
                        }
 
                        // Call the WikitextSerializer to do our bidding
-                       this.wts.serializeDOM( body, cb, true, finalcb );
+                       this.wts.serializeDOM( body, true, finalcb );
 
                        if ( this.timer ) {
                                this.timer.timing( 'html2wt.selser.serialize', 
'', ( Date.now() - startTimers.get( 'html2wt.selser.serialize' )) );
@@ -105,8 +103,7 @@
 
                } else {
                        // Nothing was modified, just re-use the original source
-                       cb( this.env.page.src );
-                       finalcb();
+                       finalcb( null, this.env.page.src );
                }
        }
 };
@@ -118,14 +115,12 @@
  * Parse the wikitext source of the page for DOM-diffing purposes.
  *
  * @param {Node} body The node for which we're getting the source.
- * @param {Function} cb A callback to call after each chunk is serialized.
- * @param {string} cb.res The result of the chunk serialization.
  * @param {Function} finalcb The callback for after we've serialized the 
entire document.
  * @param {Error} err
  * @param {string} src The wikitext source of the document (optionally
  *                     including page metadata)
  */
-SSP.parseOriginalSource = function( body, cb, finalcb, err, src ) {
+SSP.parseOriginalSource = function( body, finalcb, err, src ) {
        var self = this,
                parserPipelineFactory = new ParserPipelineFactory( this.env ),
                parserPipeline = parserPipelineFactory.getPipeline( 
'text/x-mediawiki/full' );
@@ -137,7 +132,7 @@
        // doSerializeDOM
        parserPipeline.once( 'document', function( origDoc ) {
                self.env.page.dom = DU.parseHTML( DU.serializeNode( origDoc ) 
).body;
-               self.doSerializeDOM( null, body, cb, finalcb );
+               self.doSerializeDOM( null, body, finalcb );
        } );
        parserPipeline.processToplevelDoc( this.env.page.src );
 };
@@ -150,18 +145,16 @@
  * WikitextSerializer.serializeDOM if changes were found.
  *
  * @param {Node} body The document to serialize.
- * @param {Function} cb A callback for any serialized chunks, called whenever 
we get a chunk of wikitext.
- * @param {string} cb.res The chunk of wikitext just serialized.
+ * @param {null} dummy Preserves the wt serializer interface.
  * @param {Function} finalcb The callback fired on completion of the 
serialization.
  */
-SSP.serializeDOM = function( body, cb, dummy, finalcb ) {
-       // dummy preserves the wt serializer interface
+SSP.serializeDOM = function( body, dummy, finalcb ) {
        var self = this;
        if ( this.env.page.dom || this.env.page.domdiff ) {
-               this.doSerializeDOM( null, body, cb, finalcb );
+               this.doSerializeDOM( null, body, finalcb );
        } else if ( this.env.page.src ) {
                // Have the src, only parse the src to the dom
-               this.parseOriginalSource( body, cb, finalcb, null, 
this.env.page.src );
+               this.parseOriginalSource( body, finalcb, null, 
this.env.page.src );
        } else if ( this.env.page.id && this.env.page.id !== '0' ) {
                // Start by getting the old text of this page
                if ( this.env.conf.parsoid.parsoidCacheURI ) {
@@ -187,16 +180,16 @@
 
                                // Selective serialization if there was no 
error, full
                                // serialization if there was one.
-                               self.doSerializeDOM( err, body, cb, finalcb );
+                               self.doSerializeDOM( err, body, finalcb );
                        });
                } else {
                        Util.getPageSrc(
                                this.env, this.env.page.name, this.env.page.id 
|| null,
-                               this.parseOriginalSource.bind( this, body, cb, 
finalcb )
+                               this.parseOriginalSource.bind( this, body, 
finalcb )
                        );
                }
        } else {
-               this.doSerializeDOM( null, body, cb, finalcb );
+               this.doSerializeDOM( null, body, finalcb );
        }
 
 };
diff --git a/lib/mediawiki.WikitextSerializer.js 
b/lib/mediawiki.WikitextSerializer.js
index 87644ca..038b598 100644
--- a/lib/mediawiki.WikitextSerializer.js
+++ b/lib/mediawiki.WikitextSerializer.js
@@ -1379,7 +1379,7 @@
 /**
  * Serialize an HTML DOM document.
  */
-WSP.serializeDOM = function( body, chunkCB, selserMode, finalCB ) {
+WSP.serializeDOM = function( body, selserMode, finalCB ) {
        this.logType = selserMode ? "trace/selser" : "trace/wts";
        this.trace = this.env.log.bind(this.env, this.logType);
 
@@ -1427,17 +1427,13 @@
                        // Strip excess/useless nowikis
                        out = stripUnnecessaryIndentPreNowikis( this.env, out );
                }
+
                if (state.hasQuoteNowikis) {
                        // FIXME: Perhaps this can be done on a per-line basis
                        // rather than do one post-pass on the entire document.
                        //
                        // Strip excess/useless nowikis
                        out = stripUnnecessaryQuoteNowikis(out);
-               }
-
-               if (chunkCB) {
-                       // Pass entire output in one big chunk
-                       chunkCB(out);
                }
 
                if ( finalCB && typeof finalCB === 'function' ) {
diff --git a/tests/mocha/parse.js b/tests/mocha/parse.js
index df44848..3ae6a23 100644
--- a/tests/mocha/parse.js
+++ b/tests/mocha/parse.js
@@ -55,9 +55,9 @@
                                        DU.applyDataParsoid( doc, dp );
                                }
                                var serializer = new WikitextSerializer({ env: 
env });
-                               return Promise.promisify( 
serializer.serializeDOM, false, serializer )(
-                                       doc.body, null, false
-                               );
+                               return Promise.promisify(
+                                       serializer.serializeDOM, false, 
serializer
+                               )( doc.body, false );
                        });
                };
 
diff --git a/tests/parserTests.js b/tests/parserTests.js
index ec05097..1a6f8cc 100755
--- a/tests/parserTests.js
+++ b/tests/parserTests.js
@@ -415,8 +415,7 @@
        // Maybe pass this as an option, or clone the entire environment.
        this.env.conf.parsoid.rtTestMode = options.rtTestMode;
 
-       var wt = '', self = this,
-               startsAtWikitext = mode === 'wt2wt' || mode === 'wt2html' || 
mode === 'selser',
+       var startsAtWikitext = mode === 'wt2wt' || mode === 'wt2html' || mode 
=== 'selser',
                serializer = (mode === 'selser')
                        ? new SelectiveSerializer({ env: this.env })
                        : new WikitextSerializer({ env: this.env });
@@ -432,13 +431,12 @@
                        this.env.setPageSrcInfo( null );
                }
 
-               serializer.serializeDOM( body, function ( res ) {
-                       wt += res;
-               }, false, function(err) {
-                       if (err) {
-                               self.env.log("fatal", err);
+               var self = this;
+               serializer.serializeDOM( body, false, function( err, wt ) {
+                       if ( err ) {
+                               self.env.log("error", err);
                        }
-                       processWikitextCB( null, wt );
+                       processWikitextCB( err, wt );
                        self.env.setPageSrcInfo( null );
                        self.env.page.dom = null;
                } );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0122f1e015f35badb4598a74b39ebc6a7d8ef377
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/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