Drop support for cross-process callbacks.

Now it's forbidden for browser to store reference to objects (including
functions) in renderer, because when the renderer is destroyed, it's
extremely hard to clean all of corresponding objects in browser
correctly, which would cause very bad resources leak.
This commit is contained in:
Cheng Zhao 2013-04-30 22:37:54 +08:00
parent 74c519ac3f
commit bcf6cd9f1b
2 changed files with 3 additions and 59 deletions

View file

@ -1,23 +1,6 @@
ipc = require 'ipc'
path = require 'path'
objectsRegistry = require './objects_registry.js'
v8_util = process.atomBinding 'v8_util'
# Convert list of meta information into real arguments array, the main
# purpose is to turn remote function's id into delegate function.
argsToValues = (processId, routingId, metas) ->
constructCallback = (meta) ->
return meta.value if meta.type is 'value'
# Create a delegate function to do asynchronous RPC call.
ret = ->
args = new Meta(processId, routingId, arguments)
ipc.sendChannel processId, routingId, 'ATOM_RENDERER_FUNCTION_CALL', meta.id, args
v8_util.setDestructor ret, ->
ipc.sendChannel processId, routingId, 'ATOM_RENDERER_DEREFERENCE', meta.id
ret
constructCallback meta for meta in metas
# Convert a real value into a POD structure which carries information of this
# value.
@ -72,7 +55,6 @@ ipc.on 'ATOM_BROWSER_CURRENT_WINDOW', (event, processId, routingId) ->
ipc.on 'ATOM_BROWSER_CONSTRUCTOR', (event, processId, routingId, id, args) ->
try
args = argsToValues processId, routingId, args
constructor = objectsRegistry.get id
# Call new with array of arguments.
# http://stackoverflow.com/questions/1606797/use-of-apply-with-new-operator-is-this-possible
@ -83,7 +65,6 @@ ipc.on 'ATOM_BROWSER_CONSTRUCTOR', (event, processId, routingId, id, args) ->
ipc.on 'ATOM_BROWSER_FUNCTION_CALL', (event, processId, routingId, id, args) ->
try
args = argsToValues processId, routingId, args
func = objectsRegistry.get id
ret = func.apply global, args
event.result = new Meta(processId, routingId, ret)
@ -92,7 +73,6 @@ ipc.on 'ATOM_BROWSER_FUNCTION_CALL', (event, processId, routingId, id, args) ->
ipc.on 'ATOM_BROWSER_MEMBER_CALL', (event, processId, routingId, id, method, args) ->
try
args = argsToValues processId, routingId, args
obj = objectsRegistry.get id
ret = obj[method].apply(obj, args)
event.result = new Meta(processId, routingId, ret)

View file

@ -1,33 +1,6 @@
ipc = require 'ipc'
IDWeakMap = require 'id_weak_map'
v8_util = process.atomBinding 'v8_util'
class CallbacksRegistry
constructor: ->
@referencesMap = {}
@weakMap = new IDWeakMap
get: (id) -> @weakMap.get id
remove: (id) -> delete @referencesMap[id]
add: (callback) ->
id = @weakMap.add callback
@referencesMap[id] = callback
id
# Translate arguments object into a list of meta data.
# Unlike the Meta class in browser, this function only create delegate object
# for functions, other types of value are transfered after serialization.
callbacksRegistry = new CallbacksRegistry
argumentsToMetaList = (args) ->
metas = []
for arg in args
if typeof arg is 'function'
metas.push type: 'function', id: callbacksRegistry.add(arg)
else
metas.push type: 'value', value: arg
metas
# Transform the description of value into a value or delegate object.
metaToValue = (meta) ->
switch meta.type
@ -42,7 +15,7 @@ metaToValue = (meta) ->
constructor: ->
if @constructor == RemoteFunction
# Constructor call.
obj = ipc.sendChannelSync 'ATOM_BROWSER_CONSTRUCTOR', meta.id, argumentsToMetaList(arguments)
obj = ipc.sendChannelSync 'ATOM_BROWSER_CONSTRUCTOR', meta.id, Array::slice.call(arguments)
# Returning object in constructor will replace constructed object
# with the returned object.
@ -50,7 +23,7 @@ metaToValue = (meta) ->
return metaToValue obj
else
# Function call.
ret = ipc.sendChannelSync 'ATOM_BROWSER_FUNCTION_CALL', meta.id, argumentsToMetaList(arguments)
ret = ipc.sendChannelSync 'ATOM_BROWSER_FUNCTION_CALL', meta.id, Array::slice.call(arguments)
return metaToValue ret
else
ret = v8_util.createObjectWithName meta.name
@ -61,7 +34,7 @@ metaToValue = (meta) ->
if member.type is 'function'
ret[member.name] = ->
# Call member function.
ret = ipc.sendChannelSync 'ATOM_BROWSER_MEMBER_CALL', meta.id, member.name, argumentsToMetaList(arguments)
ret = ipc.sendChannelSync 'ATOM_BROWSER_MEMBER_CALL', meta.id, member.name, Array::slice.call(arguments)
metaToValue ret
else
ret.__defineSetter__ member.name, (value) ->
@ -80,15 +53,6 @@ metaToValue = (meta) ->
ret
# Browser calls a callback in renderer.
ipc.on 'ATOM_RENDERER_FUNCTION_CALL', (callbackId, args) ->
callback = callbacksRegistry.get callbackId
callback.apply global, metaToValue(args)
# Browser releases a callback in renderer.
ipc.on 'ATOM_RENDERER_DEREFERENCE', (callbackId) ->
callbacksRegistry.remove callbackId
# Get remote module.
exports.require = (module) ->
meta = ipc.sendChannelSync 'ATOM_BROWSER_REQUIRE', module