jenkins-bot has submitted this change and it was merged.

Change subject: (Bug 50218) Generated DOMFragment wrapping <ol> for references 
tag
......................................................................


(Bug 50218) Generated DOMFragment wrapping <ol> for references tag

* So far, references wikitext was being replaced with a meta marker
  token that participated as an inline token in p-wrapping.  As a
  result, in some cases, a p-tag was wrapping the references ol-node
  which is buggy HTML.  When VE loaded this DOM, the p-node was split
  around the ol-node and duplicated DSR which led to duplicated
  output when selser ran on this.

* One way of fixing this would have been to add a special case in
  the paragraph wrapper to treat the mw:Extensions/References/Marker
  meta tag as a block token.

* A better solution with an eye towards the longer-term is to emit
  mw:DOMFragment wrapper for the references tag with the content
  being an ol-node. The dom-fragment unpacking code then takes care
  of p-wrapping issues for the ol-node. This fixes the bug in this
  case.

* Also fixed parser tests output where group attribute was missing
  on some tests (which indicated that the older code was not emitting
  the group attribute on references tag).

* No change in parser tests.

Change-Id: I073b2e68667d577c75cad07d19cea2b19d0e89fe
---
M js/lib/ext.Cite.js
M js/lib/mediawiki.DOMPostProcessor.js
M js/lib/mediawiki.DOMUtils.js
M js/tests/parserTests.txt
4 files changed, 54 insertions(+), 38 deletions(-)

Approvals:
  GWicke: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/js/lib/ext.Cite.js b/js/lib/ext.Cite.js
index a4ca97f..322e3d1 100644
--- a/js/lib/ext.Cite.js
+++ b/js/lib/ext.Cite.js
@@ -6,6 +6,8 @@
 
 var Util = require( './mediawiki.Util.js' ).Util,
        DU = require( './mediawiki.DOMUtils.js').DOMUtils,
+       coreutil = require('util'),
+       ExtensionHandler = 
require('./ext.core.ExtensionHandler.js').ExtensionHandler,
        defines = require('./mediawiki.parser.defines.js'),
        $ = require( './fakejquery' );
 
@@ -253,6 +255,9 @@
        this.reset();
 }
 
+// Inherit functionality from ExtensionHandler
+coreutil.inherits(References, ExtensionHandler);
+
 References.prototype.reset = function(group) {
        if (group) {
                setRefGroup(this.refGroups, group, undefined);
@@ -281,20 +286,39 @@
                group = null;
        }
 
-       // Emit a placeholder meta for the references token
-       // so that the dom post processor can generate and
-       // emit references at this point in the DOM.
-       var emitMarkerMeta = function() {
-               var marker = new SelfclosingTagTk('meta', refsTok.attribs, 
refsTok.dataAttribs);
+       // Emit a marker mw:DOMFragment for the references
+       // token so that the dom post processor can generate
+       // and emit references at this point in the DOM.
+       var emitReferencesFragment = function() {
+               var about = manager.env.newAboutId(),
+                       type = refsTok.getAttribute('typeof');
+               var buf = [
+                       "<ol class='references'",
+                       " typeof='", "mw:Extension/references", "'",
+                       " about='", about, "'",
+                       "></ol>"
+               ];
 
-               marker.dataAttribs.stx = undefined;
-               DU.addAttributes(marker, {
-                       'about': manager.env.newAboutId(),
-                       'group': group,
-                       'typeof': 'mw:Extension/references/Marker'
-               });
-               cb({ tokens: [marker], async: false });
-       };
+               var wrapperDOM = Util.parseHTML(buf.join('')).body.childNodes;
+               wrapperDOM[0].setAttribute('source', 
refsTok.getAttribute('source'));
+               if (group) {
+                       wrapperDOM[0].setAttribute('group', group);
+               }
+
+               var expansion = {
+                       nodes: wrapperDOM,
+                       html: wrapperDOM.map(function(n) { return n.outerHTML; 
}).join('')
+               };
+
+               // TemplateHandler wants a manager property
+               //
+               // FIXME: Seems silly -- maybe we should move 
encapsulateExpansionHTML
+               // into Util and pass env into it .. can avoid extending 
ExtensionHandler
+               // as well.
+               this.manager = manager;
+
+               cb({ tokens: this.encapsulateExpansionHTML(refsTok, expansion), 
async: false });
+       }.bind(this);
 
        processExtSource(manager, refsTok, {
                // Partial pipeline for processing ref-content
@@ -307,7 +331,7 @@
                },
                res: [],
                parentCB: cb,
-               emptyContentCB: emitMarkerMeta,
+               emptyContentCB: emitReferencesFragment,
                chunkCB: function(chunk) {
                        // Extract ref-content tokens and discard the rest
                        var res = [];
@@ -324,7 +348,7 @@
                        // Pass along the ref toks
                        cb({ tokens: res, async: true });
                },
-               endCB: emitMarkerMeta
+               endCB: emitReferencesFragment
        });
 };
 
