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