Chromium Code Reviews| Index: third_party/WebKit/LayoutTests/editing/selection/document-mutation.html |
| diff --git a/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html b/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html |
| index 7345f72787a0dfc1e741ba0ca20d5ea523a12304..7a1f434666e05a909a8c2ed7bfa6ea9277edecc3 100644 |
| --- a/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html |
| +++ b/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html |
| @@ -1,91 +1,85 @@ |
| -<!DOCTYPE html> |
| -<html> |
| -<body> |
| -<p>This test ensures WebKit adjusts the selection under document mutation.</p> |
| -<p> Examples are from:<br> http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation</p> |
| -<div id="test" contenteditable></div> |
| -<pre> |
| +<!doctype html> |
| +<script src="../../resources/testharness.js"></script> |
| +<script src="../../resources/testharnessreport.js"></script> |
| +<script src="../assert_selection.js"></script> |
| <script> |
| - |
| -var test = document.getElementById('test'); |
| -test.focus(); |
| - |
| -if (window.testRunner) |
| - testRunner.dumpAsText(); |
| - |
| -var baseIsFirst = true; |
| -var selection = window.getSelection(); |
| - |
| -function checkResult(expectedStartOffset, expectedEndOffset) { |
| - var actualStartOffset = selection.getRangeAt(0).startOffset; |
| - var actualEndOffset = selection.getRangeAt(0).endOffset; |
| - if (actualStartOffset == expectedStartOffset && actualEndOffset == expectedEndOffset) |
| - document.write('PASS: selection is (' + expectedStartOffset + ', ' + expectedEndOffset + ') "' + selection + '"\n'); |
| - else |
| - document.write('FAIL: selection is (' + actualStartOffset + ', ' + actualEndOffset + ') "' + selection + |
| - '" and expected selection is ' + '(' + expectedStartOffset + ', ' + expectedEndOffset + ')\n'); |
| +function swapMarks(string) { |
| + if (string.indexOf('^') === -1) |
| + return string; |
| + return string.replace('^', '$').replace('|', '^').replace('$', '|'); |
| } |
| -function setSelectionRange(startContainer, startOffset, endContainer, endOffset) { |
| - if (baseIsFirst) |
| - selection.setBaseAndExtent(startContainer, startOffset, endContainer, endOffset); |
| - else |
| - selection.setBaseAndExtent(endContainer, endOffset, startContainer, startOffset); |
| +function test_selection(sample, closure, expected, description) { |
| + test(() => assert_selection(sample, closure, expected), |
| + description + '; anchor is first'); |
| + test(() => assert_selection(swapMarks(sample), closure, swapMarks(expected)), |
| + description + '; focus is first'); |
| } |
| -function runInsertionTest(actor, expectedStartOffset, expectedEndOffset) { |
| - test.innerHTML = '<p>Abcd efgh XY blah ijkl</p>'; |
| - |
| - // Select "Y blah i" |
| - setSelectionRange(test.firstChild.firstChild, 11, test.firstChild.firstChild, 19); |
| - actor(test.firstChild.firstChild); |
| - checkResult(expectedStartOffset, expectedEndOffset); |
| +function doInsert(selection, offset) { |
| + const element = selection.document.querySelector('p'); |
| + element.firstChild.insertData(offset, '_'.repeat(13)); |
| } |
| -function runDeletionTest(actor, expectedStartOffset, expectedEndOffset) { |
| - test.innerHTML = '<p>Abcd efgh The Range ijkl</p>'; |
| - |
| - // Select "he Range i" |
| - setSelectionRange(test.firstChild.firstChild, 11, test.firstChild.firstChild, 21); |
| - actor(test.firstChild.firstChild); |
| - checkResult(expectedStartOffset, expectedEndOffset); |
| +function doDelete(selection, start, end) { |
|
Xiaocheng
2016/09/27 09:32:50
nit: |end| should be named |length| instead.
yosin_UTC9
2016/09/27 09:56:11
Done
|
| + const element = selection.document.querySelector('p'); |
| + element.firstChild.deleteData(start, end); |
| } |
| -function deleteNodeContainingSelection(expectedStartOffset, expectedEndOffset) { |
| - test.innerHTML = '<p>Abcd <em>efgh The Range ij</em>kl</p>'; |
| - |
| - // Select "he Range i" |
| - setSelectionRange(test.firstChild.firstChild.nextSibling.firstChild, 6, test.firstChild.firstChild.nextSibling.firstChild, 16); |
| - test.firstChild.removeChild(test.firstChild.firstChild.nextSibling); |
| - checkResult(expectedStartOffset, expectedEndOffset); |
| -} |
| - |
| -function runTests() { |
| - document.write('Insertion tests:\n'); |
| - runInsertionTest(function(node) { node.insertData(10, 'inserted text'); }, 24, 32); |
| - runInsertionTest(function(node) { node.insertData(11, 'inserted text'); }, 11, 32); |
| - runInsertionTest(function(node) { node.insertData(12, 'inserted text'); }, 11, 32); |
| - runInsertionTest(function(node) { node.insertData(17, 'inserted text'); }, 11, 32); |
| - runInsertionTest(function(node) { node.insertData(19, 'inserted text'); }, 11, 19); |
| - |
| - document.write('\nDeletion tests:\n'); |
| - runDeletionTest(function(node) { node.deleteData(5, 8); }, 5, 13); |
| - runDeletionTest(function(node) { node.deleteData(5, 17); }, 5, 5); |
| - runDeletionTest(function(node) { node.deleteData(5, 6); }, 5, 15); |
| - deleteNodeContainingSelection(1, 1); |
| -} |
| - |
| -document.write('Base is first\n\n'); |
| -runTests(); |
| - |
| -baseIsFirst = false; |
| - |
| -document.write('\n\nExtent is first\n\n'); |
| -runTests(); |
| - |
| -test.style.display = 'none'; |
| -document.write('\nDONE'); |
| +// Insertion tests |
| +test_selection( |
| + '<p>Abcd efgh X^Y blah i|jkl</p>', |
| + selection => doInsert(selection, 10), |
| + '<p>Abcd efgh _____________X^Y blah i|jkl</p>', |
| + 'insertData at 10'); |
| + |
| +test_selection( |
| + '<p>Abcd efgh X^Y blah i|jkl</p>', |
| + selection => doInsert(selection, 11), |
| + '<p>Abcd efgh X^_____________Y blah i|jkl</p>', |
| + 'insertData at 11'); |
| + |
| +test_selection( |
| + '<p>Abcd efgh X^Y blah i|jkl</p>', |
| + selection => doInsert(selection, 12), |
| + '<p>Abcd efgh X^Y_____________ blah i|jkl</p>', |
| + 'insertData at 12'); |
| + |
| +test_selection( |
| + '<p>Abcd efgh X^Y blah i|jkl</p>', |
| + selection => doInsert(selection, 17), |
| + '<p>Abcd efgh X^Y blah_____________ i|jkl</p>', |
| + 'insertData at 17'); |
| + |
| +test_selection( |
| + '<p>Abcd efgh X^Y blah i|jkl</p>', |
| + selection => doInsert(selection, 19), |
| + '<p>Abcd efgh X^Y blah i|_____________jkl</p>', |
| + 'insertData at 19'); |
| + |
| +// Deletion tests |
| +test_selection( |
| + '<p>Abcd efgh T^he Range i|jkl</p>', |
| + selection => doDelete(selection, 5, 8), |
| + '<p>Abcd ^ Range i|jkl</p>', |
| + 'deleteData(5, 8)'); |
| + |
| +test_selection( |
| + '<p>Abcd efgh T^he Range i|jkl</p>', |
| + selection => doDelete(selection, 5, 6), |
| + '<p>Abcd ^he Range i|jkl</p>', |
| + 'deleteData(5, 6)'); |
| + |
| +test_selection( |
| + '<p>Abcd efgh T^he Range i|jkl</p>', |
| + selection => doDelete(selection, 5, 17), |
| + '<p>Abcd |kl</p>', |
| + 'deleteData(5, 17)'); |
| + |
| +// Delete node containing selection |
| +test_selection( |
| + '<p>Abcd <em>efgh T^he Range i|j</em>kl</p>', |
| + selection => selection.document.querySelector('em').remove(), |
| + '<p>Abcd |kl</p>', |
| + 'delete node containing selection'); |
| </script> |
| -</pre> |
| -</body> |
| -</html> |