Skip to content

Commit

Permalink
events: optimize EventTarget.addEventListener
Browse files Browse the repository at this point in the history
  • Loading branch information
ronag committed Oct 8, 2024
1 parent d2ad9b4 commit 4a4c150
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 26 deletions.
4 changes: 2 additions & 2 deletions benchmark/events/eventtarget-add-remove.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
const common = require('../common.js');

const bench = common.createBenchmark(main, {
n: [1e6],
nListener: [5, 10],
n: [1e5],
nListener: [1, 5, 10],
});

function main({ n, nListener }) {
Expand Down
58 changes: 34 additions & 24 deletions lib/internal/event_target.js
Original file line number Diff line number Diff line change
Expand Up @@ -596,21 +596,6 @@ class EventTarget {
throw new ERR_INVALID_THIS('EventTarget');
if (arguments.length < 2)
throw new ERR_MISSING_ARGS('type', 'listener');

// We validateOptions before the validateListener check because the spec
// requires us to hit getters.
const {
once,
capture,
passive,
signal,
isNodeStyleListener,
weak,
resistStopPropagation,
} = validateEventListenerOptions(options);

validateAbortSignal(signal, 'options.signal');

if (!validateEventListener(listener)) {
// The DOM silently allows passing undefined as a second argument
// No error code for this since it is a Warning
Expand All @@ -623,17 +608,42 @@ class EventTarget {
process.emitWarning(w);
return;
}
type = webidl.converters.DOMString(type);

if (signal) {
if (signal.aborted) {
return;
let once = false
let capture = false
let passive = false
let isNodeStyleListener = false
let weak = false
let resistStopPropagation = false

if (options !== kEmptyObject) {
// We validateOptions before the validateListener check because the spec
// requires us to hit getters.
options = validateEventListenerOptions(options);

once = options.once;
capture = options.capture;
passive = options.passive;
isNodeStyleListener = options.isNodeStyleListener;
weak = options.weak;
resistStopPropagation = falsoptions.resistStopPropagation;

const signal = options.signal;

validateAbortSignal(signal, 'options.signal');

type = webidl.converters.DOMString(type);

if (signal) {
if (signal.aborted) {
return;
}
// TODO(benjamingr) make this weak somehow? ideally the signal would
// not prevent the event target from GC.
signal.addEventListener('abort', () => {
this.removeEventListener(type, listener, options);
}, { __proto__: null, once: true, [kWeakHandler]: this, [kResistStopPropagation]: true });
}
// TODO(benjamingr) make this weak somehow? ideally the signal would
// not prevent the event target from GC.
signal.addEventListener('abort', () => {
this.removeEventListener(type, listener, options);
}, { __proto__: null, once: true, [kWeakHandler]: this, [kResistStopPropagation]: true });
}

let root = this[kEvents].get(type);
Expand Down

0 comments on commit 4a4c150

Please sign in to comment.