From c86acc4cd7f1916e7a31d16d8fda50168e5285f6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 25 Aug 2013 17:22:36 +0800 Subject: [PATCH] Add remote.createFunctionWithReturnValue API. --- browser/atom/rpc-server.coffee | 5 ++++- renderer/api/lib/remote.coffee | 10 +++++++++- spec/api/ipc.coffee | 15 ++++++++++++++- spec/fixtures/module/call.js | 3 +++ spec/fixtures/module/print_name.js | 3 +++ 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 spec/fixtures/module/call.js create mode 100644 spec/fixtures/module/print_name.js diff --git a/browser/atom/rpc-server.coffee b/browser/atom/rpc-server.coffee index 90c1a1edcd9e..acff46ea5878 100644 --- a/browser/atom/rpc-server.coffee +++ b/browser/atom/rpc-server.coffee @@ -44,10 +44,13 @@ unwrapArgs = (processId, routingId, args) -> when 'remote-object' then objectsRegistry.get meta.id when 'array' then unwrapArgs processId, routingId, meta.value when 'object' - ret = {} + ret = v8Util.createObjectWithName meta.name for member in meta.members ret[member.name] = metaToValue(member.value) ret + when 'function-with-return-value' + returnValue = metaToValue meta.value + -> returnValue when 'function' ret = -> ipc.sendChannel processId, routingId, 'ATOM_RENDERER_CALLBACK', meta.id, valueToMeta(processId, routingId, arguments) diff --git a/renderer/api/lib/remote.coffee b/renderer/api/lib/remote.coffee index 997225a6810e..ee124fe232b7 100644 --- a/renderer/api/lib/remote.coffee +++ b/renderer/api/lib/remote.coffee @@ -13,9 +13,11 @@ wrapArgs = (args) -> else if value? and typeof value is 'object' and v8Util.getHiddenValue value, 'atomId' type: 'remote-object', id: v8Util.getHiddenValue value, 'atomId' else if value? and typeof value is 'object' - ret = type: 'object', members: [] + ret = type: 'object', name: value.constructor.name, members: [] ret.members.push(name: prop, value: valueToMeta(field)) for prop, field of value ret + else if typeof value is 'function' and v8Util.getHiddenValue value, 'returnValue' + type: 'function-with-return-value', value: valueToMeta(value()) else if typeof value is 'function' type: 'function', id: callbacksRegistry.add(value) else @@ -121,3 +123,9 @@ processCache = null exports.__defineGetter__ 'process', -> processCache = exports.getGlobal('process') unless processCache? processCache + +# Create a funtion that will return the specifed value when called in browser. +exports.createFunctionWithReturnValue = (returnValue) -> + func = -> returnValue + v8Util.setHiddenValue func, 'returnValue', true + func diff --git a/spec/api/ipc.coffee b/spec/api/ipc.coffee index c5464d3b4a46..1c28bdc03c71 100644 --- a/spec/api/ipc.coffee +++ b/spec/api/ipc.coffee @@ -16,7 +16,14 @@ describe 'ipc', -> a = remote.require path.join(fixtures, 'module', 'id.js') assert.equal a.id, 1127 - describe 'remote object', -> + describe 'remote.createFunctionWithReturnValue', -> + it 'should be called in browser synchronously', -> + buf = new Buffer('test') + call = remote.require path.join(fixtures, 'module', 'call.js') + result = call.call remote.createFunctionWithReturnValue(buf) + assert.equal result.constructor.name, 'Buffer' + + describe 'remote object in renderer', -> it 'can change its properties', -> property = remote.require path.join(fixtures, 'module', 'property.js') assert.equal property.property, 1127 @@ -28,6 +35,12 @@ describe 'ipc', -> # Restore. property.property = 1127 + describe 'remote value in browser', -> + it 'keeps its constructor name for objects', -> + buf = new Buffer('test') + print_name = remote.require path.join(fixtures, 'module', 'print_name.js') + assert.equal print_name.print(buf), 'Buffer' + describe 'ipc.send', -> it 'should work when sending an object containing id property', (done) -> obj = id: 1, name: 'ly' diff --git a/spec/fixtures/module/call.js b/spec/fixtures/module/call.js new file mode 100644 index 000000000000..552aab2ecb5d --- /dev/null +++ b/spec/fixtures/module/call.js @@ -0,0 +1,3 @@ +exports.call = function(func) { + return func(); +} diff --git a/spec/fixtures/module/print_name.js b/spec/fixtures/module/print_name.js new file mode 100644 index 000000000000..09ec33341f5c --- /dev/null +++ b/spec/fixtures/module/print_name.js @@ -0,0 +1,3 @@ +exports.print = function(obj) { + return obj.constructor.name; +}