Drop support for cross-process callbacks.
authorCheng Zhao <zcbenz@gmail.com>
Tue, 30 Apr 2013 14:37:54 +0000 (22:37 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Tue, 30 Apr 2013 14:37:54 +0000 (22:37 +0800)
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.

browser/atom/rpc_server.coffee
renderer/api/lib/remote.coffee

index e431f62..8c8eed6 100644 (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)
index 91c8d5b..4b74be8 100644 (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