1<!DOCTYPE html>
2<title>Default passive event listeners on window, document, document element, body</title>
3<link rel="help" href="https://dom.spec.whatwg.org/#default-passive-value">
4<script src="/resources/testharness.js"></script>
5<script src="/resources/testharnessreport.js"></script>
6<body>
7  <div id="div"></div>
8<script>
9  function isListenerPassive(eventName, eventTarget, passive, expectPassive) {
10    test(() => {
11      let defaultPrevented = null;
12      let handler = event => {
13        event.preventDefault();
14        defaultPrevented = event.defaultPrevented;
15        eventTarget.removeEventListener(eventName, handler);
16      };
17      if (passive === 'omitted') {
18        eventTarget.addEventListener(eventName, handler);
19      } else {
20        eventTarget.addEventListener(eventName, handler, {passive});
21      }
22      let dispatchEventReturnValue = eventTarget.dispatchEvent(new Event(eventName, {cancelable: true}));
23      assert_equals(defaultPrevented, !expectPassive, 'defaultPrevented');
24      assert_equals(dispatchEventReturnValue, expectPassive, 'dispatchEvent() return value');
25    }, `${eventName} listener is ${expectPassive ? '' : 'non-'}passive ${passive === 'omitted' ? 'by default' : `with {passive:${passive}}`} for ${eventTarget.constructor.name}`);
26  }
27
28  const eventNames = {
29    touchstart: true,
30    touchmove: true,
31    wheel: true,
32    mousewheel: true,
33    touchend: false
34  };
35  const passiveEventTargets = [window, document, document.documentElement, document.body];
36  const div = document.getElementById('div');
37
38  for (const eventName in eventNames) {
39    for (const eventTarget of passiveEventTargets) {
40      isListenerPassive(eventName, eventTarget, 'omitted', eventNames[eventName]);
41      isListenerPassive(eventName, eventTarget, undefined, eventNames[eventName]);
42      isListenerPassive(eventName, eventTarget, false, false);
43      isListenerPassive(eventName, eventTarget, true, true);
44    }
45    isListenerPassive(eventName, div, 'omitted', false);
46    isListenerPassive(eventName, div, undefined, false);
47    isListenerPassive(eventName, div, false, false);
48    isListenerPassive(eventName, div, true, true);
49  }
50</script>
51