summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/selection/textcontrols/selectionchange.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/selection/textcontrols/selectionchange.html')
-rw-r--r--testing/web-platform/tests/selection/textcontrols/selectionchange.html212
1 files changed, 212 insertions, 0 deletions
diff --git a/testing/web-platform/tests/selection/textcontrols/selectionchange.html b/testing/web-platform/tests/selection/textcontrols/selectionchange.html
new file mode 100644
index 0000000000..2b43cfe44b
--- /dev/null
+++ b/testing/web-platform/tests/selection/textcontrols/selectionchange.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test selectionchange events from text controls</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+ input,
+ textarea {
+ font: 16px/1 Ahem;
+ }
+</style>
+
+<input id="input" width="200"><br>
+<textarea id="textarea" width="200"></textarea>
+
+<script>
+ class SelectionChangeCollector {
+ /**
+ * @param {HTMLElement} target
+ */
+ constructor(target) {
+ this.target = target;
+ this.events = [];
+ target.addEventListener("selectionchange", ev => {
+ this.events.push(ev);
+ });
+ }
+ clear() {
+ this.events.length = 0;
+ }
+ }
+
+ const data = {
+ collectors: [
+ new SelectionChangeCollector(input),
+ new SelectionChangeCollector(input.cloneNode()),
+ new SelectionChangeCollector(textarea),
+ new SelectionChangeCollector(textarea.cloneNode(true)),
+ ],
+ async initialize() {
+ for (const collector of this.collectors) {
+ collector.target.value = "XXXXXXXXXXXXXXXXXXX";
+ collector.target.blur();
+ collector.target.setSelectionRange(0, 0);
+ }
+ await this.spin();
+ for (const collector of this.collectors) {
+ collector.clear();
+ }
+ },
+ spin() {
+ return new Promise(setTimeout);
+ },
+ async assert_empty_spin() {
+ // firing selectionchange must be asynchronous
+ for (const collector of this.collectors) {
+ assert_equals(collector.events.length, 0);
+ }
+ await this.spin();
+ }
+ };
+
+ for (const collector of data.collectors) {
+ const target = collector.target;
+ const name = `the ${!target.parentNode ? "disconnected " : ""}${target.localName} element`;
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.selectionStart = 1;
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Modifying selectionStart value of ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.selectionEnd = 1;
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Modifying selectionEnd value of ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.setSelectionRange(0, 4);
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Calling setSelectionRange() on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.select();
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Calling select() on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.setRangeText("newmiddle", 2, 3, "select");
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Calling setRangeText() on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.selectionStart = 0;
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 0);
+ }, `Setting initial zero selectionStart value on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.selectionStart = 2;
+ target.selectionStart = 2;
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Setting the same selectionStart value twice on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.selectionEnd = 0;
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 0);
+ }, `Setting initial zero selectionEnd value on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.selectionEnd = 2;
+ target.selectionEnd = 2;
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Setting the same selectionEnd value twice on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.setSelectionRange(0, 0);
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 0);
+ }, `Setting initial zero selection range on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.setSelectionRange(3, 3);
+ target.setSelectionRange(3, 3);
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Setting the same selection range twice on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.select();
+ target.select();
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 1);
+ }, `Calling select() twice on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.select();
+ target.setRangeText("foo", 2, 6);
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 2);
+ }, `Calling setRangeText() after select() on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.select();
+ target.setRangeText("", 10, 12);
+ target.setRangeText("", 10, 12);
+ target.setRangeText("", 10, 12);
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 4);
+ }, `Calling setRangeText() repeatedly on ${name}`);
+
+ promise_test(async () => {
+ await data.initialize();
+
+ target.value = "";
+ target.setRangeText("foo");
+
+ await data.assert_empty_spin();
+ assert_equals(collector.events.length, 0);
+ }, `Calling setRangeText() on empty ${name}`);
+ }
+</script>