Merge pull request #8003 from electron/missing-remote-object-error

Throw custom error when remote object is missing from registry
This commit is contained in:
Kevin Sawicki 2016-11-17 10:57:03 -08:00 коммит произвёл GitHub
Родитель 3834f0c6a6 5427ec4844
Коммит 28c39d5151
2 изменённых файлов: 34 добавлений и 2 удалений

Просмотреть файл

@ -41,7 +41,8 @@ class ObjectsRegistry {
// Get an object according to its ID.
get (id) {
return this.storage[id].object
const pointer = this.storage[id]
if (pointer != null) return pointer.object
}
// Dereference an object according to its ID.

Просмотреть файл

@ -139,6 +139,13 @@ const exceptionToMeta = function (error) {
}
}
const throwRPCError = function (message) {
const error = new Error(message)
error.code = 'EBADRPC'
error.errno = -72
throw error
}
// Convert array of meta data from renderer into array of real values.
const unwrapArgs = function (sender, args) {
const metaToValue = function (meta) {
@ -277,6 +284,10 @@ ipcMain.on('ELECTRON_BROWSER_CONSTRUCTOR', function (event, id, args) {
args = unwrapArgs(event.sender, args)
let constructor = objectsRegistry.get(id)
if (constructor == null) {
throwRPCError(`Cannot call constructor on missing remote object ${id}`)
}
// Call new with array of arguments.
// http://stackoverflow.com/questions/1606797/use-of-apply-with-new-operator-is-this-possible
let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))()
@ -290,6 +301,11 @@ ipcMain.on('ELECTRON_BROWSER_FUNCTION_CALL', function (event, id, args) {
try {
args = unwrapArgs(event.sender, args)
let func = objectsRegistry.get(id)
if (func == null) {
throwRPCError(`Cannot call function on missing remote object ${id}`)
}
callFunction(event, func, global, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
@ -299,9 +315,14 @@ ipcMain.on('ELECTRON_BROWSER_FUNCTION_CALL', function (event, id, args) {
ipcMain.on('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', function (event, id, method, args) {
try {
args = unwrapArgs(event.sender, args)
let constructor = objectsRegistry.get(id)[method]
let object = objectsRegistry.get(id)
if (object == null) {
throwRPCError(`Cannot call constructor '${method}' on missing remote object ${id}`)
}
// Call new with array of arguments.
let constructor = object[method]
let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))()
event.returnValue = valueToMeta(event.sender, obj)
} catch (error) {
@ -313,6 +334,11 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) {
try {
args = unwrapArgs(event.sender, args)
let obj = objectsRegistry.get(id)
if (obj == null) {
throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`)
}
callFunction(event, obj[method], obj, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
@ -322,6 +348,11 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) {
ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, value) {
try {
let obj = objectsRegistry.get(id)
if (obj == null) {
throwRPCError(`Cannot set property '${name}' on missing remote object ${id}`)
}
obj[name] = value
event.returnValue = null
} catch (error) {