fix: don't overwrite global constructor names in remote (#20637)
* fix: don't overwrite global constructor names in remote * fake constructor names better, and improve error serialization
This commit is contained in:
parent
820dab295f
commit
b155ebeeb3
3 changed files with 26 additions and 10 deletions
|
@ -245,6 +245,17 @@ type MetaTypeFromRenderer = {
|
|||
length: number
|
||||
}
|
||||
|
||||
const fakeConstructor = (constructor: Function, name: string) =>
|
||||
new Proxy(Object, {
|
||||
get (target, prop, receiver) {
|
||||
if (prop === 'name') {
|
||||
return name
|
||||
} else {
|
||||
return Reflect.get(target, prop, receiver)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Convert array of meta data from renderer into array of real values.
|
||||
const unwrapArgs = function (sender: electron.WebContents, frameId: number, contextId: string, args: any[]) {
|
||||
const metaToValue = function (meta: MetaTypeFromRenderer): any {
|
||||
|
@ -262,8 +273,9 @@ const unwrapArgs = function (sender: electron.WebContents, frameId: number, cont
|
|||
then: metaToValue(meta.then)
|
||||
})
|
||||
case 'object': {
|
||||
const ret: any = {}
|
||||
Object.defineProperty(ret.constructor, 'name', { value: meta.name })
|
||||
const ret: any = meta.name !== 'Object' ? Object.create({
|
||||
constructor: fakeConstructor(Object, meta.name)
|
||||
}) : {}
|
||||
|
||||
for (const { name, value } of meta.members) {
|
||||
ret[name] = metaToValue(value)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue