|
@@ -65,39 +65,17 @@ metaToValue = (meta) ->
|
|
|
return metaToValue obj
|
|
|
else
|
|
|
# Function call.
|
|
|
- ret = ipcRenderer.sendSync 'ATOM_BROWSER_FUNCTION_CALL', meta.id, wrapArgs(arguments)
|
|
|
- return metaToValue ret
|
|
|
+ obj = ipcRenderer.sendSync 'ATOM_BROWSER_FUNCTION_CALL', meta.id, wrapArgs(arguments)
|
|
|
+ return metaToValue obj
|
|
|
else
|
|
|
ret = v8Util.createObjectWithName meta.name
|
|
|
|
|
|
# Polulate delegate members.
|
|
|
for member in meta.members
|
|
|
- do (member) ->
|
|
|
- if member.type is 'function'
|
|
|
- ret[member.name] =
|
|
|
- class RemoteMemberFunction
|
|
|
- constructor: ->
|
|
|
- if @constructor is RemoteMemberFunction
|
|
|
- # Constructor call.
|
|
|
- obj = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', meta.id, member.name, wrapArgs(arguments)
|
|
|
- return metaToValue obj
|
|
|
- else
|
|
|
- # Call member function.
|
|
|
- ret = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_CALL', meta.id, member.name, wrapArgs(arguments)
|
|
|
- return metaToValue ret
|
|
|
- else
|
|
|
- Object.defineProperty ret, member.name,
|
|
|
- enumerable: true,
|
|
|
- configurable: false,
|
|
|
- set: (value) ->
|
|
|
- # Set member data.
|
|
|
- ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_SET', meta.id, member.name, value
|
|
|
- value
|
|
|
-
|
|
|
- get: ->
|
|
|
- # Get member data.
|
|
|
- ret = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_GET', meta.id, member.name
|
|
|
- metaToValue ret
|
|
|
+ if member.type is 'function'
|
|
|
+ ret[member.name] = createRemoteMemberFunction meta.id, member.name
|
|
|
+ else
|
|
|
+ Object.defineProperty ret, member.name, createRemoteMemberProperty(meta.id, member.name)
|
|
|
|
|
|
# Track delegate object's life time, and tell the browser to clean up
|
|
|
# when the object is GCed.
|
|
@@ -117,6 +95,35 @@ metaToPlainObject = (meta) ->
|
|
|
obj[name] = value for {name, value} in meta.members
|
|
|
obj
|
|
|
|
|
|
+# Create a RemoteMemberFunction instance.
|
|
|
+# This function's content should not be inlined into metaToValue, otherwise V8
|
|
|
+# may consider it circular reference.
|
|
|
+createRemoteMemberFunction = (metaId, name) ->
|
|
|
+ class RemoteMemberFunction
|
|
|
+ constructor: ->
|
|
|
+ if @constructor is RemoteMemberFunction
|
|
|
+ # Constructor call.
|
|
|
+ ret = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', metaId, name, wrapArgs(arguments)
|
|
|
+ return metaToValue ret
|
|
|
+ else
|
|
|
+ # Call member function.
|
|
|
+ ret = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_CALL', metaId, name, wrapArgs(arguments)
|
|
|
+ return metaToValue ret
|
|
|
+
|
|
|
+# Create configuration for defineProperty.
|
|
|
+# This function's content should not be inlined into metaToValue, otherwise V8
|
|
|
+# may consider it circular reference.
|
|
|
+createRemoteMemberProperty = (metaId, name) ->
|
|
|
+ enumerable: true,
|
|
|
+ configurable: false,
|
|
|
+ set: (value) ->
|
|
|
+ # Set member data.
|
|
|
+ ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_SET', metaId, name, value
|
|
|
+ value
|
|
|
+ get: ->
|
|
|
+ # Get member data.
|
|
|
+ metaToValue ipcRenderer.sendSync('ATOM_BROWSER_MEMBER_GET', metaId, name)
|
|
|
+
|
|
|
# Browser calls a callback in renderer.
|
|
|
ipcRenderer.on 'ATOM_RENDERER_CALLBACK', (event, id, args) ->
|
|
|
callbacksRegistry.apply id, metaToValue(args)
|