From 24fb560a9dee974aa2730f43caa54805b681ed41 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 25 Jan 2017 08:55:38 -0800 Subject: [PATCH] Add failing spec for uncaught main process errors --- spec/node-spec.js | 30 ++++++++++++++++++------------ spec/static/main.js | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/spec/node-spec.js b/spec/node-spec.js index e92b2a0d2521..d366a53674a8 100644 --- a/spec/node-spec.js +++ b/spec/node-spec.js @@ -3,7 +3,7 @@ const ChildProcess = require('child_process') const fs = require('fs') const path = require('path') const os = require('os') -const {remote} = require('electron') +const {ipcRenderer, remote} = require('electron') const isCI = remote.getGlobal('isCi') @@ -130,26 +130,32 @@ describe('node feature', function () { }) }) - describe('throw error in node context', function () { - it('gets caught', function (done) { - var error = new Error('boo!') - var lsts = process.listeners('uncaughtException') + describe('error thrown in renderer process node context', function () { + it('gets emitted as an process uncaughtException event', function (done) { + const error = new Error('boo!') + const listeners = process.listeners('uncaughtException') process.removeAllListeners('uncaughtException') - process.on('uncaughtException', function () { - var i, len, lst + process.on('uncaughtException', (thrown) => { + assert.strictEqual(thrown, error) process.removeAllListeners('uncaughtException') - for (i = 0, len = lsts.length; i < len; i++) { - lst = lsts[i] - process.on('uncaughtException', lst) - } + listeners.forEach((listener) => { + process.on('uncaughtException', listener) + }) done() }) - fs.readFile(__filename, function () { + fs.readFile(__filename, () => { throw error }) }) }) + describe('error thrown in main process node context', function () { + it('gets emitted as an process uncaughtException event', function () { + const error = ipcRenderer.sendSync('handle-uncaught-exception', 'hello') + assert.equal(error, 'hello') + }) + }) + describe('setTimeout called under Chromium event loop in browser process', function () { it('can be scheduled in time', function (done) { remote.getGlobal('setTimeout')(done, 0) diff --git a/spec/static/main.js b/spec/static/main.js index eaa5dd0f3059..1454641ed491 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -273,3 +273,18 @@ ipcMain.on('try-emit-web-contents-event', (event, id, eventName) => { listenerCountAfter } }) + +ipcMain.on('handle-uncaught-exception', (event, message) => { + const listeners = process.listeners('uncaughtException') + process.removeAllListeners('uncaughtException') + process.on('uncaughtException', (error) => { + process.removeAllListeners('uncaughtException') + listeners.forEach((listener) => { + process.on('uncaughtException', listener) + }) + event.returnValue = error.message + }) + fs.readFile(__filename, () => { + throw new Error(message) + }) +})