handle remote exception (#12694)

* add cause property to exception in callFunction

* update exceptionToMeta function

* add sender argument
* and cause property to return value

* update exception convert in metaToValue function

* add from and cause properties to the exception error

* unit test for remote exception
This commit is contained in:
Tatsuya Hiroishi 2018-04-24 21:40:19 +09:00 committed by Shelley Vohr
parent 2579071b98
commit 9c65abd746
4 changed files with 54 additions and 17 deletions

View file

@ -131,11 +131,12 @@ const plainObjectToMeta = function (obj) {
}
// Convert Error into meta data.
const exceptionToMeta = function (error) {
const exceptionToMeta = function (sender, error) {
return {
type: 'exception',
message: error.message,
stack: error.stack || error
stack: error.stack || error,
cause: valueToMeta(sender, error.cause)
}
}
@ -236,7 +237,7 @@ const unwrapArgs = function (sender, args) {
// Call a function and send reply asynchronously if it's a an asynchronous
// style function and the caller didn't pass a callback.
const callFunction = function (event, func, caller, args) {
let funcMarkedAsync, funcName, funcPassedCallback, ref, ret
let err, funcMarkedAsync, funcName, funcPassedCallback, ref, ret
funcMarkedAsync = v8Util.getHiddenValue(func, 'asynchronous')
funcPassedCallback = typeof args[args.length - 1] === 'function'
try {
@ -254,7 +255,9 @@ const callFunction = function (event, func, caller, args) {
// them with the function name so it's easier to trace things like
// `Error processing argument -1.`
funcName = ((ref = func.name) != null) ? ref : 'anonymous'
throw new Error(`Could not call remote function '${funcName}'. Check that the function signature is correct. Underlying error: ${error.message}`)
err = new Error(`Could not call remote function '${funcName}'. Check that the function signature is correct. Underlying error: ${error.message}`)
err.cause = error
throw err
}
}
@ -262,7 +265,7 @@ ipcMain.on('ELECTRON_BROWSER_REQUIRE', function (event, module) {
try {
event.returnValue = valueToMeta(event.sender, process.mainModule.require(module))
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -270,7 +273,7 @@ ipcMain.on('ELECTRON_BROWSER_GET_BUILTIN', function (event, module) {
try {
event.returnValue = valueToMeta(event.sender, electron[module])
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -278,7 +281,7 @@ ipcMain.on('ELECTRON_BROWSER_GLOBAL', function (event, name) {
try {
event.returnValue = valueToMeta(event.sender, global[name])
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -286,7 +289,7 @@ ipcMain.on('ELECTRON_BROWSER_CURRENT_WINDOW', function (event) {
try {
event.returnValue = valueToMeta(event.sender, event.sender.getOwnerBrowserWindow())
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -308,7 +311,7 @@ ipcMain.on('ELECTRON_BROWSER_CONSTRUCTOR', function (event, id, args) {
let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))()
event.returnValue = valueToMeta(event.sender, obj)
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -323,7 +326,7 @@ ipcMain.on('ELECTRON_BROWSER_FUNCTION_CALL', function (event, id, args) {
callFunction(event, func, global, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -341,7 +344,7 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', function (event, id, method, a
let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))()
event.returnValue = valueToMeta(event.sender, obj)
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -356,7 +359,7 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) {
callFunction(event, obj[method], obj, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -372,7 +375,7 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, args) {
obj[name] = args[0]
event.returnValue = null
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -386,7 +389,7 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_GET', function (event, id, name) {
event.returnValue = valueToMeta(event.sender, obj[name])
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -404,7 +407,7 @@ ipcMain.on('ELECTRON_BROWSER_GUEST_WEB_CONTENTS', function (event, guestInstance
let guestViewManager = require('./guest-view-manager')
event.returnValue = valueToMeta(event.sender, guestViewManager.getGuest(guestInstanceId))
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})
@ -420,7 +423,7 @@ ipcMain.on('ELECTRON_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', function (event, request
}
guest[method].apply(guest, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
event.returnValue = exceptionToMeta(event.sender, error)
}
})