| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 76332a0 commit a7d0c76
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -172,6 +172,14 @@ ObjectDefineProperty(Event.prototype, SymbolToStringTag, { | |||
| 172 | 172 | value: 'Event', | |
| 173 | 173 | }); | |
| 174 | 174 | ||
| 175 | + class NodeCustomEvent extends Event { | ||
| 176 | + constructor(type, options) { | ||
| 177 | + super(type, options); | ||
| 178 | + if (options && options.detail) { | ||
| 179 | + this.detail = options.detail; | ||
| 180 | + } | ||
| 181 | + } | ||
| 182 | + } | ||
| 175 | 183 | // The listeners for an EventTarget are maintained as a linked list. | |
| 176 | 184 | // Unfortunately, the way EventTarget is defined, listeners are accounted | |
| 177 | 185 | // using the tuple [handler,capture], and even if we don't actually make | |
@@ -377,6 +385,9 @@ class EventTarget { | |||
| 377 | 385 | event[kTarget] = undefined; | |
| 378 | 386 | } | |
| 379 | 387 | ||
| 388 | + [kCreateEvent](nodeValue, type) { | ||
| 389 | + return new NodeCustomEvent(type, { detail: nodeValue }); | ||
| 390 | + } | ||
| 380 | 391 | [customInspectSymbol](depth, options) { | |
| 381 | 392 | const name = this.constructor.name; | |
| 382 | 393 | if (depth < 0) | |
@@ -474,6 +485,14 @@ class NodeEventTarget extends EventTarget { | |||
| 474 | 485 | this.addEventListener(type, listener, { [kIsNodeStyleListener]: true }); | |
| 475 | 486 | return this; | |
| 476 | 487 | } | |
| 488 | + emit(type, arg) { | ||
| 489 | + if (typeof type !== 'string') { | ||
| 490 | + throw new ERR_INVALID_ARG_TYPE('type', 'string', type); | ||
| 491 | + } | ||
| 492 | + const hadListeners = this.listenerCount(type) > 0; | ||
| 493 | + this[kHybridDispatch](arg, type); | ||
| 494 | + return hadListeners; | ||
| 495 | + } | ||
| 477 | 496 | ||
| 478 | 497 | once(type, listener) { | |
| 479 | 498 | this.addEventListener(type, listener, | |
@@ -502,6 +521,7 @@ ObjectDefineProperties(NodeEventTarget.prototype, { | |||
| 502 | 521 | on: { enumerable: true }, | |
| 503 | 522 | addListener: { enumerable: true }, | |
| 504 | 523 | once: { enumerable: true }, | |
| 524 | + emit: { enumerable: true }, | ||
| 505 | 525 | removeAllListeners: { enumerable: true }, | |
| 506 | 526 | }); | |
| 507 | 527 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -127,11 +127,15 @@ ObjectDefineProperties(MessageEvent.prototype, { | |||
| 127 | 127 | }, | |
| 128 | 128 | }); | |
| 129 | 129 | ||
| 130 | + const originalCreateEvent = EventTarget.prototype[kCreateEvent]; | ||
| 130 | 131 | ObjectDefineProperty( | |
| 131 | 132 | MessagePort.prototype, | |
| 132 | 133 | kCreateEvent, | |
| 133 | 134 | { | |
| 134 | 135 | value: function(data, type) { | |
| 136 | + if (type !== 'message' && type !== 'messageerror') { | ||
| 137 | + return originalCreateEvent.call(this, data, type); | ||
| 138 | + } | ||
| 135 | 139 | return new MessageEvent(type, { data }); | |
| 136 | 140 | }, | |
| 137 | 141 | configurable: false, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -11,6 +11,7 @@ const { | |||
| 11 | 11 | deepStrictEqual, | |
| 12 | 12 | ok, | |
| 13 | 13 | strictEqual, | |
| 14 | + throws, | ||
| 14 | 15 | } = require('assert'); | |
| 15 | 16 | ||
| 16 | 17 | const { on } = require('events'); | |
@@ -145,6 +146,27 @@ const { on } = require('events'); | |||
| 145 | 146 | target.on('foo', () => {}); | |
| 146 | 147 | target.on('foo', () => {}); | |
| 147 | 148 | } | |
| 149 | + { | ||
| 150 | + // Test NodeEventTarget emit | ||
| 151 | + const emitter = new NodeEventTarget(); | ||
| 152 | + emitter.addEventListener('foo', common.mustCall((e) => { | ||
| 153 | + strictEqual(e.type, 'foo'); | ||
| 154 | + strictEqual(e.detail, 'bar'); | ||
| 155 | + ok(e instanceof Event); | ||
| 156 | + }), { once: true }); | ||
| 157 | + emitter.once('foo', common.mustCall((e, droppedAdditionalArgument) => { | ||
| 158 | + strictEqual(e, 'bar'); | ||
| 159 | + strictEqual(droppedAdditionalArgument, undefined); | ||
| 160 | + })); | ||
| 161 | + emitter.emit('foo', 'bar', 'baz'); | ||
| 162 | + } | ||
| 163 | + { | ||
| 164 | + // Test NodeEventTarget emit unsupported usage | ||
| 165 | + const emitter = new NodeEventTarget(); | ||
| 166 | + throws(() => { | ||
| 167 | + emitter.emit(); | ||
| 168 | + }, /ERR_INVALID_ARG_TYPE/); | ||
| 169 | + } | ||
| 148 | 170 | ||
| 149 | 171 | (async () => { | |
| 150 | 172 | // test NodeEventTarget async-iterability | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -16,7 +16,18 @@ const { MessageChannel, MessagePort } = require('worker_threads'); | |||
| 16 | 16 | port2.close(common.mustCall()); | |
| 17 | 17 | })); | |
| 18 | 18 | } | |
| 19 | - | ||
| 19 | + { | ||
| 20 | + // Test emitting non-message events on a port | ||
| 21 | + const { port2 } = new MessageChannel(); | ||
| 22 | + port2.addEventListener('foo', common.mustCall((received) => { | ||
| 23 | + assert.strictEqual(received.type, 'foo'); | ||
| 24 | + assert.strictEqual(received.detail, 'bar'); | ||
| 25 | + })); | ||
| 26 | + port2.on('foo', common.mustCall((received) => { | ||
| 27 | + assert.strictEqual(received, 'bar'); | ||
| 28 | + })); | ||
| 29 | + port2.emit('foo', 'bar'); | ||
| 30 | + } | ||
| 20 | 31 | { | |
| 21 | 32 | const { port1, port2 } = new MessageChannel(); | |
| 22 | 33 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments