jenkins-bot has submitted this change and it was merged.
Change subject: Bug 50636: Don't extrapolate DSR on change
......................................................................
Bug 50636: Don't extrapolate DSR on change
The WikitextSerializer's emitSeparator method was using text node lengths to
extrapolate a previousSibling's DSR, even if that text node was changed. This
led to an invalid extrapolated dsr if that text was modified.
This patch adds a test for the (new) children-modified diff marker on the
parentNode and does not extrapolate the DSR in that case.
Fixes four selser tests in the process.
Change-Id: Iad67bac7a9ba890cbd3816d3ff3295b23b34be30
---
M js/lib/mediawiki.DOMDiff.js
M js/lib/mediawiki.DOMUtils.js
M js/lib/mediawiki.WikitextSerializer.js
M js/tests/parserTests-blacklist.js
4 files changed, 12 insertions(+), 5 deletions(-)
Approvals:
GWicke: Looks good to me, approved
jenkins-bot: Verified
diff --git a/js/lib/mediawiki.DOMDiff.js b/js/lib/mediawiki.DOMDiff.js
index 94234e3..5d4814e 100644
--- a/js/lib/mediawiki.DOMDiff.js
+++ b/js/lib/mediawiki.DOMDiff.js
@@ -172,6 +172,7 @@
while ( baseNode && newNode ) {
debugOut(baseNode, newNode);
+ // shallow check first
if ( ! this.treeEquals(baseNode, newNode, false) ) {
this.debug("-- not equal --");
var origNode = newNode,
@@ -239,6 +240,9 @@
}
}
+ // Record the fact that direct children changed in the
parent node
+ this.markNode(newParentNode, 'modified-children');
+
foundDiffOverall = true;
} else if (!DU.isTplElementNode(this.env, newNode)) {
// Recursively diff subtrees if not template-like
content
diff --git a/js/lib/mediawiki.DOMUtils.js b/js/lib/mediawiki.DOMUtils.js
index 21a5b27..36ca2e1 100644
--- a/js/lib/mediawiki.DOMUtils.js
+++ b/js/lib/mediawiki.DOMUtils.js
@@ -506,6 +506,11 @@
return dmark && dmark.diff.length === 1 && dmark.diff[0] ===
'subtree-changed';
},
+ directChildrenChanged: function(node, env) {
+ var dmark = this.currentDiffMark(node, env);
+ return dmark && dmark.diff.indexOf('children-changed') !== -1;
+ },
+
hasInsertedOrModifiedDiffMark: function(node, env) {
var diffMark = this.currentDiffMark(node, env);
return diffMark &&
diff --git a/js/lib/mediawiki.WikitextSerializer.js
b/js/lib/mediawiki.WikitextSerializer.js
index d352e5b..ed37b3a 100644
--- a/js/lib/mediawiki.WikitextSerializer.js
+++ b/js/lib/mediawiki.WikitextSerializer.js
@@ -3465,7 +3465,9 @@
dsrA = prevNode.parentNode.data.parsoid.dsr;
} else if (prevNode.previousSibling &&
prevNode.previousSibling.nodeType ===
prevNode.ELEMENT_NODE &&
-
prevNode.previousSibling.data.parsoid.dsr)
+
prevNode.previousSibling.data.parsoid.dsr &&
+ // Don't extrapolate if the string was
potentially changed
+
!DU.directChildrenChanged(node.parentNode, this.env))
{
var endDsr =
prevNode.previousSibling.data.parsoid.dsr[1],
correction;
diff --git a/js/tests/parserTests-blacklist.js
b/js/tests/parserTests-blacklist.js
index 83df63e..0a531a1 100644
--- a/js/tests/parserTests-blacklist.js
+++ b/js/tests/parserTests-blacklist.js
@@ -2714,12 +2714,10 @@
add("selser", "Table rowspan [2]");
add("selser", "Table rowspan [1]");
add("selser", "Table rowspan [[0,[1,0,2,0]]]");
-add("selser", "Table rowspan [[3,4]]");
add("selser", "Table rowspan [[2,2]]");
add("selser", "Table rowspan [[0,[1,0,2,2]]]");
add("selser", "Table rowspan [[3,[1,0,[0,2,0,4],2]]]");
add("selser", "Table rowspan [[0,[[4,0,4,0,1],0,1,2]]]");
-add("selser", "Table rowspan [[0,4]]");
add("selser", "Table rowspan [[4,1]]");
add("selser", "Table rowspan [[0,[2,0,4,0]]]");
add("selser", "Table rowspan [[2,1]]");
@@ -2735,7 +2733,6 @@
add("selser", "Nested table [[3,[3,0]]]");
add("selser", "Nested table [[0,[[[4,[4]],2,1,3,[3]],2]]]");
add("selser", "Nested table [[3,[1,4]]]");
-add("selser", "Nested table [[0,4]]");
add("selser", "Nested table [[0,[[1,2,[3,4],0,4],2]]]");
add("selser", "Nested table [[0,[1,2]]]");
add("selser", "Nested table [[0,1]]");
@@ -3492,7 +3489,6 @@
add("selser", "Ignore pipe between table row attributes [[4,2]]");
add("selser", "Ignore pipe between table row attributes [[2,[0,0,2,2]]]");
add("selser", "Ignore pipe between table row attributes
[[2,[0,3,[0,[3]],2]]]");
-add("selser", "Ignore pipe between table row attributes [[3,[0,2,[0,1],3]]]");
add("selser", "Ignore pipe between table row attributes [[3,2]]");
add("selser", "Ignore pipe between table row attributes [[2,1]]");
add("selser", "Ref: 3. spaces in ref-names should be ignored [[0,0,2,0,3,0]]");
--
To view, visit https://gerrit.wikimedia.org/r/71757
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Iad67bac7a9ba890cbd3816d3ff3295b23b34be30
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: GWicke <[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