| <!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> |