refactor: use error-utils for remote exception serialization / deserialization (#14788)
* refactor: use error-utils for remote exception serialization / deserialization * fix internal process.type in sandboxed renderer
This commit is contained in:
parent
3df739fa89
commit
b499d57cfd
4 changed files with 19 additions and 20 deletions
|
@ -12,6 +12,7 @@ const { ipcMain, isPromise } = electron
|
|||
|
||||
const objectsRegistry = require('@electron/internal/browser/objects-registry')
|
||||
const bufferUtils = require('@electron/internal/common/buffer-utils')
|
||||
const errorUtils = require('@electron/internal/common/error-utils')
|
||||
|
||||
const hasProp = {}.hasOwnProperty
|
||||
|
||||
|
@ -138,9 +139,7 @@ const plainObjectToMeta = function (obj) {
|
|||
const exceptionToMeta = function (sender, contextId, error) {
|
||||
return {
|
||||
type: 'exception',
|
||||
message: error.message,
|
||||
stack: error.stack || error,
|
||||
cause: valueToMeta(sender, contextId, error.cause)
|
||||
value: errorUtils.serialize(error)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,10 +11,12 @@ const constructors = new Map([
|
|||
])
|
||||
|
||||
exports.deserialize = function (error) {
|
||||
if (error.__ELECTRON_SERIALIZED_ERROR__ && constructors.has(error.name)) {
|
||||
if (error && error.__ELECTRON_SERIALIZED_ERROR__ && constructors.has(error.name)) {
|
||||
const constructor = constructors.get(error.name)
|
||||
const deserializedError = new constructor(error.message)
|
||||
deserializedError.stack = error.stack
|
||||
deserializedError.from = error.from
|
||||
deserializedError.cause = exports.deserialize(error.cause)
|
||||
return deserializedError
|
||||
}
|
||||
return error
|
||||
|
@ -28,6 +30,8 @@ exports.serialize = function (error) {
|
|||
message: error.message,
|
||||
stack: error.stack,
|
||||
name: error.name,
|
||||
from: process.type,
|
||||
cause: exports.serialize(error.cause),
|
||||
__ELECTRON_SERIALIZED_ERROR__: true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ const resolvePromise = Promise.resolve.bind(Promise)
|
|||
|
||||
const CallbacksRegistry = require('@electron/internal/renderer/callbacks-registry')
|
||||
const bufferUtils = require('@electron/internal/common/buffer-utils')
|
||||
const errorUtils = require('@electron/internal/common/error-utils')
|
||||
|
||||
const callbacksRegistry = new CallbacksRegistry()
|
||||
const remoteObjectCache = v8Util.createIDWeakMap()
|
||||
|
@ -217,7 +218,7 @@ function metaToValue (meta) {
|
|||
promise: () => resolvePromise({ then: metaToValue(meta.then) }),
|
||||
error: () => metaToPlainObject(meta),
|
||||
date: () => new Date(meta.value),
|
||||
exception: () => { throw metaToException(meta) }
|
||||
exception: () => { throw errorUtils.deserialize(meta.value) }
|
||||
}
|
||||
|
||||
if (meta.type in types) {
|
||||
|
@ -267,15 +268,6 @@ function metaToPlainObject (meta) {
|
|||
return obj
|
||||
}
|
||||
|
||||
// Construct an exception error from the meta.
|
||||
function metaToException (meta) {
|
||||
const error = new Error(`${meta.message}\n${meta.stack}`)
|
||||
const remoteProcess = exports.process
|
||||
error.from = remoteProcess ? remoteProcess.type : null
|
||||
error.cause = metaToValue(meta.cause)
|
||||
return error
|
||||
}
|
||||
|
||||
function handleMessage (channel, handler) {
|
||||
ipcRenderer.on(channel, (event, passedContextId, ...args) => {
|
||||
if (passedContextId === contextId) {
|
||||
|
|
|
@ -54,12 +54,16 @@ preloadProcess.getHeapStatistics = () => binding.getHeapStatistics()
|
|||
preloadProcess.getSystemMemoryInfo = () => binding.getSystemMemoryInfo()
|
||||
preloadProcess.getCPUUsage = () => binding.getCPUUsage()
|
||||
preloadProcess.getIOCounters = () => binding.getIOCounters()
|
||||
preloadProcess.argv = process.argv = binding.getArgv()
|
||||
preloadProcess.execPath = process.execPath = binding.getExecPath()
|
||||
preloadProcess.pid = process.pid = binding.getPid()
|
||||
preloadProcess.resourcesPath = binding.getResourcesPath()
|
||||
preloadProcess.sandboxed = true
|
||||
preloadProcess.type = 'renderer'
|
||||
|
||||
Object.assign(processProps, {
|
||||
argv: binding.getArgv(),
|
||||
execPath: binding.getExecPath(),
|
||||
pid: binding.getPid(),
|
||||
resourcesPath: binding.getResourcesPath(),
|
||||
sandboxed: true,
|
||||
type: 'renderer'
|
||||
})
|
||||
|
||||
Object.assign(preloadProcess, processProps)
|
||||
Object.assign(process, processProps)
|
||||
|
||||
|
|
Loading…
Reference in a new issue