From cce3e54ba222ed947874f71ef54959d51f5e3e2d Mon Sep 17 00:00:00 2001 From: Marek Haranczyk Date: Wed, 31 Aug 2022 14:14:42 +0200 Subject: [PATCH 1/2] fix: EventEmitter is missing properties in sandbox preload script. --- package.json | 1 + spec/api-browser-window-spec.ts | 20 ++++++++++++++++++++ spec/fixtures/module/preload-eventemitter.js | 11 +++++++++++ 3 files changed, 32 insertions(+) create mode 100644 spec/fixtures/module/preload-eventemitter.js diff --git a/package.json b/package.json index d6018ac5755d4..f208c6ca9ee15 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-standard": "^4.0.1", "eslint-plugin-typescript": "^0.14.0", + "events": "^3.2.0", "express": "^4.16.4", "folder-hash": "^2.1.1", "fs-extra": "^9.0.1", diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index a925e6bf066d3..5ba398d1cf7f9 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -2970,6 +2970,26 @@ describe('BrowserWindow module', () => { expect(url).to.equal(expectedUrl); }); + it('exposes full EventEmmiter object to preload script', async () => { + const w = new BrowserWindow({ + show: false, + webPreferences: { + sandbox: true, + preload: path.join(fixtures, 'module', 'preload-eventemitter.js') + } + }); + w.loadURL('about:blank'); + const [, rendererEventEmitterProperties] = await emittedOnce(ipcMain, 'answer'); + const { EventEmitter } = require('events'); + const emitter = new EventEmitter(); + let browserEventEmitterProperties = ''; + let currentObj = emitter; + do { + Object.getOwnPropertyNames(currentObj).map(property => { browserEventEmitterProperties += property + ';'; }); + } while ((currentObj = Object.getPrototypeOf(currentObj))); + expect(rendererEventEmitterProperties).to.equal(browserEventEmitterProperties); + }); + it('should open windows in same domain with cross-scripting enabled', async () => { const w = new BrowserWindow({ show: true, diff --git a/spec/fixtures/module/preload-eventemitter.js b/spec/fixtures/module/preload-eventemitter.js new file mode 100644 index 0000000000000..8971dda8829c1 --- /dev/null +++ b/spec/fixtures/module/preload-eventemitter.js @@ -0,0 +1,11 @@ +(function () { + const { EventEmitter } = require('events'); + const emitter = new EventEmitter(); + let rendererEventEmitterProperties = ''; + let currentObj = emitter; + do { + Object.getOwnPropertyNames(currentObj).map(property => { rendererEventEmitterProperties += property + ';'; }); + } while ((currentObj = Object.getPrototypeOf(currentObj))); + const { ipcRenderer } = require('electron'); + ipcRenderer.send('answer', rendererEventEmitterProperties); +})(); From d05d4f7ce9a7073a3b816c4580b10740d8984a8c Mon Sep 17 00:00:00 2001 From: Marek Haranczyk Date: Thu, 15 Sep 2022 15:44:19 +0200 Subject: [PATCH 2/2] fixup! fix: EventEmitter is missing properties in sandbox preload script. --- spec/api-browser-window-spec.ts | 8 ++++---- spec/fixtures/module/preload-eventemitter.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 5ba398d1cf7f9..de2330b923267 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -2970,7 +2970,7 @@ describe('BrowserWindow module', () => { expect(url).to.equal(expectedUrl); }); - it('exposes full EventEmmiter object to preload script', async () => { + it('exposes full EventEmitter object to preload script', async () => { const w = new BrowserWindow({ show: false, webPreferences: { @@ -2982,12 +2982,12 @@ describe('BrowserWindow module', () => { const [, rendererEventEmitterProperties] = await emittedOnce(ipcMain, 'answer'); const { EventEmitter } = require('events'); const emitter = new EventEmitter(); - let browserEventEmitterProperties = ''; + const browserEventEmitterProperties = []; let currentObj = emitter; do { - Object.getOwnPropertyNames(currentObj).map(property => { browserEventEmitterProperties += property + ';'; }); + browserEventEmitterProperties.push(...Object.getOwnPropertyNames(currentObj)); } while ((currentObj = Object.getPrototypeOf(currentObj))); - expect(rendererEventEmitterProperties).to.equal(browserEventEmitterProperties); + expect(rendererEventEmitterProperties).to.deep.equal(browserEventEmitterProperties); }); it('should open windows in same domain with cross-scripting enabled', async () => { diff --git a/spec/fixtures/module/preload-eventemitter.js b/spec/fixtures/module/preload-eventemitter.js index 8971dda8829c1..26b5760de0a48 100644 --- a/spec/fixtures/module/preload-eventemitter.js +++ b/spec/fixtures/module/preload-eventemitter.js @@ -1,10 +1,10 @@ (function () { const { EventEmitter } = require('events'); const emitter = new EventEmitter(); - let rendererEventEmitterProperties = ''; + const rendererEventEmitterProperties = []; let currentObj = emitter; do { - Object.getOwnPropertyNames(currentObj).map(property => { rendererEventEmitterProperties += property + ';'; }); + rendererEventEmitterProperties.push(...Object.getOwnPropertyNames(currentObj)); } while ((currentObj = Object.getPrototypeOf(currentObj))); const { ipcRenderer } = require('electron'); ipcRenderer.send('answer', rendererEventEmitterProperties);