Browse Source

Add failing spec for uncaught main process errors

Kevin Sawicki 8 years ago
parent
commit
24fb560a9d
2 changed files with 33 additions and 12 deletions
  1. 18 12
      spec/node-spec.js
  2. 15 0
      spec/static/main.js

+ 18 - 12
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)

+ 15 - 0
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)
+  })
+})