@@ -401,9 +425,7 @@
                src = refsNode.getAttribute('source'),
                // Extract ext-source for <references>..</references> usage
                body = Util.extractExtBody("references", src).trim(),
-               refGroup = getRefGroup(this.refGroups, group),
-               ol = refsNode.ownerDocument.createElement('ol'),
-               nodeType = (refsNode.getAttribute("typeof") || 
'').replace(/mw:Extension\/references\/Marker/, '');
+               refGroup = getRefGroup(this.refGroups, group);
 
        var dataMW = refsNode.getAttribute('data-mw');
        if (!dataMW) {
@@ -421,18 +443,12 @@
                });
        }
 
-       DU.addAttributes(ol, {
-               'about': about,
-               'class': 'references',
-               'data-mw': dataMW,
-               'typeof': nodeType
-       });
-       DU.addTypeOf(ol, "mw:Extension/references");
-       ol.data = refsNode.data;
+       refsNode.removeAttribute('source');
+       refsNode.setAttribute('data-mw', dataMW);
+
        if (refGroup) {
-               refGroup.refs.map(refGroup.renderLine.bind(refGroup, ol));
+               refGroup.refs.map(refGroup.renderLine.bind(refGroup, refsNode));
        }
-       refsNode.parentNode.replaceChild(ol, refsNode);
 
        // reset
        this.reset(group);
diff --git a/js/lib/mediawiki.DOMPostProcessor.js 
b/js/lib/mediawiki.DOMPostProcessor.js
index e54a0b2..a1868e7 100644
--- a/js/lib/mediawiki.DOMPostProcessor.js
+++ b/js/lib/mediawiki.DOMPostProcessor.js
@@ -2662,7 +2662,7 @@
                        var typeOf = child.getAttribute('typeof');
                        if ((/\bmw:Extension\/ref\/Marker\b/).test(typeOf)) {
                                refsExt.extractRefFromNode(child);
-                       } else if 
((/\bmw:Extension\/references\/Marker\b/).test(typeOf)) {
+                       } else if 
((/\bmw:Extension\/references\b/).test(typeOf)) {
                                refsExt.insertReferencesIntoDOM(child);
                        } else if (child.childNodes.length > 0) {
                                generateReferences(refsExt, child);
diff --git a/js/lib/mediawiki.DOMUtils.js b/js/lib/mediawiki.DOMUtils.js
index 0112b84..0b747b5 100644
--- a/js/lib/mediawiki.DOMUtils.js
+++ b/js/lib/mediawiki.DOMUtils.js
@@ -552,6 +552,13 @@
        },
 
        /**
+        * Check if an element is a HTML element.
+        */
+       isHtmlElement: function (node) {
+               return Util.isHTMLElementName(node.nodeName);
+       },
+
+       /**
         * Get the first child element or non-IEW text node, ignoring
         * whitespace-only text nodes and comments.
         */
@@ -877,13 +884,6 @@
        }
 };
 
-
-/**
- * Check if an element is a HTML element.
- */
-DOMUtils.isHtmlElement = function (node) {
-       return Util.isHTMLElementName(node.nodeName);
-};
 
 
 if (typeof module === "object") {
diff --git a/js/tests/parserTests.txt b/js/tests/parserTests.txt
index 11e3454..3e67ed2 100644
--- a/js/tests/parserTests.txt
+++ b/js/tests/parserTests.txt
@@ -14417,7 +14417,7 @@
 <p>A <span about="#mwt2" class="reference" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' 
id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a 
href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' 
id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a 
href="#cite_note-1">[b 1]</a></span></p>
 
-<ol about="#mwt6" class="references" 
data-mw='{"name":"references","attrs":{"group":"a"}}' 
typeof="mw:Extension/references"><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<ol about="#mwt6" class="references" 
data-mw='{"name":"references","attrs":{"group":"a"}}' 
typeof="mw:Extension/references" group="a"><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo</li></ol>
 !!end
 
 !!test
@@ -14459,7 +14459,7 @@
 <p>A <span about="#mwt2" class="reference" 
data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' 
id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a 
href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" 
data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a 
href="#cite_note-1">[1]</a></span></p>
 
-<ol about="#mwt6" class="references" 
data-mw='{"name":"references","attrs":{"group":"a"}}' 
typeof="mw:Extension/references"><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
+<ol about="#mwt6" class="references" 
data-mw='{"name":"references","attrs":{"group":"a"}}' 
typeof="mw:Extension/references" group="a"><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
 
 <p>C <span about="#mwt8" class="reference" 
data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" 
rel="dc:references" typeof="mw:Extension/ref"><a 
href="#cite_note-2">[2]</a></span></p>
 

-- 
To view, visit https://gerrit.wikimedia.org/r/70658
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I073b2e68667d577c75cad07d19cea2b19d0e89fe
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: GWicke <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to