mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
lib: add EventTarget-related browser globals
Add - Event - EventTarget - MessagePort - MessageChannel - MessageEvent to the set of global objects, since they are available now and behave like they do in the browser. Fixes: https://github.com/nodejs/node/issues/35495 PR-URL: https://github.com/nodejs/node/pull/35496 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Shelley Vohr <codebytere@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com> Reviewed-By: Khaidi Chu <i@2333.moe>
This commit is contained in:
committed by
Node.js GitHub Bot
parent
705d888387
commit
eee522ac29
@@ -287,6 +287,11 @@ module.exports = {
|
||||
BigInt: 'readable',
|
||||
BigInt64Array: 'readable',
|
||||
BigUint64Array: 'readable',
|
||||
Event: 'readable',
|
||||
EventTarget: 'readable',
|
||||
MessageChannel: 'readable',
|
||||
MessageEvent: 'readable',
|
||||
MessagePort: 'readable',
|
||||
TextEncoder: 'readable',
|
||||
TextDecoder: 'readable',
|
||||
queueMicrotask: 'readable',
|
||||
|
||||
@@ -1069,9 +1069,15 @@ const ac = new AbortController();
|
||||
process.nextTick(() => ac.abort());
|
||||
```
|
||||
|
||||
<a id="event-target-and-event-api"></a>
|
||||
## `EventTarget` and `Event` API
|
||||
<!-- YAML
|
||||
added: v14.5.0
|
||||
changes:
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/35496
|
||||
description:
|
||||
The `EventTarget` and `Event` classes are now available as globals.
|
||||
-->
|
||||
|
||||
> Stability: 1 - Experimental
|
||||
@@ -1082,7 +1088,7 @@ Neither the `EventTarget` nor `Event` classes are available for end
|
||||
user code to create.
|
||||
|
||||
```js
|
||||
const target = getEventTargetSomehow();
|
||||
const target = new EventTarget();
|
||||
|
||||
target.addEventListener('foo', (event) => {
|
||||
console.log('foo event happened!');
|
||||
@@ -1168,7 +1174,7 @@ const handler4 = {
|
||||
}
|
||||
};
|
||||
|
||||
const target = getEventTargetSomehow();
|
||||
const target = new EventTarget();
|
||||
|
||||
target.addEventListener('foo', handler1);
|
||||
target.addEventListener('foo', handler2);
|
||||
@@ -1189,6 +1195,10 @@ The `EventTarget` does not implement any special default handling for
|
||||
### Class: `Event`
|
||||
<!-- YAML
|
||||
added: v14.5.0
|
||||
changes:
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/35496
|
||||
description: The `Event` class is now available through the global object.
|
||||
-->
|
||||
|
||||
The `Event` object is an adaptation of the [`Event` Web API][]. Instances
|
||||
@@ -1341,6 +1351,11 @@ The event type identifier.
|
||||
### Class: `EventTarget`
|
||||
<!-- YAML
|
||||
added: v14.5.0
|
||||
changes:
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/35496
|
||||
description:
|
||||
The `EventTarget` class is now available through the global object.
|
||||
-->
|
||||
|
||||
#### `eventTarget.addEventListener(type, listener[, options])`
|
||||
@@ -1374,7 +1389,7 @@ a `listener`. Any individual `listener` may be added once with
|
||||
```js
|
||||
function handler(event) {}
|
||||
|
||||
const target = getEventTargetSomehow();
|
||||
const target = new EventTarget();
|
||||
target.addEventListener('foo', handler, { capture: true }); // first
|
||||
target.addEventListener('foo', handler, { capture: false }); // second
|
||||
|
||||
|
||||
@@ -169,6 +169,30 @@ added: v0.1.100
|
||||
|
||||
Used to print to stdout and stderr. See the [`console`][] section.
|
||||
|
||||
## `Event`
|
||||
<!-- YAML
|
||||
added: REPLACEME
|
||||
-->
|
||||
|
||||
<!-- type=global -->
|
||||
|
||||
> Stability: 1 - Experimental
|
||||
|
||||
A browser-compatible implementation of the `Event` class. See
|
||||
[`EventTarget` and `Event` API][] for more details.
|
||||
|
||||
## `EventTarget`
|
||||
<!-- YAML
|
||||
added: REPLACEME
|
||||
-->
|
||||
|
||||
<!-- type=global -->
|
||||
|
||||
> Stability: 1 - Experimental
|
||||
|
||||
A browser-compatible implementation of the `EventTarget` class. See
|
||||
[`EventTarget` and `Event` API][] for more details.
|
||||
|
||||
## `exports`
|
||||
|
||||
This variable may appear to be global but is not. See [`exports`][].
|
||||
@@ -187,6 +211,33 @@ within the browser `var something` will define a new global variable. In
|
||||
Node.js this is different. The top-level scope is not the global scope;
|
||||
`var something` inside a Node.js module will be local to that module.
|
||||
|
||||
## `MessageChannel`
|
||||
<!-- YAML
|
||||
added: REPLACEME
|
||||
-->
|
||||
|
||||
<!-- type=global -->
|
||||
|
||||
The `MessageChannel` class. See [`MessageChannel`][] for more details.
|
||||
|
||||
## `MessageEvent`
|
||||
<!-- YAML
|
||||
added: REPLACEME
|
||||
-->
|
||||
|
||||
<!-- type=global -->
|
||||
|
||||
The `MessageEvent` class. See [`MessageEvent`][] for more details.
|
||||
|
||||
## `MessagePort`
|
||||
<!-- YAML
|
||||
added: REPLACEME
|
||||
-->
|
||||
|
||||
<!-- type=global -->
|
||||
|
||||
The `MessagePort` class. See [`MessagePort`][] for more details.
|
||||
|
||||
## `module`
|
||||
|
||||
This variable may appear to be global but is not. See [`module`][].
|
||||
@@ -322,6 +373,10 @@ The object that acts as the namespace for all W3C
|
||||
[Mozilla Developer Network][webassembly-mdn] for usage and compatibility.
|
||||
|
||||
[`AbortController`]: https://developer.mozilla.org/en-US/docs/Web/API/AbortController
|
||||
[`EventTarget` and `Event` API]: events.md#event-target-and-event-api
|
||||
[`MessageChannel`]: worker_threads.md#worker_threads_class_messagechannel
|
||||
[`MessageEvent`]: https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/MessageEvent
|
||||
[`MessagePort`]: worker_threads.md#worker_threads_class_messageport
|
||||
[`TextDecoder`]: util.md#util_class_util_textdecoder
|
||||
[`TextEncoder`]: util.md#util_class_util_textencoder
|
||||
[`URLSearchParams`]: url.md#url_class_urlsearchparams
|
||||
|
||||
@@ -140,6 +140,21 @@ if (!config.noBrowserGlobals) {
|
||||
exposeInterface(global, 'AbortController', AbortController);
|
||||
exposeInterface(global, 'AbortSignal', AbortSignal);
|
||||
|
||||
const {
|
||||
EventTarget,
|
||||
Event,
|
||||
} = require('internal/event_target');
|
||||
exposeInterface(global, 'EventTarget', EventTarget);
|
||||
exposeInterface(global, 'Event', Event);
|
||||
const {
|
||||
MessageChannel,
|
||||
MessagePort,
|
||||
MessageEvent,
|
||||
} = require('internal/worker/io');
|
||||
exposeInterface(global, 'MessageChannel', MessageChannel);
|
||||
exposeInterface(global, 'MessagePort', MessagePort);
|
||||
exposeInterface(global, 'MessageEvent', MessageEvent);
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
|
||||
const timers = require('timers');
|
||||
defineOperation(global, 'clearInterval', timers.clearInterval);
|
||||
|
||||
@@ -64,7 +64,8 @@ class ExternalReferenceRegistry {
|
||||
V(string_decoder) \
|
||||
V(trace_events) \
|
||||
V(timers) \
|
||||
V(types)
|
||||
V(types) \
|
||||
V(worker)
|
||||
|
||||
#if NODE_HAVE_I18N_SUPPORT
|
||||
#define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) V(icu)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "debug_utils-inl.h"
|
||||
#include "memory_tracker-inl.h"
|
||||
#include "node_errors.h"
|
||||
#include "node_external_reference.h"
|
||||
#include "node_buffer.h"
|
||||
#include "node_options-inl.h"
|
||||
#include "node_perf.h"
|
||||
@@ -860,9 +861,20 @@ void InitWorker(Local<Object> target,
|
||||
NODE_DEFINE_CONSTANT(target, kTotalResourceLimitCount);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
|
||||
registry->Register(GetEnvMessagePort);
|
||||
registry->Register(Worker::New);
|
||||
registry->Register(Worker::StartThread);
|
||||
registry->Register(Worker::StopThread);
|
||||
registry->Register(Worker::Ref);
|
||||
registry->Register(Worker::Unref);
|
||||
registry->Register(Worker::GetResourceLimits);
|
||||
registry->Register(Worker::TakeHeapSnapshot);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
} // namespace worker
|
||||
} // namespace node
|
||||
|
||||
NODE_MODULE_CONTEXT_AWARE_INTERNAL(worker, node::worker::InitWorker)
|
||||
NODE_MODULE_EXTERNAL_REFERENCE(worker, node::worker::RegisterExternalReferences)
|
||||
|
||||
@@ -31,6 +31,7 @@ const expectedModules = new Set([
|
||||
'Internal Binding types',
|
||||
'Internal Binding url',
|
||||
'Internal Binding util',
|
||||
'Internal Binding worker',
|
||||
'NativeModule buffer',
|
||||
'NativeModule events',
|
||||
'NativeModule fs',
|
||||
@@ -76,6 +77,17 @@ const expectedModules = new Set([
|
||||
'NativeModule internal/process/warning',
|
||||
'NativeModule internal/querystring',
|
||||
'NativeModule internal/source_map/source_map_cache',
|
||||
'NativeModule internal/streams/buffer_list',
|
||||
'NativeModule internal/streams/destroy',
|
||||
'NativeModule internal/streams/duplex',
|
||||
'NativeModule internal/streams/end-of-stream',
|
||||
'NativeModule internal/streams/legacy',
|
||||
'NativeModule internal/streams/passthrough',
|
||||
'NativeModule internal/streams/pipeline',
|
||||
'NativeModule internal/streams/readable',
|
||||
'NativeModule internal/streams/state',
|
||||
'NativeModule internal/streams/transform',
|
||||
'NativeModule internal/streams/writable',
|
||||
'NativeModule internal/timers',
|
||||
'NativeModule internal/url',
|
||||
'NativeModule internal/util',
|
||||
@@ -84,8 +96,10 @@ const expectedModules = new Set([
|
||||
'NativeModule internal/util/types',
|
||||
'NativeModule internal/validators',
|
||||
'NativeModule internal/vm/module',
|
||||
'NativeModule internal/worker/io',
|
||||
'NativeModule internal/worker/js_transferable',
|
||||
'NativeModule path',
|
||||
'NativeModule stream',
|
||||
'NativeModule timers',
|
||||
'NativeModule url',
|
||||
'NativeModule util',
|
||||
|
||||
@@ -5,9 +5,7 @@ const common = require('../common');
|
||||
const assert = require('assert');
|
||||
const { on, EventEmitter } = require('events');
|
||||
const {
|
||||
EventTarget,
|
||||
NodeEventTarget,
|
||||
Event
|
||||
NodeEventTarget
|
||||
} = require('internal/event_target');
|
||||
|
||||
async function basic() {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
'use strict';
|
||||
// Flags: --expose-internals --no-warnings
|
||||
// Flags: --no-warnings
|
||||
|
||||
const common = require('../common');
|
||||
const { once, EventEmitter } = require('events');
|
||||
@@ -9,7 +9,6 @@ const {
|
||||
fail,
|
||||
rejects,
|
||||
} = require('assert');
|
||||
const { EventTarget, Event } = require('internal/event_target');
|
||||
|
||||
async function onceAnEvent() {
|
||||
const ee = new EventEmitter();
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
// Flags: --expose-internals
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
|
||||
const {
|
||||
Event,
|
||||
EventTarget,
|
||||
} = require('internal/event_target');
|
||||
|
||||
const {
|
||||
fail,
|
||||
ok,
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
// Flags: --expose-internals
|
||||
'use strict';
|
||||
require('../common');
|
||||
const assert = require('assert');
|
||||
const { MessageEvent, MessageChannel } = require('internal/worker/io');
|
||||
|
||||
const dummyPort = new MessageChannel().port1;
|
||||
|
||||
@@ -90,3 +88,7 @@ const dummyPort = new MessageChannel().port1;
|
||||
message: /The "init\.ports\[0\]" property must be an instance of MessagePort/,
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
assert(new MessageEvent('message') instanceof Event);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user