blob: 2e9d7d060541d13f691f96027789aa0229d3ae6d [file] [edit]
<!DOCTYPE HTML>
<title>selectionchange event on document</title>
<link rel="author" title="Piotr OleÅ›" href="mailto:piotrek.oles@gmail.com">
<link rel="help" href="https://w3c.github.io/selection-api/#selectionchange-event">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="example">test <span>nested</span></div>
<script>
"use strict";
function tick(t) {
return new Promise(resolve => {
t.step_timeout(resolve, 0);
});
}
async function setupTest(t) {
const target = document.getElementById("example");
const selection = document.getSelection();
// Clean-up the state
selection.removeAllRanges();
await tick(t);
// Add event listeners and increment count on each event
let events = 0;
document.addEventListener("selectionchange", () => {
events++;
});
function getEventsCount() {
return events;
}
return { target, selection, getEventsCount };
}
promise_test(async t => {
const { target, selection, getEventsCount } = await setupTest(t);
selection.setBaseAndExtent(target, 0, target, 1);
assert_equals(getEventsCount(), 0, "Should be 0 events as they're scheduled");
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event");
selection.setBaseAndExtent(target, 0, target, 1);
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event because we called setBaseAndExtent with the same arguments");
selection.setBaseAndExtent(target, 0, target, 2);
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events");
}, `triggers selectionchange event on setBaseAndExtent`);
promise_test(async t => {
const { target, selection, getEventsCount } = await setupTest(t);
selection.selectAllChildren(target);
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event");
selection.selectAllChildren(target);
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event because we called selectAllChildren with the same arguments");
}, `triggers selectionchange event on selectAllChildren`);
promise_test(async t => {
const { target, selection, getEventsCount } = await setupTest(t);
selection.selectAllChildren(target);
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event");
selection.removeAllRanges();
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events");
selection.removeAllRanges();
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events because we called removeAllRanges with the same arguments");
}, `triggers selectionchange event on removeAllRanges`);
promise_test(async t => {
const { target, selection, getEventsCount } = await setupTest(t);
selection.setBaseAndExtent(target, 0, target, 1);
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event");
selection.collapseToStart();
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events");
selection.collapseToStart();
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events because we called collapseToStart with the same arguments");
}, `triggers selectionchange event on collapseToStart`);
promise_test(async t => {
const { target, selection, getEventsCount } = await setupTest(t);
selection.setBaseAndExtent(target, 0, target, 1);
await tick(t);
assert_equals(getEventsCount(), 1, "Should be 1 event");
selection.collapseToEnd();
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events");
selection.collapseToEnd();
await tick(t);
assert_equals(getEventsCount(), 2, "Should be 2 events because we called collapseToEnd with the same arguments");
}, `triggers selectionchange event on collapseToEnd`);
</script>