| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <link rel="help" href="https://w3c.github.io/selection-api/#selectionchange-event"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <body> |
| <div id="container"><br><br></div> |
| <script> |
| |
| promise_test(() => { |
| return new Promise(resolve => { |
| let didFireSelectionChangeEvent = false; |
| document.addEventListener("selectionchange", () => { didFireSelectionChangeEvent = true; resolve(); }, {once: true}); |
| getSelection().setPosition(container, 0); |
| assert_false(didFireSelectionChangeEvent); |
| }); |
| }, "selectionchange event on document fires"); |
| |
| promise_test(() => { |
| return (async function() { |
| let selectionChangeCount = 0; |
| document.addEventListener("selectionchange", () => ++selectionChangeCount); |
| container.innerHTML = '<span><br></span><span><br></span>'; |
| getSelection().setPosition(container, 0); |
| assert_equals(selectionChangeCount, 0); |
| getSelection().setPosition(container, 2); |
| assert_equals(selectionChangeCount, 0); |
| await new Promise(setTimeout); |
| assert_equals(selectionChangeCount, 1); |
| })(); |
| }, "selectionchange event on document fires once"); |
| |
| promise_test(() => { |
| return (async function() { |
| let selectionChangeCount = 0; |
| document.addEventListener("selectionchange", () => ++selectionChangeCount); |
| container.innerHTML = '<span><br></span><span><br></span>'; |
| getSelection().setPosition(container, 0); |
| assert_equals(selectionChangeCount, 0); |
| getSelection().setPosition(container, 2); |
| assert_equals(selectionChangeCount, 0); |
| await new Promise(setTimeout); |
| assert_equals(selectionChangeCount, 1); |
| getSelection().setPosition(container, 0); |
| assert_equals(selectionChangeCount, 1); |
| getSelection().setPosition(container, 2); |
| assert_equals(selectionChangeCount, 1); |
| await new Promise(setTimeout); |
| assert_equals(selectionChangeCount, 2); |
| })(); |
| }, "task to fire selectionchange event gets queued each time selection is mutated"); |
| |
| promise_test(() => { |
| return (async function() { |
| let selectionChangeCount = 0; |
| document.addEventListener("selectionchange", () => { |
| if (!selectionChangeCount) { |
| getSelection().setPosition(container, 2); |
| getSelection().setPosition(container, 0); |
| } |
| ++selectionChangeCount; |
| }); |
| container.innerHTML = '<b><br></b><b><br></b>'; |
| getSelection().setPosition(container, 0); |
| assert_equals(selectionChangeCount, 0); |
| await new Promise(setTimeout); |
| assert_equals(selectionChangeCount, 1); |
| await new Promise(setTimeout); |
| assert_equals(selectionChangeCount, 2); |
| })(); |
| }, "has scheduled selectionchange event is set to false at the beginning of a task to fire selectionchange event"); |
| |
| </script> |