| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 6e21e82 commit bdad1bc
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -13,6 +13,7 @@ const { | |||
| 13 | 13 | Symbol, | |
| 14 | 14 | SymbolFor, | |
| 15 | 15 | SymbolToStringTag, | |
| 16 | + SafeWeakMap, | ||
| 16 | 17 | SafeWeakSet, | |
| 17 | 18 | } = primordials; | |
| 18 | 19 | ||
@@ -576,21 +577,27 @@ function emitUnhandledRejectionOrErr(that, err, event) { | |||
| 576 | 577 | process.emit('error', err, event); | |
| 577 | 578 | } | |
| 578 | 579 | ||
| 580 | + // A map of emitter -> map of name -> handler | ||
| 581 | + const eventHandlerValueMap = new SafeWeakMap(); | ||
| 582 | + | ||
| 579 | 583 | function defineEventHandler(emitter, name) { | |
| 580 | 584 | // 8.1.5.1 Event handlers - basically `on[eventName]` attributes | |
| 581 | - let eventHandlerValue; | ||
| 582 | - Object.defineProperty(emitter, `on${name}`, { | ||
| 585 | + ObjectDefineProperty(emitter, `on${name}`, { | ||
| 583 | 586 | get() { | |
| 584 | - return eventHandlerValue; | ||
| 587 | + return eventHandlerValueMap.get(this)?.get(name); | ||
| 585 | 588 | }, | |
| 586 | 589 | set(value) { | |
| 587 | - if (eventHandlerValue) { | ||
| 588 | - emitter.removeEventListener(name, eventHandlerValue); | ||
| 590 | + const oldValue = eventHandlerValueMap.get(this)?.get(name); | ||
| 591 | + if (oldValue) { | ||
| 592 | + this.removeEventListener(name, oldValue); | ||
| 589 | 593 | } | |
| 590 | 594 | if (typeof value === 'function') { | |
| 591 | - emitter.addEventListener(name, value); | ||
| 595 | + this.addEventListener(name, value); | ||
| 596 | + } | ||
| 597 | + if (!eventHandlerValueMap.has(this)) { | ||
| 598 | + eventHandlerValueMap.set(this, new Map()); | ||
| 592 | 599 | } | |
| 593 | - eventHandlerValue = value; | ||
| 600 | + eventHandlerValueMap.get(this).set(name, value); | ||
| 594 | 601 | }, | |
| 595 | 602 | configurable: true, | |
| 596 | 603 | enumerable: true | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -99,13 +99,14 @@ ObjectDefineProperty( | |||
| 99 | 99 | // This is called from inside the `MessagePort` constructor. | |
| 100 | 100 | function oninit() { | |
| 101 | 101 | initNodeEventTarget(this); | |
| 102 | - // TODO(addaleax): This should be on MessagePort.prototype, but | ||
| 103 | - // defineEventHandler() does not support that. | ||
| 104 | 102 | defineEventHandler(this, 'message'); | |
| 105 | 103 | defineEventHandler(this, 'messageerror'); | |
| 106 | 104 | setupPortReferencing(this, this, 'message'); | |
| 107 | 105 | } | |
| 108 | 106 | ||
| 107 | + defineEventHandler(MessagePort.prototype, 'message'); | ||
| 108 | + defineEventHandler(MessagePort.prototype, 'messageerror'); | ||
| 109 | + | ||
| 109 | 110 | ObjectDefineProperty(MessagePort.prototype, onInitSymbol, { | |
| 110 | 111 | enumerable: true, | |
| 111 | 112 | writable: false, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -165,9 +165,7 @@ const { MessageChannel, MessagePort } = require('worker_threads'); | |||
| 165 | 165 | assert.deepStrictEqual( | |
| 166 | 166 | Object.getOwnPropertyNames(MessagePort.prototype).sort(), | |
| 167 | 167 | [ | |
| 168 | - // TODO(addaleax): This should include onmessage (and eventually | ||
| 169 | - // onmessageerror). | ||
| 170 | - 'close', 'constructor', 'postMessage', 'ref', 'start', | ||
| 171 | - 'unref' | ||
| 168 | + 'close', 'constructor', 'onmessage', 'onmessageerror', 'postMessage', | ||
| 169 | + 'ref', 'start', 'unref' | ||
| 172 | 170 | ]); | |
| 173 | 171 | } | |
| Back | FazBrowse Home | New Git URL |
0 commit comments