Skip to content

Commit 1f7e8d6

Browse files
authored
lib: add ability to add separate event name to defineEventHandler
Adds an optional third argument to `defineEventHandler()` to specify an event name that is separate from the name used for the property. This will be used, for instance, by the quic implementation to support generating the `on...` events where the event name itself is hyphenated. For instance `defineEventHandler(target, 'streamreset', 'stream-reset')` Separated out from #44325 Signed-off-by: James M Snell <[email protected]> PR-URL: #45032 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent 5b316fe commit 1f7e8d6

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

lib/internal/event_target.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -1022,12 +1022,12 @@ function makeEventHandler(handler) {
10221022
return eventHandler;
10231023
}
10241024

1025-
function defineEventHandler(emitter, name) {
1025+
function defineEventHandler(emitter, name, event = name) {
10261026
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
10271027
const propName = `on${name}`;
10281028
function get() {
10291029
validateInternalField(this, kHandlers, 'EventTarget');
1030-
return this[kHandlers]?.get(name)?.handler ?? null;
1030+
return this[kHandlers]?.get(event)?.handler ?? null;
10311031
}
10321032
ObjectDefineProperty(get, 'name', {
10331033
__proto__: null,
@@ -1036,24 +1036,24 @@ function defineEventHandler(emitter, name) {
10361036

10371037
function set(value) {
10381038
validateInternalField(this, kHandlers, 'EventTarget');
1039-
let wrappedHandler = this[kHandlers]?.get(name);
1039+
let wrappedHandler = this[kHandlers]?.get(event);
10401040
if (wrappedHandler) {
10411041
if (typeof wrappedHandler.handler === 'function') {
1042-
this[kEvents].get(name).size--;
1043-
const size = this[kEvents].get(name).size;
1044-
this[kRemoveListener](size, name, wrappedHandler.handler, false);
1042+
this[kEvents].get(event).size--;
1043+
const size = this[kEvents].get(event).size;
1044+
this[kRemoveListener](size, event, wrappedHandler.handler, false);
10451045
}
10461046
wrappedHandler.handler = value;
10471047
if (typeof wrappedHandler.handler === 'function') {
1048-
this[kEvents].get(name).size++;
1049-
const size = this[kEvents].get(name).size;
1050-
this[kNewListener](size, name, value, false, false, false, false);
1048+
this[kEvents].get(event).size++;
1049+
const size = this[kEvents].get(event).size;
1050+
this[kNewListener](size, event, value, false, false, false, false);
10511051
}
10521052
} else {
10531053
wrappedHandler = makeEventHandler(value);
1054-
this.addEventListener(name, wrappedHandler);
1054+
this.addEventListener(event, wrappedHandler);
10551055
}
1056-
this[kHandlers].set(name, wrappedHandler);
1056+
this[kHandlers].set(event, wrappedHandler);
10571057
}
10581058
ObjectDefineProperty(set, 'name', {
10591059
__proto__: null,

test/parallel/test-eventtarget.js

+9
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,15 @@ let asyncTest = Promise.resolve();
614614
target.dispatchEvent(new Event('foo'));
615615
deepStrictEqual(output, [1, 2, 3, 4]);
616616
}
617+
{
618+
const target = new EventTarget();
619+
defineEventHandler(target, 'foo', 'bar');
620+
const output = [];
621+
target.addEventListener('bar', () => output.push(1));
622+
target.onfoo = () => output.push(2);
623+
target.dispatchEvent(new Event('bar'));
624+
deepStrictEqual(output, [1, 2]);
625+
}
617626
{
618627
const et = new EventTarget();
619628
const listener = common.mustNotCall();

0 commit comments

Comments
 (0)