| <!DOCTYPE HTML> |
| <meta charset=utf-8> |
| <title>Selection: stringifier for editable elements</title> |
| <!-- |
| There are two open issues about how this should behave |
| https://github.com/w3c/selection-api/issues/83 |
| https://github.com/w3c/selection-api/issues/7 |
| --> |
| <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> |
| <body> |
| <input id="dummyInput"></input> |
| |
| <input id="textInput" value="This is a text"> |
| <textarea id="textArea" rows="5" cols="40"> |
| |
| Line one |
| Line two |
| |
| </textarea> |
| |
| <button id="button">Button</button> |
| <a id="anchor">Anchor</a> |
| <span id="text">Text</span> |
| </body> |
| <script> |
| |
| function reset() { |
| window.getSelection().empty(); |
| dummyInput.focus(); |
| } |
| |
| window.onload = () => { |
| test(() => { |
| reset(); |
| textInput.select(); |
| |
| assert_equals(document.activeElement, textInput); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "This is a text"); |
| }, "select the entire input should result all the content"); |
| |
| test(() => { |
| reset(); |
| textInput.select(); |
| dummyInput.focus(); |
| |
| assert_equals(document.activeElement, dummyInput); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), ""); |
| }, "toString() should return empty when the focus is not on the editable content"); |
| |
| test(() => { |
| reset(); |
| |
| textInput.selectionStart = 3; |
| textInput.selectionEnd = 7; |
| |
| assert_equals(document.activeElement, dummyInput); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), ""); |
| |
| textInput.focus(); |
| assert_equals(document.activeElement, textInput); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "s is"); |
| }, "toString() works with selectionStart and selectionEnd for input"); |
| |
| test(() => { |
| reset(); |
| |
| textArea.select(); |
| |
| assert_equals(document.activeElement, textArea); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "\n Line one\n Line two\n\n "); |
| }, "select the entire textarea should result all the content"); |
| |
| test(() => { |
| reset(); |
| |
| textArea.selectionStart = 3; |
| textArea.selectionEnd = 12; |
| |
| assert_equals(document.activeElement, dummyInput); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), ""); |
| |
| textArea.focus(); |
| assert_equals(document.activeElement, textArea); |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "Line one\n"); |
| }, "toString() works with selectionStart and selectionEnd for textarea"); |
| |
| test(() => { |
| reset(); |
| textInput.select(); |
| |
| button.focus(); |
| |
| assert_equals(document.activeElement, button); |
| |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "This is a text"); |
| }, "toString() works even if a click just occured on a button"); |
| |
| promise_test((t) => { |
| reset(); |
| textInput.select(); |
| return new Promise(r => { |
| anchor.addEventListener("click", function() { |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "This is a text"); |
| r(); |
| }, {once: true}); |
| |
| anchor.click(); |
| }); |
| }, "toString() works for programatically calling .click() on anchor (without href)"); |
| |
| promise_test((t) => { |
| reset(); |
| textInput.select(); |
| return new Promise(r => { |
| anchor.addEventListener("click", function() { |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), ""); |
| r(); |
| }, {once : true}); |
| |
| test_driver.click(anchor); |
| }); |
| }, "toString() doesn't work for actual clicking the anchor (without href)"); |
| |
| promise_test((t) => { |
| reset(); |
| textInput.select(); |
| anchor.href = "#"; |
| return new Promise(r => { |
| anchor.addEventListener("click", function() { |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "This is a text"); |
| r(); |
| }, {once: true}); |
| |
| anchor.click(); // anchor has href now |
| }); |
| }, "toString() works for programatically calling .click() on anchor (with href)"); |
| |
| promise_test((t) => { |
| reset(); |
| textInput.select(); |
| return new Promise(r => { |
| anchor.addEventListener("click", function() { |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "This is a text"); |
| r(); |
| }, {once : true}); |
| |
| test_driver.click(anchor); // anchor has href now |
| }); |
| }, "toString() also works for actual clicking the anchor (with href)"); |
| |
| promise_test((t) => { |
| reset(); |
| textInput.select(); |
| |
| return new Promise(async r => { |
| anchor.addEventListener("click", function() { |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), ""); |
| r(); |
| }, {once : true}); |
| |
| await test_driver.click(text); |
| test_driver.click(anchor); |
| }); |
| }, "Click on a text prior to toString() moves the seleciton"); |
| |
| promise_test((t) => { |
| reset(); |
| textInput.select(); |
| |
| text.style = "user-select: none"; |
| return new Promise(async r => { |
| anchor.addEventListener("click", function() { |
| assert_equals(window.getSelection().toString().replace(/\r\n/g, "\n"), "This is a text"); |
| r(); |
| }, {once : true}); |
| |
| await test_driver.click(text); |
| test_driver.click(anchor); |
| }); |
| }, "Click on a `user-select:none` text prior to toString() doesn't move the seleciton"); |
| }; |
| </script> |
| </html> |