Index: third_party/WebKit/LayoutTests/imported/wpt/editing/other/delete.html |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/editing/other/delete.html b/third_party/WebKit/LayoutTests/imported/wpt/editing/other/delete.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b9bd1437e3721f1353a9df6bde155f2f2b8ae95a |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/editing/other/delete.html |
@@ -0,0 +1,149 @@ |
+<!doctype html> |
+<meta charset=utf-8> |
+<title>Deletion tests</title> |
+<script src=/resources/testharness.js></script> |
+<script src=/resources/testharnessreport.js></script> |
+<div contenteditable></div> |
+<script> |
+var div = document.querySelector("div"); |
+ |
+// Format: [start html, start pos, expected html, expected pos, command] |
+// Positions are a sequence of offsets starting from div, e.g., "1,2,0" |
+// translates to node = div.childNodes[1].childNodes[2], offset = 0. For a |
+// non-collapsed selection, use a hyphen, like "0,0-1,0". The selections are |
+// created with collapse() followed by extend() to allow reverse selections, so |
+// order is significant. |
+// |
+// Expected values can be arrays, in which case any is acceptable. |
+var tests = [ |
+ ["<p><br></p><p><br></p>", "1,0", "<p><br></p>", "0,0", "delete"], |
+ ["<p><br></p><p><br></p>", "0,0", "<p><br></p>", "0,0", "forwarddelete"], |
+ |
+ // Range |
+ ["<p><br></p><p><br></p>", "0,0-1,0", "<p><br></p>", "0,0", "delete"], |
+ ["<p><br></p><p><br></p>", "0,0-1,0", "<p><br></p>", "0,0", "forwarddelete"], |
+ ["<p><br></p><p><br></p>", "1,0-0,0", "<p><br></p>", "0,0", "delete"], |
+ ["<p><br></p><p><br></p>", "1,0-0,0", "<p><br></p>", "0,0", "forwarddelete"], |
+ |
+ // Different start values |
+ ["<p>x<br></p><p><br></p>", "1,0", |
+ // WebKit/Blink like to get rid of the extra <br> |
+ ["<p>x<br></p>", "<p>x</p>"], |
+ // The selection should really be collapsed inside the text node, but in the |
+ // parent is close enough. |
+ ["0,0,1", "0,1"], "delete"], |
+ ["<p><br><br></p><p><br></p>", "1,0", "<p><br><br></p>", "0,1", "delete"], |
+ ["<p><br></p><p><br><br></p>", "1,1", |
+ "<p><br></p><p><br></p>", "1,0", "delete"], |
+ ["<p><br><br><br></p>", "0,2", "<p><br><br></p>", "0,1", "delete"], |
+ ["<p><br></p><p><br><br><br></p>", "1,2", |
+ "<p><br></p><p><br><br></p>", "1,1", "delete"], |
+ ["<p><br><br></p><p><br><br></p>", "1,1", |
+ "<p><br><br></p><p><br></p>", "1,0", "delete"], |
+ ["<p><br></p><br>", "1", "<p><br></p>", "0,0", "delete"], |
+ |
+ // The trailing \n in these cases is actually significant, because it was |
+ // necessary to trigger an actual Gecko bug (somehow!). |
+ ["<p><br></p><p><br></p>\n", "1,0", "<p><br></p>\n", "0,0", "delete"], |
+ ["<p><br></p><p><br></p>\n", "0,0", "<p><br></p>\n", "0,0", "forwarddelete"], |
+ ["\n<p><tt>x</tt></p><p><tt><br></tt></p><p><tt><br></tt></p>\n", "3,0,0", |
+ "\n<p><tt>x</tt></p><p><tt><br></tt></p>\n", "2,0,0", "delete"], |
+]; |
+ |
+div.focus(); |
+ |
+for (var i = 0; i < tests.length; i++) { |
+ test(function() { |
+ var test = tests[i]; |
+ div.innerHTML = test[0]; |
+ setSelection(test[1]); |
+ |
+ document.execCommand(test[4], false, ""); |
+ |
+ if (typeof test[2] == "string") { |
+ assert_equals(div.innerHTML, test[2], "innerHTML"); |
+ } else { |
+ assert_in_array(div.innerHTML, test[2], "innerHTML"); |
+ } |
+ |
+ var actualSel = recordSelection(); |
+ var expectedSel = []; |
+ if (typeof test[3] == "string") { |
+ test[3] = [test[3]]; |
+ } |
+ for (var j = 0; j < test[3].length; j++) { |
+ setSelection(test[3][j]); |
+ expectedSel.push(recordSelection()); |
+ } |
+ assertSelectionEquals(actualSel, expectedSel, test[2]); |
+ }, i + ": " + format_value(tests[i][0]) + " " + tests[i][1] + |
+ " " + tests[i][4]); |
+} |
+ |
+function setSelection(selstr) { |
+ var parts = selstr.split("-"); |
+ var collapsePoint = getPointFromArray(parts[0].split(",")); |
+ getSelection().collapse(collapsePoint[0], collapsePoint[1]); |
+ |
+ if (parts[1]) { |
+ var extendPoint = getPointFromArray(parts[1].split(",")); |
+ getSelection().extend(extendPoint[0], extendPoint[1]); |
+ } |
+} |
+ |
+function getPointFromArray(offsets) { |
+ var retNode = div, retOffset; |
+ var offset; |
+ while (offset = offsets.shift()) { |
+ if (!offsets.length) { |
+ retOffset = offset; |
+ } else { |
+ retNode = retNode.childNodes[offset]; |
+ } |
+ } |
+ return [retNode, retOffset]; |
+} |
+ |
+function recordSelection() { |
+ return [getSelection().anchorNode, getSelection().anchorOffset, |
+ getSelection().focusNode, getSelection().focusOffset]; |
+} |
+ |
+function assertSelectionEquals(actual, expected, html) { |
+ if (typeof expected == "string") { |
+ expected = [expected]; |
+ } |
+ var pass = false; |
+ for (var i = 0; i < expected.length; i++) { |
+ if (expected[i][0] === actual[0] && |
+ expected[i][1] === actual[1] && |
+ expected[i][2] === actual[2] && |
+ expected[i][3] === actual[3]) { |
+ pass = true; |
+ break; |
+ } |
+ } |
+ |
+ assert_true(pass, "Wrong selection, expected " + formatSel(expected) + |
+ ", got " + formatSel(actual) + |
+ " (in HTML " + format_value(html) + ")"); |
+} |
+ |
+function formatSel(arr) { |
+ if (arr.length == 1) { |
+ arr = arr[0]; |
+ } |
+ if (Array.isArray(arr[0])) { |
+ var ret = []; |
+ for (var i = 0; i < arr.length; i++) { |
+ ret.push(formatSel(arr[i])); |
+ } |
+ return ret.join(" or "); |
+ } |
+ if (arr[0] == arr[2] && arr[1] == arr[3]) { |
+ return "collapsed (" + format_value(arr[0]) + ", " + arr[1] + ")"; |
+ } |
+ return "(" + format_value(arr[0]) + ", " + arr[1] + |
+ ")-(" + format_value(arr[2]) + ", " + arr[3] + ")"; |
+} |
+</script> |