| <!doctype html> | |
| <title>Selection direction tests</title> | |
| <meta charset=utf-8> | |
| <div id=test> | |
| <p>This is a manual test, since there's no way to synthesize keyboard or | |
| mouse input. Click after the letter "c" in the following paragraph and | |
| drag backwards so that both the "b" and the "c" are highlighted, then click | |
| the "Test" button: | |
| <p>abcd <button onclick=testDirection()>Test</button> | |
| <p>efghi | |
| </div> | |
| <div id=log></div> | |
| <script src=/resources/testharness.js></script> | |
| <script src=/resources/testharnessreport.js></script> | |
| <script> | |
| setup({explicit_done: true}); | |
| function testDirection() { | |
| var testDiv = document.getElementById("test"); | |
| var p = testDiv.getElementsByTagName("p")[1].firstChild; | |
| var selection = getSelection(); | |
| var range = selection.getRangeAt(0); | |
| test(function() { | |
| assert_equals(range.toString(), "bc"); | |
| }, "The expected range is selected"); | |
| test(function() { | |
| assert_equals(selection.anchorNode, p); | |
| assert_equals(selection.focusNode, p); | |
| }, "Expected node is initially selected"); | |
| test(function() { | |
| assert_array_equals([selection.anchorOffset, selection.focusOffset].sort(), [1, 3]); | |
| }, "Expected offsets are initially selected (maybe not in order)"); | |
| test(function() { | |
| assert_equals(selection.anchorOffset, 3); | |
| assert_equals(selection.focusOffset, 1); | |
| }, "Offsets are backwards for initial selection"), | |
| test(function() { | |
| assert_equals(selection.anchorNode, range.endContainer); | |
| assert_equals(selection.anchorOffset, range.endOffset); | |
| assert_equals(selection.focusNode, range.startContainer); | |
| assert_equals(selection.focusOffset, range.startOffset); | |
| }, "Offsets match the range for initial selection"); | |
| // Per spec, the direction of the selection remains even if you zap a range | |
| // and add a new one. | |
| test(function() { | |
| selection.removeRange(range); | |
| range = document.createRange(); | |
| p = testDiv.getElementsByTagName("p")[0].firstChild; | |
| range.setStart(p, 0); | |
| range.setEnd(p, 4); | |
| assert_equals(range.toString(), "This"); | |
| selection.addRange(range); | |
| }, "removeRange()/addRange() successful"); | |
| test(function() { | |
| assert_equals(selection.anchorNode, p); | |
| assert_equals(selection.focusNode, p); | |
| }, "Expected node is selected after remove/addRange()"); | |
| test(function() { | |
| assert_array_equals([selection.anchorOffset, selection.focusOffset].sort(), [0, 4]); | |
| }, "Expected offsets are selected after remove/addRange() (maybe not in order)"); | |
| test(function() { | |
| assert_equals(selection.anchorOffset, 4); | |
| assert_equals(selection.focusOffset, 0); | |
| }, "Offsets are backwards after remove/addRange()"), | |
| test(function() { | |
| assert_equals(selection.anchorNode, range.endContainer); | |
| assert_equals(selection.anchorOffset, range.endOffset); | |
| assert_equals(selection.focusNode, range.startContainer); | |
| assert_equals(selection.focusOffset, range.startOffset); | |
| }, "Offsets match the range after remove/addRange()"); | |
| // But if you call removeAllRanges(), the direction should reset to | |
| // forwards. | |
| test(function() { | |
| selection.removeAllRanges(); | |
| range = document.createRange(); | |
| p = testDiv.getElementsByTagName("p")[2].firstChild; | |
| range.setStart(p, 2); | |
| range.setEnd(p, 5); | |
| assert_equals(range.toString(), "ghi"); | |
| selection.addRange(range); | |
| }, "removeAllRanges() successful"); | |
| test(function() { | |
| assert_equals(selection.anchorNode, p); | |
| assert_equals(selection.focusNode, p); | |
| }, "Expected node is selected after removeAllRanges()"); | |
| test(function() { | |
| assert_array_equals([selection.anchorOffset, selection.focusOffset].sort(), [2, 5]); | |
| }, "Expected offsets are selected after removeAllRanges() (maybe not in order)"); | |
| test(function() { | |
| assert_equals(selection.anchorOffset, 2); | |
| assert_equals(selection.focusOffset, 5); | |
| }, "Offsets are forwards after removeAllRanges()"); | |
| test(function() { | |
| assert_equals(selection.anchorNode, range.startContainer); | |
| assert_equals(selection.anchorOffset, range.startOffset); | |
| assert_equals(selection.focusNode, range.endContainer); | |
| assert_equals(selection.focusOffset, range.endOffset); | |
| }, "Offsets match the range after removeAllRanges()"); | |
| done(); | |
| } | |
| </script> |