Skip to content

Commit

Permalink
process: use common operations to define browser globals
Browse files Browse the repository at this point in the history
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: #26230
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
joyeecheung authored and addaleax committed Feb 25, 2019
1 parent 99ae021 commit eff9dc5
Showing 1 changed file with 59 additions and 61 deletions.
120 changes: 59 additions & 61 deletions lib/internal/bootstrap/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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.
Expand All @@ -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() {
Expand Down Expand Up @@ -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
});
}

0 comments on commit eff9dc5

Please sign in to comment.