Use Proxy for accessing properties of remote function
This commit is contained in:
parent
8b38018ab4
commit
d226b7bc6c
4 changed files with 25 additions and 28 deletions
|
@ -99,7 +99,7 @@ const setObjectMembers = function (ref, object, metaId, members) {
|
|||
|
||||
let descriptor = { enumerable: member.enumerable }
|
||||
if (member.type === 'method') {
|
||||
let remoteMemberFunction = function () {
|
||||
const remoteMemberFunction = function () {
|
||||
if (this && this.constructor === remoteMemberFunction) {
|
||||
// Constructor call.
|
||||
let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', metaId, member.name, wrapArgs(arguments))
|
||||
|
@ -110,13 +110,22 @@ const setObjectMembers = function (ref, object, metaId, members) {
|
|||
return metaToValue(ret)
|
||||
}
|
||||
}
|
||||
|
||||
// Wrap function in proxy for accessing remote properties
|
||||
let descriptorFunction = new Proxy(remoteMemberFunction, {
|
||||
get: (target, property, receiver) => {
|
||||
if (target.hasOwnProperty(property)) return target[property]
|
||||
return metaToValue(ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_GET', metaId, member.name))[property]
|
||||
}
|
||||
})
|
||||
|
||||
descriptor.get = function () {
|
||||
remoteMemberFunction.ref = ref // The member should reference its object.
|
||||
return remoteMemberFunction
|
||||
descriptorFunction.ref = ref // The member should reference its object.
|
||||
return descriptorFunction
|
||||
}
|
||||
// Enable monkey-patch the method
|
||||
descriptor.set = function (value) {
|
||||
remoteMemberFunction = value
|
||||
descriptorFunction = value
|
||||
return value
|
||||
}
|
||||
descriptor.configurable = true
|
||||
|
@ -135,18 +144,9 @@ const setObjectMembers = function (ref, object, metaId, members) {
|
|||
}
|
||||
|
||||
Object.defineProperty(object, member.name, descriptor)
|
||||
addFunctionProperties(object, member)
|
||||
}
|
||||
}
|
||||
|
||||
// Include properties on member methods
|
||||
const addFunctionProperties = (object, member) => {
|
||||
if (member.type !== 'method') return
|
||||
if (member.members == null || member.members.length === 0) return
|
||||
const method = object[member.name]
|
||||
setObjectMembers(method, method, member.id, member.members)
|
||||
}
|
||||
|
||||
// Populate object's prototype from descriptor.
|
||||
// This matches |getObjectPrototype| in rpc-server.
|
||||
const setObjectPrototype = function (ref, object, metaId, descriptor) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue