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

Reply via email to