GWicke has uploaded a new change for review.

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


Change subject: Try to reuse a cached DOM for selective serialization
......................................................................

Try to reuse a cached DOM for selective serialization

Instead of re-parsing, use a cache service (if configured) to get the DOM for
the oldid this revision is based on. This will significantly speed up page
saving and avoid the associated API requests.

Change-Id: Ifaf0d9dc8572650d221d3dc1d29770448a61ee93
---
M js/lib/mediawiki.SelectiveSerializer.js
M js/lib/mediawiki.Util.js
2 files changed, 40 insertions(+), 6 deletions(-)


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

diff --git a/js/lib/mediawiki.SelectiveSerializer.js 
b/js/lib/mediawiki.SelectiveSerializer.js
index c8a88a5..6c1f533 100644
--- a/js/lib/mediawiki.SelectiveSerializer.js
+++ b/js/lib/mediawiki.SelectiveSerializer.js
@@ -10,7 +10,9 @@
 var WikitextSerializer = require( './mediawiki.WikitextSerializer.js' 
).WikitextSerializer,
        Util = require( './mediawiki.Util.js' ).Util,
        ParserPipelineFactory = 
require('./mediawiki.parser.js').ParserPipelineFactory,
-       DOMDiff = require('./mediawiki.DOMDiff.js').DOMDiff;
+       DOMDiff = require('./mediawiki.DOMDiff.js').DOMDiff,
+       ParsoidCacheRequest = 
require('./mediawiki.ApiRequest.js').ParsoidCacheRequest,
+       async = require('async');
 
 /**
  * @class
@@ -144,7 +146,7 @@
        // doSerializeDOM
        parserPipeline.once( 'document', function ( origDoc ) {
                // XXX: need to get body with 
.tree.document.childNodes[0].childNodes[1] ?
-               var body = origDoc.firstChild.childNodes[1];
+               var body = origDoc.body;
                self.env.page.dom = body;
                //console.log('calling doSerializeDOM');
                //console.log(body.outerHTML);
@@ -166,6 +168,7 @@
  * @param {Function} finalcb The callback fired on completion of the 
serialization.
  */
 SSP.serializeDOM = function ( doc, cb, finalcb ) {
+       var self = this;
        if ( this.env.page.dom || this.env.page.domdiff ) {
                this.doSerializeDOM(null, doc, cb, finalcb);
        } else if ( this.env.page.src ) {
@@ -173,9 +176,40 @@
                this.parseOriginalSource( doc, cb, finalcb, null, 
this.env.page.src );
        } else if (this.env.page.id) {
                // Start by getting the old text of this page
-               Util.getPageSrc( this.env, this.env.page.name,
-                               this.parseOriginalSource.bind(this, doc, cb, 
finalcb),
-                               this.env.page.id || null );
+               if (this.env.conf.parsoidCacheURI) {
+                       var cacheRequest = new ParsoidCacheRequest(this.env,
+                                       this.env.page.meta.title, 
this.env.page.id);
+                       // Fetch the page source and previous revison's DOM in 
parallel
+                       async.parallel(
+                                       [
+                                               Util.getPageSrc( this.env, 
this.env.page.name,
+                                                       this.env.page.id || 
null),
+                                               
cacheRequest.once.bind(cacheRequest, 'src')
+                                       ], function (err, results) {
+                                               if (err) {
+                                                       console.error('Error 
while fetchin page source or original DOM!');
+                                                       // fall back to plain 
serialization
+                                                       
self.doSerializeDOM(null, doc, cb, finalcb);
+                                                       return;
+                                               }
+
+                                               // no error.
+
+                                               // set the page source
+                                               
this.env.setPageSrcInfo(results[0]);
+
+                                               // and the original dom
+                                               this.env.page.dom = 
results[1].body;
+
+                                               self.doSerializeDOM(null, doc, 
cb, finalcb);
+                                       }
+                       );
+
+               } else {
+                       Util.getPageSrc( this.env, this.env.page.name,
+                                       this.env.page.id || null,
+                                       this.parseOriginalSource.bind(this, 
doc, cb, finalcb) );
+               }
        } else {
                this.doSerializeDOM(null, doc, cb, finalcb);
        }
diff --git a/js/lib/mediawiki.Util.js b/js/lib/mediawiki.Util.js
index 2d556fe..a24f4bd 100644
--- a/js/lib/mediawiki.Util.js
+++ b/js/lib/mediawiki.Util.js
@@ -1388,7 +1388,7 @@
 };
 
 
-Util.getPageSrc = function ( env, title, cb, oldid ) {
+Util.getPageSrc = function ( env, title, oldid, cb ) {
        title = env.resolveTitle( title, '' );
        var pageRequest = new TemplateRequest( env, title, oldid );
        pageRequest.once( 'src', function(err, page) {

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifaf0d9dc8572650d221d3dc1d29770448a61ee93
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: GWicke <[email protected]>

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

Reply via email to