@@ -34,7 +34,7 @@ const { |
34 | 34 | ERR_INVALID_THIS, |
35 | 35 | } |
36 | 36 | } = require('internal/errors'); |
37 | | -const { validateObject, validateString } = require('internal/validators'); |
| 37 | +const { validateObject, validateString, validateInternalField } = require('internal/validators'); |
38 | 38 |
|
39 | 39 | const { |
40 | 40 | customInspectSymbol, |
@@ -492,6 +492,7 @@ function initEventTarget(self) { |
492 | 492 | self[kEvents] = new SafeMap(); |
493 | 493 | self[kMaxEventTargetListeners] = EventEmitter.defaultMaxListeners; |
494 | 494 | self[kMaxEventTargetListenersWarned] = false; |
| 495 | + self[kHandlers] = new SafeMap(); |
495 | 496 | } |
496 | 497 |
|
497 | 498 | class EventTarget { |
@@ -1021,34 +1022,46 @@ function makeEventHandler(handler) { |
1021 | 1022 |
|
1022 | 1023 | function defineEventHandler(emitter, name) { |
1023 | 1024 | // 8.1.5.1 Event handlers - basically `on[eventName]` attributes |
1024 | | - ObjectDefineProperty(emitter, `on${name}`, { |
| 1025 | + const propName = `on${name}`; |
| 1026 | + function get() { |
| 1027 | + validateInternalField(this, kHandlers, 'EventTarget'); |
| 1028 | + return this[kHandlers]?.get(name)?.handler ?? null; |
| 1029 | + } |
| 1030 | + ObjectDefineProperty(get, 'name', { |
1025 | 1031 | __proto__: null, |
1026 | | - get() { |
1027 | | - return this[kHandlers]?.get(name)?.handler ?? null; |
1028 | | - }, |
1029 | | - set(value) { |
1030 | | - if (!this[kHandlers]) { |
1031 | | - this[kHandlers] = new SafeMap(); |
| 1032 | + value: `get ${propName}`, |
| 1033 | + }); |
| 1034 | + |
| 1035 | + function set(value) { |
| 1036 | + validateInternalField(this, kHandlers, 'EventTarget'); |
| 1037 | + let wrappedHandler = this[kHandlers]?.get(name); |
| 1038 | + if (wrappedHandler) { |
| 1039 | + if (typeof wrappedHandler.handler === 'function') { |
| 1040 | + this[kEvents].get(name).size--; |
| 1041 | + const size = this[kEvents].get(name).size; |
| 1042 | + this[kRemoveListener](size, name, wrappedHandler.handler, false); |
1032 | 1043 | } |
1033 | | - let wrappedHandler = this[kHandlers]?.get(name); |
1034 | | - if (wrappedHandler) { |
1035 | | - if (typeof wrappedHandler.handler === 'function') { |
1036 | | - this[kEvents].get(name).size--; |
1037 | | - const size = this[kEvents].get(name).size; |
1038 | | - this[kRemoveListener](size, name, wrappedHandler.handler, false); |
1039 | | - } |
1040 | | - wrappedHandler.handler = value; |
1041 | | - if (typeof wrappedHandler.handler === 'function') { |
1042 | | - this[kEvents].get(name).size++; |
1043 | | - const size = this[kEvents].get(name).size; |
1044 | | - this[kNewListener](size, name, value, false, false, false, false); |
1045 | | - } |
1046 | | - } else { |
1047 | | - wrappedHandler = makeEventHandler(value); |
1048 | | - this.addEventListener(name, wrappedHandler); |
| 1044 | + wrappedHandler.handler = value; |
| 1045 | + if (typeof wrappedHandler.handler === 'function') { |
| 1046 | + this[kEvents].get(name).size++; |
| 1047 | + const size = this[kEvents].get(name).size; |
| 1048 | + this[kNewListener](size, name, value, false, false, false, false); |
1049 | 1049 | } |
1050 | | - this[kHandlers].set(name, wrappedHandler); |
1051 | | - }, |
| 1050 | + } else { |
| 1051 | + wrappedHandler = makeEventHandler(value); |
| 1052 | + this.addEventListener(name, wrappedHandler); |
| 1053 | + } |
| 1054 | + this[kHandlers].set(name, wrappedHandler); |
| 1055 | + } |
| 1056 | + ObjectDefineProperty(set, 'name', { |
| 1057 | + __proto__: null, |
| 1058 | + value: `set ${propName}`, |
| 1059 | + }); |
| 1060 | + |
| 1061 | + ObjectDefineProperty(emitter, propName, { |
| 1062 | + __proto__: null, |
| 1063 | + get, |
| 1064 | + set, |
1052 | 1065 | configurable: true, |
1053 | 1066 | enumerable: true |
1054 | 1067 | }); |
|