jenkins-bot has submitted this change and it was merged. Change subject: Fix crashers when dp isn't present for an id ......................................................................
Fix crashers when dp isn't present for an id * In a48ca3e98dc66ae4e7456d0fad78392c8a223553, we assumed that dp would always be available for a child of body with an id. However, template siblings can still have manually added ids (present in the wikitext), even though only the first about sibling has a dp. The algorithm only accounted for the absence of ids and was thrown off by their presence. * Now we explicitly test that the id doesn't come from an about sibling so that all templated content is in one section. Change-Id: I3aacedb7ba4e288d560c3bb52aff02ffdb9e184d --- M lib/XMLSerializer.js M lib/mediawiki.DOMUtils.js M tests/mocha/xmlserializer.js 3 files changed, 23 insertions(+), 19 deletions(-) Approvals: Subramanya Sastry: Looks good to me, approved jenkins-bot: Verified diff --git a/lib/XMLSerializer.js b/lib/XMLSerializer.js index da33174..1f631a9 100644 --- a/lib/XMLSerializer.js +++ b/lib/XMLSerializer.js @@ -163,16 +163,14 @@ } } -// These two are from DU but there's a cyclic dependency. -function isElt(node) { - return node.nodeType === ELEMENT_NODE; -} -function isBody(node) { - return isElt(node) && node.nodeName === "BODY"; -} - +var DU; var accumOffsets = function(out, bit, node, flag) { - if (isBody(node)) { + // Circular ref + if (!DU) { + DU = require('./mediawiki.DOMUtils.js').DOMUtils; + } + + if (DU.isBody(node)) { out.str += bit; if (flag === 'start') { out.start = out.str.length; @@ -180,7 +178,7 @@ out.start = null; out.uid = null; } - } else if (!isElt(node) || out.start === null || !isBody(node.parentNode)) { + } else if (!DU.isElt(node) || out.start === null || !DU.isBody(node.parentNode)) { // In case you're wondering, out.start may never be set if body // isn't a child of the node passed to serializeToString, or if it // is the node itself but options.innerXML is true. @@ -189,9 +187,13 @@ out.offsets[out.uid].html[1] += bit.length; } } else { - // Template siblings don't have ids, + var newUid = node.getAttribute('id'); + // Template siblings don't have generated ids (but may have an id), // so associate them with preceding content. - out.uid = node.getAttribute('id') || out.uid; + if (newUid && (!DU.isTplOrExtToplevelNode(node) || + DU.isFirstEncapsulationWrapperNode(node))) { + out.uid = newUid; + } console.assert(out.uid !== null); if (!out.offsets.hasOwnProperty(out.uid)) { var dt = out.str.length - out.start; diff --git a/lib/mediawiki.DOMUtils.js b/lib/mediawiki.DOMUtils.js index 360a6e3..117d6ec 100644 --- a/lib/mediawiki.DOMUtils.js +++ b/lib/mediawiki.DOMUtils.js @@ -81,7 +81,7 @@ }, isBody: function(node) { - return node.nodeName === "BODY"; + return DU.isElt(node) && node.nodeName === "BODY"; }, /** @@ -2619,9 +2619,10 @@ out.type = dpScriptElt.getAttribute('type'); // Add the wt offsets. Object.keys(out.offsets).forEach(function(key) { - var dsr = out.dp.ids[key].dsr; - if (Util.isValidDSR(dsr)) { - out.offsets[key].wt = dsr.slice(0, 2); + var dp = out.dp.ids[key]; + console.assert(dp); + if (Util.isValidDSR(dp.dsr)) { + out.offsets[key].wt = dp.dsr.slice(0, 2); } }); out.dp.sectionOffsets = out.offsets; diff --git a/tests/mocha/xmlserializer.js b/tests/mocha/xmlserializer.js index 22186f6..e623beb 100644 --- a/tests/mocha/xmlserializer.js +++ b/tests/mocha/xmlserializer.js @@ -28,7 +28,7 @@ it('should handle templates properly while capturing offsets', function() { var html = '<html><head><title>hi</title><body>' + '<p about="#mwt1" typeof="mw:Transclusion" id="mwAQ">a</p>' + - '<p about="#mwt1">b</p>' + + '<p about="#mwt1" id="justhappenstobehere">b</p>' + '<p id="mwAg">c</p>' + '</body></html>'; var doc = domino.createDocument(html); @@ -41,7 +41,8 @@ ret.should.have.property('offsets'); ret.offsets.should.have.property('mwAQ'); ret.offsets.should.have.property('mwAg'); - ret.offsets.mwAQ.html.should.eql([0, 79]); - ret.offsets.mwAg.html.should.eql([79, 97]); + ret.offsets.should.not.have.property('justhappenstobehere'); + ret.offsets.mwAQ.html.should.eql([0, 104]); + ret.offsets.mwAg.html.should.eql([104, 122]); }); }); -- To view, visit https://gerrit.wikimedia.org/r/211921 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I3aacedb7ba4e288d560c3bb52aff02ffdb9e184d Gerrit-PatchSet: 3 Gerrit-Project: mediawiki/services/parsoid Gerrit-Branch: master Gerrit-Owner: Arlolra <abrea...@wikimedia.org> Gerrit-Reviewer: Cscott <canan...@wikimedia.org> Gerrit-Reviewer: GWicke <gwi...@wikimedia.org> Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits