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

Change subject: (Bug 52762) Lines with 1+ comments and WS are transparent to 
handlers
......................................................................


(Bug 52762) Lines with 1+ comments and WS are transparent to handlers

* This was being handled exlicitly in pre- and paragraph- handlers
  and the list handler wasn't yet handling this special case.

  The PHP preprocessor strips out such lines from wikitext which
  effectively means that Parsoid needs to pass through those lines
  without changing state of any handler in the pipeline.

* This commit updates the "sol" production to collect these empty
  lines and wrap them in a meta-token which all handlers ignore
  which are re-expanded in the HTML tree builder.

* Removed custom code from the paragraph handler.

* Tweaked the list-handler to close list elements at end of line.

* Added an additional rule to the output normalization code to
  strip such lnes from output.

* 5 wt2html tests (and some associated selser tests) are now green.
  Selser tests got changed around because of tweaks to some
  parser tests and because of minor changes in HTML output.

* Minor unrelated cleanup to TSP left behind from an earlier gerrit
  patchset for this commit.

Change-Id: I6aada39ff966c328688b085c4b1ba4c46faf713c
---
M js/lib/ext.core.ListHandler.js
M js/lib/ext.core.ParagraphWrapper.js
M js/lib/ext.core.Sanitizer.js
M js/lib/ext.core.TokenStreamPatcher.js
M js/lib/mediawiki.HTML5TreeBuilder.node.js
M js/lib/mediawiki.Util.js
M js/lib/pegTokenizer.pegjs.txt
M js/tests/parserTests-blacklist.js
M js/tests/parserTests.txt
9 files changed, 85 insertions(+), 101 deletions(-)

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



diff --git a/js/lib/ext.core.ListHandler.js b/js/lib/ext.core.ListHandler.js
index c6c3a27..bfc5787 100644
--- a/js/lib/ext.core.ListHandler.js
+++ b/js/lib/ext.core.ListHandler.js
@@ -269,16 +269,18 @@
                // same list item types and same nesting level
                itemToken = this.currListFrame.endtags.pop();
                this.currListFrame.endtags.push(new EndTagTk( itemToken.name ));
-               res = [
-                       itemToken,
-                       // this list item gets all the bullets since this is
-                       // a list item at the same level
-                       //
-                       // **a
-                       // **b
-                       this.currListFrame.nlTk || '',
-                       new TagTk( itemToken.name, [], makeDP( 0, bn.length ) )
-               ];
+               res = [ itemToken ].concat(
+                       this.currListFrame.solTokens,
+                       [
+                               // this list item gets all the bullets since 
this is
+                               // a list item at the same level
+                               //
+                               // **a
+                               // **b
+                               this.currListFrame.nlTk || '',
+                               new TagTk( itemToken.name, [], makeDP( 0, 
bn.length ) )
+                       ]
+               );
        } else {
                var prefixCorrection = 0;
                var tokens = [];
@@ -298,6 +300,7 @@
                         * ------------------------------------------------ */
 
                        tokens = this.popTags(bs.length - prefixLen - 1);
+                       tokens = this.currListFrame.solTokens.concat(tokens);
                        var newName = this.bulletCharsMap[bn[prefixLen]].item;
                        var endTag = this.currListFrame.endtags.pop();
                        this.currListFrame.endtags.push(new EndTagTk( newName 
));
@@ -330,6 +333,7 @@
                                console.warn("    -> reduced nesting");
                        }
                        tokens = tokens.concat( this.popTags(bs.length - 
prefixLen) );
+                       tokens = this.currListFrame.solTokens.concat(tokens);
                        if (this.currListFrame.nlTk) {
                                tokens.push(this.currListFrame.nlTk);
                        }
@@ -398,7 +402,6 @@
        }
 
        // clear out sol-tokens
-       res = this.currListFrame.solTokens.concat(res);
        res.rank = this.anyRank + 0.01;
        this.currListFrame.solTokens = [];
        this.currListFrame.nlTk = null;
diff --git a/js/lib/ext.core.ParagraphWrapper.js 
b/js/lib/ext.core.ParagraphWrapper.js
index 67452fb..264a418 100644
--- a/js/lib/ext.core.ParagraphWrapper.js
+++ b/js/lib/ext.core.ParagraphWrapper.js
@@ -102,7 +102,6 @@
        this.currLine = {
                tokens: [],
                isNewline: atEOL,
-               hasComments: false,
                hasBlockToken: false,
                hasWrappableTokens: false
        };
