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