Arlolra has uploaded a new change for review.

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

Change subject: Don't crash when revision is hidden
......................................................................

Don't crash when revision is hidden

 * RevisionDelete can hide pages, leaving the src undefined. This leads
   to a crash when setting pageSrcInfo in the environment.

 * Noticed from the recent history on frwiki/Orchestre_national_de_France

Change-Id: Ic4238ffadded4db737c07519c8b8f92b59fc0d3e
---
M lib/mediawiki.ApiRequest.js
M lib/mediawiki.SelectiveSerializer.js
2 files changed, 38 insertions(+), 40 deletions(-)


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

diff --git a/lib/mediawiki.ApiRequest.js b/lib/mediawiki.ApiRequest.js
index 3934058..11f45d9 100644
--- a/lib/mediawiki.ApiRequest.js
+++ b/lib/mediawiki.ApiRequest.js
@@ -275,7 +275,7 @@
  * @param {Object} data The response from the server - parsed JSON object
  */
 TemplateRequest.prototype._handleJSON = function ( error, data ) {
-       var regex, title, location, iwstr, interwiki, src = '';
+       var regex, title, location, iwstr, interwiki;
        var metadata = { title: this.title };
 
        if ( !error && !data.query ) {
@@ -313,6 +313,7 @@
        } else {
                // we've only requested one title (or oldid)
                // but we get a hash of pageids
+               var self = this;
                if ( !Object.keys(data.query.pages).some(function(pageid) {
                        var page = data.query.pages[pageid];
                        if ( !page || !page.revisions || !page.revisions.length 
) {
@@ -321,12 +322,13 @@
                        metadata.id = page.pageid;
                        metadata.ns = page.ns;
                        metadata.revision = page.revisions[0];
-                       // for redirect handling & cache
-                       src = metadata.revision['*'];
+
+                       if ( metadata.revision.texthidden || 
!metadata.revision.hasOwnProperty("*") ) {
+                               error = new DoesNotExistError( "Source is 
hidden for " + self.title );
+                       }
                        return true;
                }) ) {
-                       error = new DoesNotExistError( 'Did not find page 
revisions for '
-                               + this.title );
+                       error = new DoesNotExistError( 'Did not find page 
revisions for ' + this.title );
                }
        }
 
@@ -339,7 +341,7 @@
 
        // Add the source to the cache
        // (both original title as well as possible redirected title)
-       this.env.pageCache[this.queueKey] = this.env.pageCache[this.title] = 
src;
+       this.env.pageCache[this.queueKey] = this.env.pageCache[this.title] = 
metadata.revision['*'];
 
        this._processListeners( null, metadata );
 };
diff --git a/lib/mediawiki.SelectiveSerializer.js 
b/lib/mediawiki.SelectiveSerializer.js
index 7128d63..a1d8453 100644
--- a/lib/mediawiki.SelectiveSerializer.js
+++ b/lib/mediawiki.SelectiveSerializer.js
@@ -57,7 +57,7 @@
 SSP.doSerializeDOM = function( err, doc, cb, finalcb ) {
        var self = this;
 
-       if ( err || (!this.env.page.dom && !this.env.page.domdiff) || 
!this.env.page.src) {
+       if ( err || (!this.env.page.dom && !this.env.page.domdiff) || 
!this.env.page.src ) {
                // If there's no old source, fall back to non-selective 
serialization.
                this.wts.serializeDOM( doc, cb, false, finalcb );
        } else {
@@ -139,46 +139,42 @@
        // dummy preserves the wt serializer interface
        var self = this;
        if ( this.env.page.dom || this.env.page.domdiff ) {
-               this.doSerializeDOM(null, doc, cb, finalcb);
+               this.doSerializeDOM( null, doc, cb, finalcb );
        } else if ( this.env.page.src ) {
                // Have the src, only parse the src to the dom
                this.parseOriginalSource( doc, cb, finalcb, null, 
this.env.page.src );
-       } else if (this.env.page.id && this.env.page.id !== '0') {
+       } 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) {
-                       var cacheRequest = new ParsoidCacheRequest(this.env,
-                                       this.env.page.name, this.env.page.id, 
{evenIfNotCached: true});
-                       // Fetch the page source and previous revison's DOM in 
parallel
-                       async.parallel(
-                                       [
-                                               Util.getPageSrc.bind(Util, 
this.env, this.env.page.name,
-                                                       this.env.page.id || 
null),
-                                               
cacheRequest.once.bind(cacheRequest, 'src')
-                                       ], function (err, results) {
-                                               if (err) {
-                                                       self.env.log("error", 
"Error while fetching page source or original DOM!");
-                                               } else {
-                                                       // no error.
-
-                                                       // Set the page source.
-                                                       
self.env.setPageSrcInfo(results[0]);
-
-                                                       // And the original 
dom. results[1] is an array
-                                                       // with the html and 
the content type. Ignore the
-                                                       // content type here.
-                                                       self.env.page.dom = 
DU.parseHTML(results[1][0]).body;
-                                               }
-
-                                               // Selective serialization if 
there was no error, full
-                                               // serialization if there was 
one.
-                                               self.doSerializeDOM(null, doc, 
cb, finalcb);
-                                       }
+               if ( this.env.conf.parsoid.parsoidCacheURI ) {
+                       var cacheRequest = new ParsoidCacheRequest(
+                               this.env, this.env.page.name, this.env.page.id, 
{ evenIfNotCached: true }
                        );
+                       // Fetch the page source and previous revision's DOM in 
parallel
+                       async.parallel([
+                               Util.getPageSrc.bind( Util, this.env, 
this.env.page.name, this.env.page.id || null ),
+                               cacheRequest.once.bind( cacheRequest, 'src' )
+                       ], function( err, results ) {
+                               if ( err ) {
+                                       self.env.log("error", "Error while 
fetching page source or original DOM!");
+                               } else {
+                                       // Set the page source.
+                                       self.env.setPageSrcInfo(results[0]);
 
+                                       // And the original dom. results[1] is 
an array
+                                       // with the html and the content type. 
Ignore the
+                                       // content type here.
+                                       self.env.page.dom = 
DU.parseHTML(results[1][0]).body;
+                               }
+
+                               // Selective serialization if there was no 
error, full
+                               // serialization if there was one.
+                               self.doSerializeDOM( err, doc, cb, finalcb );
+                       });
                } else {
-                       Util.getPageSrc( this.env, this.env.page.name,
-                                       this.env.page.id || null,
-                                       this.parseOriginalSource.bind(this, 
doc, cb, finalcb) );
+                       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);

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic4238ffadded4db737c07519c8b8f92b59fc0d3e
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