jenkins-bot has submitted this change and it was merged.
Change subject: Fix double documents
......................................................................
Fix double documents
* 4d50a66c0740711f15d38811d2fa16e2d9afa587 was hackily replacing the
document that domino created for us. Here we use the dom APIs to
cleanly remove it.
Adds a new mocha test case to prevent this bug from recurring.
Change-Id: I9430ce8ff18b21485a92c4502784457203b352d3
---
M lib/mediawiki.HTML5TreeBuilder.node.js
A tests/mocha/util.js
2 files changed, 59 insertions(+), 2 deletions(-)
Approvals:
Subramanya Sastry: Looks good to me, approved
Cscott: Looks good to me, but someone else must approve
jenkins-bot: Verified
diff --git a/lib/mediawiki.HTML5TreeBuilder.node.js
b/lib/mediawiki.HTML5TreeBuilder.node.js
index 02e5d67..86e01ac 100644
--- a/lib/mediawiki.HTML5TreeBuilder.node.js
+++ b/lib/mediawiki.HTML5TreeBuilder.node.js
@@ -63,7 +63,12 @@
// Reset the parser
this.parser._treeBuilder.startTokenization(this);
- this.parser._treeBuilder.document.documentElement = null;
+
+ // At this point, domino has already created a document element for us
but
+ // the html5 library would like to use its own (keeps an internal state
of
+ // open elements). Remove it and process a body token to trigger
rebuilding.
+ this.doc = this.parser._treeBuilder.document;
+ this.doc.removeChild(this.doc.lastChild);
this.processToken( new TagTk('body') );
};
@@ -80,7 +85,7 @@
if ( this.lastToken && this.lastToken.constructor !== EOFTk ) {
this.env.log("error", "EOFTk was lost in page",
this.env.page.name);
}
- this.emit('document', this.parser._treeBuilder.document);
+ this.emit('document', this.doc);
this.emit('end');
this.resetState();
};
diff --git a/tests/mocha/util.js b/tests/mocha/util.js
new file mode 100644
index 0000000..3fa3c17
--- /dev/null
+++ b/tests/mocha/util.js
@@ -0,0 +1,52 @@
+/** Test cases for lib/mediawiki.Util.js */
+'use strict';
+/*global describe, it, Promise*/
+require("es6-shim");
+var should = require("chai").should();
+
+var MWParserEnvironment = require('../../lib/mediawiki.parser.environment.js'
).MWParserEnvironment,
+ Util = require('../../lib/mediawiki.Util.js').Util,
+ ParsoidConfig = require('../../lib/mediawiki.ParsoidConfig'
).ParsoidConfig;
+
+describe( 'mediawiki.Util', function() {
+ var parsoidConfig = new ParsoidConfig( null, { defaultWiki: 'enwiki'
} );
+
+ describe( 'parse()', function() {
+
+ var parse = function(src, expansions) {
+ return new Promise(function(resolve, reject) {
+ MWParserEnvironment.getParserEnv(
parsoidConfig, null, 'enwiki', 'Main_Page', null, function ( err, env ) {
+ if (err) { return reject(err); }
+ env.setPageSrcInfo(src);
+ Util.parse(env, function(src, err, doc)
{
+ if (err) { return reject(err); }
+ resolve(doc);
+ }, null, src, expansions);
+ });
+ });
+ };
+
+ it('should create a sane document from an empty string',
function() {
+ return parse('foo').then(function(doc) {
+ doc.should.have.property('nodeName',
'#document');
+ doc.outerHTML.startsWith('<!DOCTYPE
html><html').should.equal(true);
+
doc.outerHTML.endsWith('</body></html>').should.equal(true);
+ // verify that body has only one <html> tag,
one <body> tag, etc.
+ doc.childNodes.length.should.equal(2);//
<!DOCTYPE> and <html>
+ doc.firstChild.nodeName.should.equal('html');
+ doc.lastChild.nodeName.should.equal('HTML');
+ // <html> children should be <head> and <body>
+ var html = doc.documentElement;
+ html.childNodes.length.should.equal(2);
+ html.firstChild.nodeName.should.equal('HEAD');
+ html.lastChild.nodeName.should.equal('BODY');
+ // <body> should have one child, <p>
+ var body = doc.body;
+ body.childElementCount.should.equal(1);
+
body.firstElementChild.nodeName.should.equal('P');
+ var p = doc.body.firstElementChild;
+ p.innerHTML.should.equal('foo');
+ });
+ });
+ });
+});
--
To view, visit https://gerrit.wikimedia.org/r/156590
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I9430ce8ff18b21485a92c4502784457203b352d3
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>
Gerrit-Reviewer: Cscott <[email protected]>
Gerrit-Reviewer: Marcoil <[email protected]>
Gerrit-Reviewer: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits