Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

process: use common operations to define browser globals #26230

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 59 additions & 61 deletions lib/internal/bootstrap/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,34 @@ if (config.hasInspector) {

const browserGlobals = !process._noBrowserGlobals;
if (browserGlobals) {
setupGlobalTimeouts();
setupGlobalConsole();
setupGlobalURL();
setupGlobalEncoding();
// Override global console from the one provided by the VM
// to the one implemented by Node.js
// https://console.spec.whatwg.org/#console-namespace
exposeNamespace(global, 'console', createGlobalConsole(global.console));

const { URL, URLSearchParams } = NativeModule.require('internal/url');
// https://url.spec.whatwg.org/#url
exposeInterface(global, 'URL', URL);
// https://url.spec.whatwg.org/#urlsearchparams
exposeInterface(global, 'URLSearchParams', URLSearchParams);

const { TextEncoder, TextDecoder } = NativeModule.require('util');
// https://encoding.spec.whatwg.org/#textencoder
exposeInterface(global, 'TextEncoder', TextEncoder);
// https://encoding.spec.whatwg.org/#textdecoder
exposeInterface(global, 'TextDecoder', TextDecoder);

// https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
const timers = NativeModule.require('timers');
defineOperation(global, 'clearInterval', timers.clearInterval);
defineOperation(global, 'clearTimeout', timers.clearTimeout);
defineOperation(global, 'setInterval', timers.setInterval);
defineOperation(global, 'setTimeout', timers.setTimeout);
setupQueueMicrotask();

// Non-standard extensions:
defineOperation(global, 'clearImmediate', timers.clearImmediate);
defineOperation(global, 'setImmediate', timers.setImmediate);
}

setupDOMException();
Expand Down Expand Up @@ -409,29 +432,9 @@ function setupBuffer() {
});
}

function setupGlobalTimeouts() {
const timers = NativeModule.require('timers');
global.clearImmediate = timers.clearImmediate;
global.clearInterval = timers.clearInterval;
global.clearTimeout = timers.clearTimeout;
global.setImmediate = timers.setImmediate;
global.setInterval = timers.setInterval;
global.setTimeout = timers.setTimeout;
}

function setupGlobalConsole() {
const consoleFromVM = global.console;
function createGlobalConsole(consoleFromVM) {
const consoleFromNode =
NativeModule.require('internal/console/global');
// Override global console from the one provided by the VM
// to the one implemented by Node.js
Object.defineProperty(global, 'console', {
configurable: true,
enumerable: false,
value: consoleFromNode,
writable: true
});

if (config.hasInspector) {
const inspector = NativeModule.require('internal/util/inspector');
// This will be exposed by `require('inspector').console` later.
Expand All @@ -443,42 +446,7 @@ function setupGlobalConsole() {
// Setup inspector command line API.
setConsoleExtensionInstaller(inspector.installConsoleExtensions);
}
}

function setupGlobalURL() {
const { URL, URLSearchParams } = NativeModule.require('internal/url');
Object.defineProperties(global, {
URL: {
value: URL,
writable: true,
configurable: true,
enumerable: false
},
URLSearchParams: {
value: URLSearchParams,
writable: true,
configurable: true,
enumerable: false
}
});
}

function setupGlobalEncoding() {
const { TextEncoder, TextDecoder } = NativeModule.require('util');
Object.defineProperties(global, {
TextEncoder: {
value: TextEncoder,
writable: true,
configurable: true,
enumerable: false
},
TextDecoder: {
value: TextDecoder,
writable: true,
configurable: true,
enumerable: false
}
});
return consoleFromNode;
}

function setupQueueMicrotask() {
Expand Down Expand Up @@ -516,3 +484,33 @@ function setupDOMException() {
const { registerDOMException } = internalBinding('messaging');
registerDOMException(DOMException);
}

// https://heycam.github.io/webidl/#es-namespaces
function exposeNamespace(target, name, namespaceObject) {
Object.defineProperty(target, name, {
writable: true,
enumerable: false,
configurable: true,
value: namespaceObject
});
}

// https://heycam.github.io/webidl/#es-interfaces
function exposeInterface(target, name, interfaceObject) {
Object.defineProperty(target, name, {
writable: true,
enumerable: false,
configurable: true,
value: interfaceObject
});
}

// https://heycam.github.io/webidl/#define-the-operations
function defineOperation(target, name, method) {
Object.defineProperty(target, name, {
writable: true,
enumerable: true,
configurable: true,
value: method
});
}