| <!DOCTYPE HTML> |
| <style> |
| .wrap span { |
| white-space: pre-wrap; |
| } |
| </style> |
| <div class="wrap"> |
| <span id="initial" contenteditable="true"> abcd </span>111<span id="before" contenteditable="true"> efgh </span>222<br><span id="after" contenteditable="true"> ijkl </span>333<span id="next" contenteditable="true"> mnop </span>444<span id="last" contenteditable="true"> qrst </span> |
| </div> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <script src="/resources/testdriver-actions.js"></script> |
| <script> |
| const KEY_CODE_MAP = { |
| 'ArrowLeft': '\uE012', |
| 'ArrowUp': '\uE013', |
| 'ArrowRight': '\uE014', |
| 'ArrowDown': '\uE015', |
| 'Tab': '\uE004', |
| 'S': '\u0053', |
| }; |
| |
| function keyPress(target, key) { |
| const code = KEY_CODE_MAP[key]; |
| return test_driver.send_keys(target, code); |
| } |
| |
| function deletebr() { |
| let el; |
| el = document.querySelector('br'); |
| if (el) { |
| el.remove(); |
| } |
| } |
| |
| // Delete the <br> element so that we get a single line |
| deletebr(); |
| |
| const s = getSelection(); |
| promise_test(async t => { |
| initial.focus(); |
| let node = initial.firstChild; |
| assert_equals(s.anchorNode, node, "Focus must be at the span with 'abcd'"); |
| assert_equals(s.anchorOffset, 0, "Caret must be at the start of the 'abcd' text"); |
| |
| await keyPress(initial, "Tab"); |
| node = before.firstChild |
| assert_equals(s.anchorNode, node, "Caret moved to span with 'efgh'"); |
| assert_equals(s.anchorOffset, 0, "Caret must be at the start of the 'efgh' text"); |
| |
| await keyPress(before, "Tab"); |
| node = after.firstChild |
| assert_equals(s.anchorNode, node, "Focus must be at the span with 'ijkl'"); |
| assert_equals(s.anchorOffset, 0, "Caret must be at the start of the 'efgh' text"); |
| |
| await keyPress(after, "Tab"); |
| node = next.firstChild |
| assert_equals(s.anchorNode, node, "Focus must be at the span with 'mnop'"); |
| assert_equals(s.anchorOffset, 0, "Caret must be at the start of the 'efgh' text"); |
| |
| }, "Navigate after deleting <br>"); |
| |
| promise_test(async t => { |
| initial.focus(); |
| await keyPress(initial, "Tab"); |
| await keyPress(before, "Tab"); |
| await keyPress(after, "Tab"); |
| await keyPress(next, "ArrowRight"); |
| await keyPress(next, "ArrowRight"); |
| await keyPress(next, "ArrowRight"); |
| |
| await keyPress(next, "S"); |
| assert_equals(next.firstChild.textContent, " mnSop ", "Inserting a 'S' char betwen 'n' and 'o'"); |
| }, "Insert text after deleting <br>") |
| |
| </script> |