Browse Source

feat: support `node:` prefixed requires in sandboxed renderer preloads (#38729)

feat: support node: prefixed requires in sandboxed renderer preloads

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Milan Burda <[email protected]>
trop[bot] 1 year ago
parent
commit
70fe0d9a07

+ 6 - 0
docs/tutorial/sandbox.md

@@ -51,6 +51,12 @@ but can only import a subset of Electron and Node's built-in modules:
 * [`timers`](https://nodejs.org/api/timers.html)
 * [`url`](https://nodejs.org/api/url.html)
 
+[node: imports](https://nodejs.org/api/esm.html#node-imports) are supported as well:
+
+* [`node:events`](https://nodejs.org/api/events.html)
+* [`node:timers`](https://nodejs.org/api/timers.html)
+* [`node:url`](https://nodejs.org/api/url.html)
+
 In addition, the preload script also polyfills certain Node.js primitives as globals:
 
 * [`Buffer`](https://nodejs.org/api/buffer.html)

+ 5 - 2
lib/sandboxed_renderer/init.ts

@@ -33,12 +33,15 @@ const loadedModules = new Map<string, any>([
   ['electron', electron],
   ['electron/common', electron],
   ['electron/renderer', electron],
-  ['events', events]
+  ['events', events],
+  ['node:events', events]
 ]);
 
 const loadableModules = new Map<string, Function>([
   ['timers', () => require('timers')],
-  ['url', () => require('url')]
+  ['node:timers', () => require('timers')],
+  ['url', () => require('url')],
+  ['node:url', () => require('url')]
 ]);
 
 // Pass different process object to the preload script.

+ 3 - 0
spec/api-browser-window-spec.ts

@@ -3715,6 +3715,9 @@ describe('BrowserWindow module', () => {
         expect(test.version).to.equal(process.version);
         expect(test.versions).to.deep.equal(process.versions);
         expect(test.contextId).to.be.a('string');
+        expect(test.nodeEvents).to.equal(true);
+        expect(test.nodeTimers).to.equal(true);
+        expect(test.nodeUrl).to.equal(true);
 
         if (process.platform === 'linux' && test.osSandbox) {
           expect(test.creationTime).to.be.null('creation time');

+ 3 - 0
spec/fixtures/module/preload-sandbox.js

@@ -34,6 +34,9 @@
         cpuUsage: invoke(() => process.getCPUUsage()),
         ioCounters: invoke(() => process.getIOCounters()),
         uptime: invoke(() => process.uptime()),
+        nodeEvents: invoke(() => require('events') === require('node:events')),
+        nodeTimers: invoke(() => require('timers') === require('node:timers')),
+        nodeUrl: invoke(() => require('url') === require('node:url')),
         env: process.env,
         execPath: process.execPath,
         pid: process.pid,