From d91520724cb68bb2810c1fa86f34ad0cee5968c0 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Thu, 21 Feb 2019 12:37:45 +0800 Subject: [PATCH] process: use common operations to define browser globals Extracts: - `exposeNamespace`: https://heycam.github.io/webidl/#es-namespaces - `exposeInterface`: https://heycam.github.io/webidl/#es-interfaces - `defineOperation`: https://heycam.github.io/webidl/#define-the-operations into functions to define browser globals. PR-URL: https://github.com/nodejs/node/pull/26230 Reviewed-By: James M Snell Reviewed-By: Gus Caplan Reviewed-By: Ruben Bridgewater Reviewed-By: Colin Ihrig --- lib/internal/bootstrap/node.js | 120 ++++++++++++++++----------------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index be57c6c874bc26..a198674c139e9b 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -182,11 +182,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(); @@ -404,29 +427,9 @@ function setupBuffer() { global.Buffer = Buffer; } -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. @@ -438,42 +441,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() { @@ -513,3 +481,33 @@ function setupDOMException() { } function noop() {} + +// 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 + }); +}