diff --git a/browser/atom/rpc_server.coffee b/browser/atom/rpc_server.coffee index 94528b11c..f93170793 100644 --- a/browser/atom/rpc_server.coffee +++ b/browser/atom/rpc_server.coffee @@ -25,9 +25,9 @@ ipc.on 'ATOM_INTERNAL_REQUIRE', (event, process_id, routing_id, module) -> ipc.on 'ATOM_INTERNAL_CONSTRUCTOR', (event, process_id, routing_id, id, args) -> try - # Call new with array of arguments. - # TODO(zcbenz): Paste the URL of the StackOverflow question. constructor = objectsRegistry.get id + # Call new with array of arguments. + # http://stackoverflow.com/questions/1606797/use-of-apply-with-new-operator-is-this-possible obj = new (Function::bind.apply(constructor, [null].concat(args))) event.result = new PlainObject(obj) catch e diff --git a/renderer/api/lib/remote.coffee b/renderer/api/lib/remote.coffee index f18948489..2ae0b9a30 100644 --- a/renderer/api/lib/remote.coffee +++ b/renderer/api/lib/remote.coffee @@ -5,41 +5,43 @@ generateFromPainObject = (plain) -> return plain.value else if plain.type is 'error' throw new Error('Remote Error: ' + plain.value) - else - # A shadow class to represent the remote object. - class RemoteObject - constructor: () -> - if @constructor == RemoteObject - # Constructor call. - obj = ipc.sendChannelSync 'ATOM_INTERNAL_CONSTRUCTOR', plain.id, Array::slice.call(arguments) - # Returning object in constructor will replace constructed object - # with returned object. - return generateFromPainObject obj - else - # Function call. - ret = ipc.sendChannelSync 'ATOM_INTERNAL_FUNCTION_CALL', plain.id, Array::slice.call(arguments) + + # A shadow class to represent the remote object. + class RemoteObject + constructor: () -> + if @constructor == RemoteObject + # Constructor call. + obj = ipc.sendChannelSync 'ATOM_INTERNAL_CONSTRUCTOR', plain.id, Array::slice.call(arguments) + + # Returning object in constructor will replace constructed object + # with the returned object. + # http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-returning-this + return generateFromPainObject obj + else + # Function call. + ret = ipc.sendChannelSync 'ATOM_INTERNAL_FUNCTION_CALL', plain.id, Array::slice.call(arguments) + generateFromPainObject ret + + # Polulate shadow members. + for member in plain.members + do (member) -> + if member.type is 'function' + RemoteObject[member.name] = -> + # Call member function. + ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_CALL', plain.id, member.name, Array::slice.call(arguments) + generateFromPainObject ret + else + RemoteObject.__defineSetter__ member.name, (value) -> + # Set member data. + ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_SET', plain.id, member.name, value + undefined + + RemoteObject.__defineGetter__ member.name, -> + # Get member data. + ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_GET', plain.id, member.name generateFromPainObject ret - # Polulate shadow members. - for member in plain.members - do (member) -> - if member.type is 'function' - RemoteObject[member.name] = -> - # Call member function. - ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_CALL', plain.id, member.name, Array::slice.call(arguments) - generateFromPainObject ret - else - RemoteObject.__defineSetter__ member.name, (value) -> - # Set member data. - ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_SET', plain.id, member.name, value - undefined - - RemoteObject.__defineGetter__ member.name, -> - # Get member data. - ret = ipc.sendChannelSync 'ATOM_INTERNAL_MEMBER_GET', plain.id, member.name - generateFromPainObject ret - - RemoteObject + RemoteObject exports.require = (module) -> plain = ipc.sendChannelSync 'ATOM_INTERNAL_REQUIRE', module