Subramanya Sastry has submitted this change and it was merged. Change subject: Revert "Postpone data-parsoid saves until DOMPostProc is done" ......................................................................
Revert "Postpone data-parsoid saves until DOMPostProc is done" Introduced regressions that were not caught by Jenkins. This reverts commit 2ea1758229093b305c00009ba44ec9c59387a3ac Change-Id: I1c85fb4091f147212bd31a470c2dc95a64352c66 --- M js/lib/mediawiki.DOMPostProcessor.js M js/lib/mediawiki.DOMUtils.js 2 files changed, 68 insertions(+), 95 deletions(-) Approvals: Subramanya Sastry: Verified; Looks good to me, approved diff --git a/js/lib/mediawiki.DOMPostProcessor.js b/js/lib/mediawiki.DOMPostProcessor.js index ae0d753..1f2a9e7 100644 --- a/js/lib/mediawiki.DOMPostProcessor.js +++ b/js/lib/mediawiki.DOMPostProcessor.js @@ -503,7 +503,18 @@ c.parentNode.insertBefore(problemTpl.end, c.nextSibling); // Update TSR - problemTpl.end.data.parsoid.tsr = c.data.parsoid.tsr; + var dpSrc = problemTpl.end.getAttribute("data-parsoid") || ""; + + if (dpSrc === "") { + // TODO: Figure out why there is no data-parsoid here! + console.error( "XXX Error in handleUnbalancedTableTags: no data-parsoid found! " + + env.page.name ); + dpSrc = '{}'; + } + + var tplDP = JSON.parse(dpSrc); + tplDP.tsr = DU.dataParsoid(c).tsr; + DU.setDataParsoid(problemTpl.end, tplDP); // Skip all nodes till we find the opening id of this template // FIXME: Ugh! Duplicate tree traversal @@ -624,7 +635,9 @@ var matches = fc.data.match(/^(\r\n|\r|\n)/); if (matches) { // Record it in data-parsoid - n.data.parsoid.strippedNL = matches[1]; + var preDP = DU.dataParsoid(n); + preDP.strippedNL = matches[1]; + DU.setDataParsoid(n, preDP); } } } @@ -661,7 +674,7 @@ return node && ( nodeEndsLineInWT(node) || - (DU.isElt(node) && node.data.parsoid.autoInsertedEnd) || + (DU.isElt(node) && DU.dataParsoid(node).autoInsertedEnd) || (!node.nextSibling && canMigrateNLOutOfNode(node.parentNode)) ); } @@ -670,7 +683,7 @@ // - tsr[0] == tsr[1] // - only has children with zero wt width function hasZeroWidthWT(node) { - var tsr = node.data.parsoid.tsr; + var tsr = DU.dataParsoid(node).tsr; if (!tsr || tsr[0] === null || tsr[0] !== tsr[1]) { return false; } @@ -845,7 +858,7 @@ var range = null; while (parentNode && parentNode.nodeType !== Node.DOCUMENT_NODE) { var i = startAncestors.indexOf( parentNode ); - var tsr0 = startElem.data.parsoid.tsr[0]; + var tsr0 = DU.dataParsoid(startElem).tsr[0]; if (i === 0) { // widen the scope to include the full subtree range = { @@ -917,25 +930,20 @@ if (updateDP) { var done = false; - var tcDP = ( tcStart.data || {} ).parsoid; - var seDP = ( startElem.data || {} ).parsoid; + var tcDP = DU.dataParsoid(tcStart); + var seDP = DU.dataParsoid(startElem); if (tcDP && seDP && tcDP.dsr && seDP.dsr && tcDP.dsr[1] > seDP.dsr[1]) { // Since TSRs on template content tokens are cleared by the // template handler, all computed dsr values for template content // is always inferred from top-level content values and is safe. // So, do not overwrite a bigger end-dsr value. - tcStart.data.parsoid.dsr[0] = startElem.data.parsoid.dsr[0]; + tcDP.dsr[0] = seDP.dsr[0]; + DU.setDataParsoid(tcStart, tcDP); done = true; } if (!done) { - if ( tcStart.data === undefined ) { - tcStart.data = {}; - } - if ( startElem.data === undefined ) { - startElem.data = {}; - } - tcStart.data.parsoid = Util.clone( startElem.data.parsoid ); + tcStart.setAttribute("data-parsoid", startElem.getAttribute("data-parsoid")); } } @@ -1266,8 +1274,8 @@ * 2b. If dp2.dsr[0] is unknown, we rely on fostered flag on * tcStart, if any. * ---------------------------------------------------------------- */ - var dp1 = tcStart.data.parsoid, - dp2 = tcEnd.data.parsoid, + var dp1 = DU.dataParsoid(tcStart), + dp2 = DU.dataParsoid(tcEnd), done = false; if (dp1.dsr) { if (dp2.dsr) { @@ -1289,6 +1297,7 @@ // Check if now have a useable range on dp1 if (dp1.dsr[0] !== null && dp1.dsr[1] !== null) { dp1.src = env.page.src.substring( dp1.dsr[0], dp1.dsr[1] ); + DU.setDataParsoid(tcStart, dp1); done = true; } } @@ -1323,10 +1332,8 @@ } function swallowTableIfNestedDSR(elt, tbl) { - var eltDP = elt.data.parsoid, - eltDSR = eltDP.dsr, - tblDP = tbl.data.parsoid, - tblTSR = tblDP.tsr; + var eltDP = DU.dataParsoid(elt), eltDSR = eltDP.dsr, + tblDP = DU.dataParsoid(tbl), tblTSR = tblDP.tsr; // IMPORTANT: Do not use dsr to compare because the table may not // have a valid dsr[1] (if the table's end-tag is generated by @@ -1337,6 +1344,7 @@ if (eltDSR && tblTSR && eltDSR[0] >= tblTSR[1]) { eltDP.dsr[0] = tblTSR[0]; eltDP.dsr[1] = null; + DU.setDataParsoid(elt, eltDP); return true; } else { return false; @@ -1386,7 +1394,7 @@ // on end-meta-tags. // // Ex: "<ref>{{echo|bar}}<!--bad-></ref>" - if (metaMatch && (elem.data.parsoid.tsr || type.match(/\/End\b/))) { + if (metaMatch && (DU.dataParsoid(elem).tsr || type.match(/\/End\b/))) { var metaType = metaMatch[1]; about = elem.getAttribute('about'), @@ -1491,6 +1499,7 @@ } function findBuilderCorrectedTags(document, env) { + function addPlaceholderMeta( node, dp, name, opts ) { var src = dp.src; @@ -1533,8 +1542,7 @@ placeHolder = node.ownerDocument.createElement('meta'), placeHolder.setAttribute('typeof', 'mw:Placeholder'); - placeHolder.data = {}; - placeHolder.data.parsoid = {src: src}; + DU.setDataParsoid(placeHolder, {src: src}); // Insert the placeHolder node.parentNode.insertBefore(placeHolder, node); @@ -1570,7 +1578,7 @@ while (c !== null) { var sibling = c.nextSibling; if (DU.isElt(c)) { - var dp = c.data.parsoid; + var dp = DU.dataParsoid(c); if (DU.hasNodeName(c, "meta")) { var metaType = c.getAttribute("typeof"); if (metaType === "mw:StartTag") { @@ -1586,7 +1594,7 @@ addPlaceholderMeta(c, dp, expectedName, {start: true, tsr: stagTsr}); } deleteNode(c); - } else if (metaType === "mw:EndTag" && c.data.parsoid.tsr) { + } else if (metaType === "mw:EndTag" && !DU.dataParsoid(c).tsr) { // If there is no tsr, this meta is useless for DSR // calculations. Remove the meta to avoid breaking // other brittle DOM passes working on the DOM. @@ -1616,7 +1624,7 @@ // Process subtree first findAutoInsertedTags(c, env); - var dp = c.data.parsoid, + var dp = DU.dataParsoid(c), cNodeName = c.nodeName.toLowerCase(); // Dont bother detecting auto-inserted start/end if: @@ -1641,6 +1649,7 @@ // 'c' is a html node that has tsr, but no end-tag marker tag // => its closing tag was auto-generated by treebuilder. dp.autoInsertedEnd = true; + DU.setDataParsoid(c, dp); } } @@ -1651,7 +1660,7 @@ if (fc.nodeType !== Node.ELEMENT_NODE) { break; } - var fcDP = fc.data.parsoid; + var fcDP = DU.dataParsoid(fc); if (fcDP.autoInsertedStart) { fc = fc.firstChild; } else { @@ -1669,6 +1678,7 @@ } else { //console.log('autoInsertedStart:', c.outerHTML); dp.autoInsertedStart = true; + DU.setDataParsoid(c, dp); } } } else if (cNodeName === 'meta') { @@ -1683,6 +1693,7 @@ // mw:Placeholder for round-tripping //console.log('autoinsertedEnd', c.innerHTML, c.parentNode.innerHTML); addPlaceholderMeta(c, dp, expectedName, {end: true}); + } } else { // Jump over this meta tag, but preserve it @@ -1892,7 +1903,7 @@ } else if (cType === Node.ELEMENT_NODE) { if (traceDSR) console.warn("-- Processing <" + node.nodeName + ":" + i + ">=" + child.nodeName + " with [" + cs + "," + ce + "]"); var cTypeOf = child.getAttribute("typeof"), - dp = child.data.parsoid, + dp = DU.dataParsoid(child), tsr = dp.tsr, oldCE = tsr ? tsr[1] : null, propagateRight = false, @@ -1911,10 +1922,11 @@ // Update table-end syntax using info from the meta tag var prev = child.previousSibling; if (prev && DU.hasNodeName(prev, "table")) { - var prevDP = prev.data.parsoid; + var prevDP = DU.dataParsoid(prev); if (!DU.hasLiteralHTMLMarker(prevDP)) { if (dp.endTagSrc) { prevDP.endTagSrc = dp.endTagSrc; + DU.setDataParsoid(prev, prevDP); } } } @@ -2073,7 +2085,7 @@ } else if (nType === Node.COMMENT_NODE) { newCE = newCE + sibling.data.length + 7; } else if (nType === Node.ELEMENT_NODE) { - var siblingDP = sibling.data.parsoid; + var siblingDP = DU.dataParsoid(sibling); if (siblingDP.dsr && siblingDP.tsr && siblingDP.dsr[0] <= newCE && e !== null) { // sibling's dsr wont change => ltr propagation stops here. break; @@ -2092,6 +2104,7 @@ } } siblingDP.dsr[0] = newCE; + DU.setDataParsoid(sibling, siblingDP); newCE = siblingDP.dsr[1]; } else { break; @@ -2103,6 +2116,10 @@ if (!sibling) { e = newCE; } + } + + if (Object.keys(dp).length > 0) { + DU.setDataParsoid(child, dp); } } @@ -2150,8 +2167,9 @@ var body = root.body; computeNodeDSR(env, body, startOffset, endOffset, traceDSR); - var dp = body.data.parsoid; + var dp = DU.dataParsoid(body); dp.dsr = [startOffset, endOffset, 0, 0]; + DU.setDataParsoid(body, dp); if (traceDSR) console.warn("------- done tracing DSR computation -------"); @@ -2332,23 +2350,21 @@ return; } - if ( !node.data ) { - node.data = {}; - } - var ix, prefix = getLinkPrefix( env, node ), trail = getLinkTrail( env, node ), - dp = node.data.parsoid; + dp = Util.getJSONAttribute( node, 'data-parsoid', {} ), + updated = false; if ( prefix && prefix.content ) { for ( ix = 0; ix < prefix.content.length; ix++ ) { node.insertBefore( prefix.content[ix], node.firstChild ); } if ( prefix.src.length > 0 ) { - node.data.parsoid.prefix = prefix.src; - if (node.data.parsoid.dsr) { - node.data.parsoid.dsr[0] -= prefix.src.length; - node.data.parsoid.dsr[2] += prefix.src.length; + updated = true; + dp.prefix = prefix.src; + if (dp.dsr) { + dp.dsr[0] -= prefix.src.length; + dp.dsr[2] += prefix.src.length; } } } @@ -2358,35 +2374,17 @@ node.appendChild( trail.content[ix] ); } if ( trail.src.length > 0 ) { - node.data.parsoid.tail = trail.src; - if (node.data.parsoid.dsr) { - node.data.parsoid.dsr[1] += trail.src.length; - node.data.parsoid.dsr[3] += trail.src.length; + updated = true; + dp.tail = trail.src; + if (dp.dsr) { + dp.dsr[1] += trail.src.length; + dp.dsr[3] += trail.src.length; } } } -} -/** - * @method - * - * Migrate data-parsoid attributes into a property on each DOM node. We'll - * migrate them back in the final DOM traversal. - * - * @param {Node} node - */ -function migrateDataParsoid( node ) { - DU.loadDataParsoid( node ); -} - -/** - * @method - * - * Save the data-parsoid attributes on each node. - */ -function saveDataParsoid( node ) { - if ( node && node.nodeType === node.ELEMENT_NODE && node.data ) { - DU.saveDataAttribs( node ); + if ( updated ) { + node.setAttribute( 'data-parsoid', JSON.stringify( dp ) ); } } @@ -2394,13 +2392,8 @@ this.env = env; this.options = options; - // DOM traverser that runs before the DOM handlers. - var preDOMHandlerVisitor = new DOMTraverser(); - preDOMHandlerVisitor.addHandler( null, migrateDataParsoid ); - // Common post processing this.processors = [ - preDOMHandlerVisitor.traverse.bind( preDOMHandlerVisitor ), handleUnbalancedTableTags, migrateStartMetas, normalizeDocument, @@ -2423,16 +2416,11 @@ // 1. Link prefixes and suffixes // 2. Strip marker metas -- removes left over marker metas (ex: metas // nested in expanded tpl/extension output). - var lastDOMHandler = new DOMTraverser(); - lastDOMHandler.addHandler( 'a', handleLinkNeighbours.bind( null, env ) ); - lastDOMHandler.addHandler('meta', stripMarkerMetas); + var lastDOMVisitor = new DOMTraverser(); + lastDOMVisitor.addHandler( 'a', handleLinkNeighbours.bind( null, env ) ); + lastDOMVisitor.addHandler('meta', stripMarkerMetas); - this.processors.push(lastDOMHandler.traverse.bind(lastDOMHandler)); - - var cleanUpDOMPass = new DOMTraverser(); - cleanUpDOMPass.addHandler( null, saveDataParsoid ); - - this.processors.push( cleanUpDOMPass.traverse.bind( cleanUpDOMPass ) ); + this.processors.push(lastDOMVisitor.traverse.bind(lastDOMVisitor)); } // Inherit from EventEmitter diff --git a/js/lib/mediawiki.DOMUtils.js b/js/lib/mediawiki.DOMUtils.js index ff036ab..e9cf7ab 100644 --- a/js/lib/mediawiki.DOMUtils.js +++ b/js/lib/mediawiki.DOMUtils.js @@ -19,10 +19,6 @@ // Decode a JSON object into the data member of DOM nodes loadDataAttrib: function(node, name, defaultVal) { - if ( node.nodeType !== node.ELEMENT_NODE ) { - return; - } - if ( ! node.data ) { node.data = {}; } @@ -34,14 +30,7 @@ // Save all node.data.* structures to data attributes saveDataAttribs: function(node) { - if ( node.nodeType !== node.ELEMENT_NODE ) { - return; - } - for(var key in node.data) { - if ( key.match( /^tmp_/ ) !== null ) { - continue; - } var val = node.data[key]; if ( val && val.constructor === String ) { node.setAttribute('data-' + key, val); @@ -69,10 +58,6 @@ }, getJSONAttribute: function(n, name, defaultVal) { - if ( n.nodeType !== n.ELEMENT_NODE ) { - return defaultVal !== undefined ? defaultVal : {}; - } - var attVal = n.getAttribute(name); if (!attVal) { return defaultVal !== undefined ? defaultVal : {}; -- To view, visit https://gerrit.wikimedia.org/r/57194 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I1c85fb4091f147212bd31a470c2dc95a64352c66 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Parsoid Gerrit-Branch: master Gerrit-Owner: GWicke <gwi...@wikimedia.org> Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits