• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals --no-warnings
2'use strict';
3
4const common = require('../common');
5
6const {
7  Event,
8  EventTarget,
9} = require('internal/event_target');
10
11const {
12  strictEqual,
13} = require('assert');
14
15// Manually ported from: wpt@dom/events/AddEventListenerOptions-once.html
16{
17  const document = new EventTarget();
18  let invoked_once = false;
19  let invoked_normal = false;
20  function handler_once() {
21    invoked_once = true;
22  }
23
24  function handler_normal() {
25    invoked_normal = true;
26  }
27
28  document.addEventListener('test', handler_once, { once: true });
29  document.addEventListener('test', handler_normal);
30  document.dispatchEvent(new Event('test'));
31  strictEqual(invoked_once, true, 'Once handler should be invoked');
32  strictEqual(invoked_normal, true, 'Normal handler should be invoked');
33
34  invoked_once = false;
35  invoked_normal = false;
36  document.dispatchEvent(new Event('test'));
37  strictEqual(invoked_once, false, 'Once handler shouldn\'t be invoked again');
38  strictEqual(invoked_normal, true, 'Normal handler should be invoked again');
39  document.removeEventListener('test', handler_normal);
40}
41
42
43{
44  // Manually ported from AddEventListenerOptions-once.html
45  const document = new EventTarget();
46  let invoked_count = 0;
47  function handler() {
48    invoked_count++;
49  }
50  document.addEventListener('test', handler, { once: true });
51  document.addEventListener('test', handler);
52  document.dispatchEvent(new Event('test'));
53  strictEqual(invoked_count, 1, 'The handler should only be added once');
54
55  invoked_count = 0;
56  document.dispatchEvent(new Event('test'));
57  strictEqual(invoked_count, 0, 'The handler was added as a once listener');
58
59  invoked_count = 0;
60  document.addEventListener('test', handler, { once: true });
61  document.removeEventListener('test', handler);
62  document.dispatchEvent(new Event('test'));
63  strictEqual(invoked_count, 0, 'The handler should have been removed');
64}
65
66{
67  // TODO(benjamingr) fix EventTarget recursion
68  common.skip('EventTarget recursion is currently broken');
69  const document = new EventTarget();
70  let invoked_count = 0;
71  function handler() {
72    invoked_count++;
73    if (invoked_count === 1)
74      document.dispatchEvent(new Event('test'));
75  }
76  document.addEventListener('test', handler, { once: true });
77  document.dispatchEvent(new Event('test'));
78  strictEqual(invoked_count, 1, 'Once handler should only be invoked once');
79
80  invoked_count = 0;
81  function handler2() {
82    invoked_count++;
83    if (invoked_count === 1)
84      document.addEventListener('test', handler2, { once: true });
85    if (invoked_count <= 2)
86      document.dispatchEvent(new Event('test'));
87  }
88  document.addEventListener('test', handler2, { once: true });
89  document.dispatchEvent(new Event('test'));
90  strictEqual(invoked_count, 2, 'Once handler should only be invoked once');
91}
92