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

Reply via email to