| 
 | 1 | +// Flags: --expose-internals --no-warnings  | 
 | 2 | +'use strict';  | 
 | 3 | + | 
 | 4 | +const common = require('../common');  | 
 | 5 | + | 
 | 6 | +const {  | 
 | 7 | +  Event,  | 
 | 8 | +  EventTarget,  | 
 | 9 | +} = require('internal/event_target');  | 
 | 10 | + | 
 | 11 | +const {  | 
 | 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 | +}  | 
0 commit comments