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..de2330b923267 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 EventEmitter 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(); + const browserEventEmitterProperties = []; + let currentObj = emitter; + do { + browserEventEmitterProperties.push(...Object.getOwnPropertyNames(currentObj)); + } while ((currentObj = Object.getPrototypeOf(currentObj))); + expect(rendererEventEmitterProperties).to.deep.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..26b5760de0a48 --- /dev/null +++ b/spec/fixtures/module/preload-eventemitter.js @@ -0,0 +1,11 @@ +(function () { + const { EventEmitter } = require('events'); + const emitter = new EventEmitter(); + const rendererEventEmitterProperties = []; + let currentObj = emitter; + do { + rendererEventEmitterProperties.push(...Object.getOwnPropertyNames(currentObj)); + } while ((currentObj = Object.getPrototypeOf(currentObj))); + const { ipcRenderer } = require('electron'); + ipcRenderer.send('answer', rendererEventEmitterProperties); +})();