X Tutup
Skip to content

Commit 4900923

Browse files
fix: capture the promise global to avoid userland mutation (electron#20925) (electron#20947)
1 parent 976c7d1 commit 4900923

File tree

6 files changed

+40
-2
lines changed

6 files changed

+40
-2
lines changed

build/webpack/webpack.config.base.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ module.exports = ({
7474
global: ['@electron/internal/renderer/webpack-provider', '_global'],
7575
Buffer: ['@electron/internal/renderer/webpack-provider', 'Buffer'],
7676
})
77-
] : [])
77+
] : []),
78+
new webpack.ProvidePlugin({
79+
Promise: ['@electron/internal/common/webpack-globals-provider', 'Promise'],
80+
}),
7881
]
7982
})
80-
}
83+
}

filenames.auto.gni

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ auto_filenames = {
141141
"lib/common/error-utils.ts",
142142
"lib/common/is-promise.ts",
143143
"lib/common/web-view-methods.ts",
144+
"lib/common/webpack-globals-provider.ts",
144145
"lib/renderer/api/context-bridge.ts",
145146
"lib/renderer/api/crash-reporter.js",
146147
"lib/renderer/api/desktop-capturer.ts",
@@ -176,6 +177,7 @@ auto_filenames = {
176177
isolated_bundle_deps = [
177178
"lib/common/electron-binding-setup.ts",
178179
"lib/common/error-utils.ts",
180+
"lib/common/webpack-globals-provider.ts",
179181
"lib/isolated_renderer/init.js",
180182
"lib/renderer/ipc-renderer-internal-utils.ts",
181183
"lib/renderer/ipc-renderer-internal.ts",
@@ -190,6 +192,7 @@ auto_filenames = {
190192
content_script_bundle_deps = [
191193
"lib/common/electron-binding-setup.ts",
192194
"lib/common/error-utils.ts",
195+
"lib/common/webpack-globals-provider.ts",
193196
"lib/content_script/init.js",
194197
"lib/renderer/chrome-api.ts",
195198
"lib/renderer/extensions/event.ts",
@@ -277,6 +280,7 @@ auto_filenames = {
277280
"lib/common/parse-features-string.js",
278281
"lib/common/reset-search-paths.ts",
279282
"lib/common/web-view-methods.ts",
283+
"lib/common/webpack-globals-provider.ts",
280284
"lib/renderer/ipc-renderer-internal-utils.ts",
281285
"lib/renderer/ipc-renderer-internal.ts",
282286
"package.json",
@@ -301,6 +305,7 @@ auto_filenames = {
301305
"lib/common/is-promise.ts",
302306
"lib/common/reset-search-paths.ts",
303307
"lib/common/web-view-methods.ts",
308+
"lib/common/webpack-globals-provider.ts",
304309
"lib/renderer/api/context-bridge.ts",
305310
"lib/renderer/api/crash-reporter.js",
306311
"lib/renderer/api/desktop-capturer.ts",
@@ -351,6 +356,7 @@ auto_filenames = {
351356
"lib/common/init.ts",
352357
"lib/common/is-promise.ts",
353358
"lib/common/reset-search-paths.ts",
359+
"lib/common/webpack-globals-provider.ts",
354360
"lib/renderer/api/context-bridge.ts",
355361
"lib/renderer/api/crash-reporter.js",
356362
"lib/renderer/api/desktop-capturer.ts",

lib/common/asar.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
const path = require('path')
99
const util = require('util')
1010

11+
const Promise = global.Promise
12+
1113
const envNoAsar = process.env.ELECTRON_NO_ASAR &&
1214
process.type !== 'browser' &&
1315
process.type !== 'renderer'
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Captures original globals into a scope to ensure that userland modifications do
2+
// not impact Electron. Note that users doing:
3+
//
4+
// global.Promise.resolve = myFn
5+
//
6+
// Will mutate this captured one as well and that is OK.
7+
8+
export const Promise = global.Promise

spec/api-remote-spec.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,4 +508,22 @@ describe('remote module', () => {
508508
w.loadURL('about:blank')
509509
})
510510
})
511+
512+
describe('with an overriden global Promise constrctor', () => {
513+
let original
514+
515+
before(() => {
516+
original = Promise
517+
})
518+
519+
it('using a promise based method resolves correctly', async () => {
520+
expect(await remote.getGlobal('returnAPromise')(123)).to.equal(123)
521+
global.Promise = { resolve: () => ({}) }
522+
expect(await remote.getGlobal('returnAPromise')(456)).to.equal(456)
523+
})
524+
525+
after(() => {
526+
global.Promise = original
527+
})
528+
})
511529
})

spec/static/main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ ipcMain.on('echo', function (event, msg) {
7272
})
7373

7474
global.setTimeoutPromisified = util.promisify(setTimeout)
75+
global.returnAPromise = (value) => new Promise((resolve) => setTimeout(() => resolve(value), 100))
7576

7677
global.permissionChecks = {
7778
allow: () => electron.session.defaultSession.setPermissionCheckHandler(null),

0 commit comments

Comments
 (0)
X Tutup