@@ -122,13 +121,6 @@
                this.hasOpenPTag = true;
        }
 
-       // PHP parser ignores (= strips out during preprocessing) lines with
-       // a comment and other white-space. This flag checks if we are on such 
a line.
-       var emptyLineWithComments =
-               l.isNewline &&
-               !l.hasWrappableTokens &&
-               l.hasComments;
-
        // this.nonNlTokens += this.currLine.tokens
        this.nonNlTokens = this.nonNlTokens.concat(l.tokens);
 
@@ -143,16 +135,6 @@
                this.hasOpenHTMLPTag = false;
                this.reset();
                return { tokens: res };
-       } else if (emptyLineWithComments) {
-               // 1. Dont increment newline count on "empty" lines with
-               //    one or more comments -- see comment above
-               //
-               // 2. Convert the NlTk to a String-representation so that
-               //    it doesn't get processed by discardOneNlTk -- this
-               //    newline needs to be emitted (so it gets RTed) without
-               //    being processed for p-wrapping.
-               this.nlWsTokens.push("\n");
-               return {};
        } else {
                this.newLineCount++;
                this.nlWsTokens.push(token);
@@ -308,11 +290,10 @@
                }
        } else if (tc === EOFTk || this.inPre) {
                return { tokens: [token] };
-       } else if ((tc === String && token.match( /^[\t ]*$/)) || tc === 
CommentTk) {
-               if (tc === CommentTk) {
-                       this.currLine.hasComments = true;
-               }
-
+       } else if (tc === CommentTk ||
+               tc === String && token.match(/^[\t ]*$/) ||
+               Util.isEmptyLineMetaToken(token))
+       {
                if (this.newLineCount === 0) {
                        this.currLine.tokens.push(token);
                        // Since we have no pending newlines to trip us up,
diff --git a/js/lib/ext.core.Sanitizer.js b/js/lib/ext.core.Sanitizer.js
index 8ce9547..64425e7 100644
--- a/js/lib/ext.core.Sanitizer.js
+++ b/js/lib/ext.core.Sanitizer.js
@@ -685,6 +685,11 @@
  * attribute in the DOM).
  */
 Sanitizer.prototype.onAny = function ( token ) {
+       // Pass through a transparent line meta-token
+       if (Util.isEmptyLineMetaToken(token)) {
+               return { token: token };
+       }
+
        // XXX: validate token type according to whitelist and convert non-ok 
ones
        // back to text.
 
diff --git a/js/lib/ext.core.TokenStreamPatcher.js 
b/js/lib/ext.core.TokenStreamPatcher.js
index 95ed483..cf4d2ff 100644
--- a/js/lib/ext.core.TokenStreamPatcher.js
+++ b/js/lib/ext.core.TokenStreamPatcher.js
@@ -34,29 +34,19 @@
        this.reset();
 }
 
-TokenStreamPatcher.prototype.nlRank   = 2.001;
-TokenStreamPatcher.prototype.anyRank  = 2.002;
+TokenStreamPatcher.prototype.anyRank  = 2.001;
+TokenStreamPatcher.prototype.nlRank   = 2.002;
 TokenStreamPatcher.prototype.endRank  = 2.003;
-
-TokenStreamPatcher.prototype.updateBuf = function() {
-       if (this.buf.length === 0) {
-               this.buf.sol = this.sol;
-               this.buf.srcOffset = this.srcOffset;
-       }
-};
 
 TokenStreamPatcher.prototype.reset = function() {
        this.inNowiki = false;
-       this.sol = true;
        this.srcOffset = 0;
-       this.buf = [];
-       this.updateBuf();
+       this.sol = true;
 };
 
 TokenStreamPatcher.prototype.onNewline = function(token) {
-       this.sol = true;
        this.srcOffset = (token.dataAttribs.tsr || [null,null])[1];
-       this.updateBuf();
+       this.sol = true;
        return {tokens: [token]};
 };
 
@@ -73,6 +63,7 @@
 
 TokenStreamPatcher.prototype.onAny = function(token) {
        // console.warn("T: " + JSON.stringify(token));
+
        var tokens = [token];
        switch (token.constructor) {
                case String:
@@ -124,6 +115,9 @@
                        }
                        this.clearSOL();
                        break;
+
+               default:
+                       break;
        }
 
        return {tokens: tokens};
diff --git a/js/lib/mediawiki.HTML5TreeBuilder.node.js 
b/js/lib/mediawiki.HTML5TreeBuilder.node.js
index 185c31a..75c5d6c 100644
--- a/js/lib/mediawiki.HTML5TreeBuilder.node.js
+++ b/js/lib/mediawiki.HTML5TreeBuilder.node.js
@@ -182,6 +182,13 @@
                        break;
                case SelfclosingTagTk:
                        tName = token.name;
+
+                       // Re-expand an empty-line meta-token into its 
constituent comment + WS tokens
+                       if (Util.isEmptyLineMetaToken(token)) {
+                               this.onChunk(dataAttribs.tokens);
+                               break;
+                       }
+
                        this.emit('token', {type: 'StartTag', name: tName, 
data: this._att(attribs)});
                        if ( HTML5.VOID_ELEMENTS.indexOf( tName ) < 0 ) {
                                // VOID_ELEMENTS are automagically treated as 
self-closing by
diff --git a/js/lib/mediawiki.Util.js b/js/lib/mediawiki.Util.js
index 932187c..845bd4a 100644
--- a/js/lib/mediawiki.Util.js
+++ b/js/lib/mediawiki.Util.js
@@ -195,8 +195,14 @@
                if (token.name === 'meta' && 
/\bmw:Extension\//.test(token.getAttribute('typeof'))) {
                        return false;
                } else {
-                       return true;
+                       return token.dataAttribs.stx !== 'html';
                }
+       },
+
+       isEmptyLineMetaToken: function(token) {
+               return token.constructor === pd.SelfclosingTagTk &&
+                       token.name === "meta" &&
+                       token.getAttribute("typeof") === "mw:EmptyLine";
        },
 
        /*
@@ -888,15 +894,16 @@
        if 
(!/[^<]*(<\w+(\s+[^\0-\cZ\s"'>\/=]+(="[^"]*")?)*\/?>[^<]*)*/.test(out)) {
                throw new Error("normalizeOut input is not in standard 
serialized form");
        }
-       out = normalizeNewlines( out );
        if ( !parsoidOnly ) {
+               // Strip comment-and-ws-only lines that PHP parser strips out
+               out = out.replace(/\n[ \t]*<!--([^-]|-(?!->))*-->([ 
\t]|<!--([^-]|-(?!->))*-->)*\n/g, '\n');
                // ignore troublesome attributes
-               out = out.
+               out = normalizeNewlines( out ).
                        // remove <span typeof="....">....</span>
                        replace(/<span(?:[^>]*) 
typeof="mw:(?:Placeholder|Nowiki|Transclusion|Entity)"(?: 
[^\0-\cZ\s\"\'>\/=]+(?:="[^"]*")?)*>((?:[^<]+|(?!<\/span).)*)<\/span>/g, '$1').
                        replace(/ 
(data-mw|data-parsoid|typeof|resource|rel|prefix|about|rev|datatype|inlist|property|vocab|content|title|class)="[^\"]*"/g,
 '');
        } else {
-               out = out.
+               out = normalizeNewlines( out ).
                        // remove <span typeof="mw:Placeholder">....</span>
                        replace(/<span(?: [^>]+)* typeof="mw:Placeholder"(?: 
[^\0-\cZ\s\"\'>\/=]+(?:="[^"]*")?)*>((?:[^<]+|(?!<\/span).)*)<\/span>/g, '$1').
                        // unnecessary attributes, we don't need to check these
diff --git a/js/lib/pegTokenizer.pegjs.txt b/js/lib/pegTokenizer.pegjs.txt
index 7f52739..349fbef 100644
--- a/js/lib/pegTokenizer.pegjs.txt
+++ b/js/lib/pegTokenizer.pegjs.txt
@@ -2294,19 +2294,20 @@
         }
     }
 
+sol = empty_line_with_comments / normal_sol
+
+sol_prefix
+  = newlineToken
+  / & {
+      // Use saved sol-state only at start of input
+      // If we have saved state of not being in sol posn, fail the production
+      // NOTE: Explicitly check for 'false' and not a falsy value
+      return pos === 0 && pegArgs.pegTokenizer.savedSOL !== false;
+  } { return []; }
 
 // Start of line
-sol
-  = nl:(
-       newlineToken
-       / & {
-         // Use saved sol-state only at start of input
-         // If we have saved state of not being in sol posn, fail the 
production
-         // NOTE: Explicitly check for 'false' and not a falsy value
-         return pos === 0 && pegArgs.pegTokenizer.savedSOL !== false;
-       }
-       { return []; }
-    )
+normal_sol
+  = nl:sol_prefix
     // Eat multi-line comment, so that syntax after still matches as if it
     // was actually preceded by a newline
     cn:( c:comment n:newlineToken? {
@@ -2340,6 +2341,16 @@
         return nl.concat(cn, niToken);
     }
 
+empty_line_with_comments
+  = sp:sol_prefix c:(space* comment (space / comment)* newline)+ {
+        return [
+            sp,
+            new SelfclosingTagTk("meta", [new KV('typeof', 'mw:EmptyLine')], {
+                tokens: flattenIfArray(c)
+            })
+        ];
+    }
+
 comment_space = comment / space
 nl_comment_space = newline / comment_space
 
diff --git a/js/tests/parserTests-blacklist.js 
b/js/tests/parserTests-blacklist.js
index 8ec4525..2a45924 100644
--- a/js/tests/parserTests-blacklist.js
+++ b/js/tests/parserTests-blacklist.js
@@ -35,7 +35,6 @@
 // Blacklist for wt2html
 add("wt2html", "Paragraphs with newline spacing with non-empty white-space 
lines in between");
 add("wt2html", "Paragraphs with newline spacing with non-empty mixed comment 
and white-space lines in between");
-add("wt2html", "Extra newlines: More paragraphs with indented comment");
 add("wt2html", "Extra newlines between heading and content are swallowed");
 add("wt2html", "Non-word characters don't terminate tag names (bug 17663, 
40670, 52022)");
 add("wt2html", "Bare pipe character (bug 52363)");
@@ -78,8 +77,6 @@
 add("wt2html", "Handling html with a div self-closing tag");
 add("wt2html", "2. Lists with start-of-line-transparent tokens before bullets: 
Template close");
 add("wt2html", "List interrupted by empty line or heading");
-add("wt2html", "Single-comment whitespace lines dont break lists, and neither 
do multi-comment whitespace lines");
-add("wt2html", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327)");
 add("wt2html", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack)");
 add("wt2html", "Unclosed formatting tags that straddle lists are closed and 
reopened\n(Parsoid-only since php parser generates broken html -- relies on 
Tidy to fix up)");
 add("wt2html", "Magic Word: {{CURRENTMONTH1}}");
@@ -591,7 +588,6 @@
 add("wt2wt", "Horizontal ruler (should it add that extra space?)");
 add("wt2wt", "Nested lists 3 (first element empty)");
 add("wt2wt", "Nested lists 6 (both elements empty)");
-add("wt2wt", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327)");
 add("wt2wt", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack)");
 add("wt2wt", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up)");
 add("wt2wt", "Magic Word: {{CURRENTMONTH1}}");
@@ -706,7 +702,6 @@
 add("wt2wt", "RT-ed inter-element separators should be valid separators");
 add("wt2wt", "Trailing newlines in a deep dom-subtree that ends a wikitext 
line should be migrated out\n(Parsoid-only since PHP parser relies on Tidy for 
correct output)");
 add("wt2wt", "Empty TD followed by TD with tpl-generated attribute");
-add("wt2wt", "Empty TR followed by mixed-ws-comment line should RT correctly");
 add("wt2wt", "Improperly nested inline or quotes tags with whitespace in 
between");
 
 
@@ -1202,6 +1197,7 @@
 add("html2html", "1. a tags");
 add("html2html", "Parsoid-only: Don't wrap broken template tags in <nowiki> on 
wt2wt (Bug 42353)");
 add("html2html", "Parsoid-only: Don't wrap broken template tags in <nowiki> on 
wt2wt (Bug 42353)");
+add("html2html", "Empty TR followed by mixed-ws-comment line should RT 
correctly");
 add("html2html", "Multi-line image caption generated by templates with/without 
trailing newlines");
 
 
@@ -3038,11 +3034,6 @@
 add("selser", "Nested lists 7 (skip initial nesting levels) [[[[[1]]]]]");
 add("selser", "List interrupted by empty line or heading [[1],0,[1],2,3,0,0]");
 add("selser", "List interrupted by empty line or heading 
[[[4]],4,[[1]],0,[3],2,2]");
-add("selser", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327) [0,4,4,4,[[4]],4,3,3,0,4,3,4,2,4,2,0,[[4]]]");
-add("selser", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327) [[4],2,0,0,1,2,0,4,0,0,2,2,0,3,0,3,2]");
-add("selser", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327) [[4],3,0,0,2,2,3,3,[[4]],0,2,0,0,3,0,2,0]");
-add("selser", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327) [2,3,2,2,[2],2,4,0,0,3,4,4,4,0,2,0,4]");
-add("selser", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327) [[3],3,3,4,1,2,3,2,[[3]],0,0,4,0,3,2,2,1]");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [1,2,[3,2,[3],0]]");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[1,0,0,0,0,0,[0,2,2],2],2,[2,0,[4],4]]");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[4,2,[3],0,0,0,[4,2,3],3],0,2]");
@@ -3350,21 +3341,18 @@
 add("selser", "Sanitizer: Validating the contents of the id attribute (bug 
4515) [1]");
 add("selser", "Sanitizer: Validating the contents of the id attribute (bug 
4515) [2]");
 add("selser", "Sanitizer: Validating the contents of the id attribute (bug 
4515) [[2]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,1,4,[0,0,0,4,0,0],0]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,0,2,[0,0,0,0,0,2],0]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,[0,0,2,0,0,0,0],0]]");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [2]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,1,4,[0,0,0,0,0,2],2]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,1,0,[0,2,0,0,0,0],2]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,[3],0,0,3]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,0,4,[0,0,0,2,0,3],4]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,1,0,[0,0,0,0,0,4],3]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,3,4,[0,2,0,0,0,0],4]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2],0,0,0]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,0,0,2,3]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2,0,2,0,0,0,3],3]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,[3,0,0,0,0,0,0],0]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[0,0,4,0,0,0,0],2]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[4,0,3,0,0,0,0],0]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2,0,0,0,0,0,0],0]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[0,0,0,0,3,0,3],0]]");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [1]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,2,0,2,0]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,4,0,2,3]]");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[3,0,4,2,0]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,2,0]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[3,[0,0,4,0,3,0,0],4]]");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,2,0]]");
 add("selser", "Fuzz testing: Parser13 [2]");
 add("selser", "Fuzz testing: Parser13 [1]");
 add("selser", "Fuzz testing: Parser13 [[2,2]]");
@@ -3912,18 +3900,6 @@
 add("selser", "Empty TD followed by TD with tpl-generated attribute 
[[4,[[0,0,4,0],0]]]");
 add("selser", "Empty TD followed by TD with tpl-generated attribute [[4,1]]");
 add("selser", "Indented table with an empty td [2,[3,[[0,0,0,2],4]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[2]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[2,2,2,0]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,1]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[3,0,[2,[2,2,0]],2]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[[0,[4,0]],0,[2,4],0]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[3,[[2,0],2,[0,4],4]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[1]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[1,0,[0,4],0]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[1,0,3,0]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[[0,3],0,[2,[3,2,0]],0]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[2,0,[0,1],3]]]");
-add("selser", "Empty TR followed by mixed-ws-comment line should RT correctly 
[[0,[[3,[4,2]],4,4,2]]]");
 add("selser", "Improperly nested inline or quotes tags with whitespace in 
between [[[0,2],2,0,1,2]]");
 add("selser", "Improperly nested inline or quotes tags with whitespace in 
between [1]");
 add("selser", "Improperly nested inline or quotes tags with whitespace in 
between [[0,1,2,[0,2],0]]");
diff --git a/js/tests/parserTests.txt b/js/tests/parserTests.txt
index e58186b..7c664ba 100644
--- a/js/tests/parserTests.txt
+++ b/js/tests/parserTests.txt
@@ -17269,10 +17269,10 @@
 !!result
 <table>
 <tbody>
+<tr></tr>
+ <!--c-->
 <tr>
-<td> <!--c--></td></tr>
-<tr>
-<td><!--c--> <!--d--></td></tr>
+<!--c--> </tr><!--d-->
 </tbody></table>
 
 !!end

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I6aada39ff966c328688b085c4b1ba4c46faf713c
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: Cscott <[email protected]>
Gerrit-Reviewer: GWicke <[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