1function raf() {
2  return new Promise((resolve) => {
3    // rAF twice.
4    window.requestAnimationFrame(() => {
5      window.requestAnimationFrame(resolve);
6    });
7  });
8}
9
10async function runTest({target, eventName, passive, expectCancelable}) {
11  await raf();
12
13  let cancelable = null;
14  let arrived = false;
15  target.addEventListener(eventName, function (event) {
16    cancelable = event.cancelable;
17    arrived = true;
18  }, {passive:passive, once:true});
19
20  promise_test(async (t) => {
21    t.add_cleanup(() => {
22      document.querySelector('.remove-on-cleanup')?.remove();
23    });
24    const pos_x = Math.floor(window.innerWidth / 2);
25    const pos_y = Math.floor(window.innerHeight / 2);
26    const delta_x = 0;
27    const delta_y = 100;
28
29    await new test_driver.Actions()
30      .scroll(pos_x, pos_y, delta_x, delta_y).send();
31    await t.step_wait(() => arrived, `Didn't get event ${eventName} on ${target.localName}`);
32    assert_equals(cancelable, expectCancelable);
33  });
34}
35