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