| <!doctype html> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script src="../assert_selection.js"></script> |
| <script> |
| function swapMarks(string) { |
| if (string.indexOf('^') === -1) |
| return string; |
| return string.replace('^', '$').replace('|', '^').replace('$', '|'); |
| } |
| |
| 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 doInsert(selection, offset) { |
| const element = selection.document.querySelector('p'); |
| element.firstChild.insertData(offset, '_'.repeat(13)); |
| } |
| |
| function doDelete(selection, offset, length) { |
| const element = selection.document.querySelector('p'); |
| element.firstChild.deleteData(offset, length); |
| } |
| |
| // 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> |