From e5f70f90a40e1202e49df96fcc5f45a676e0bd62 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 3 Apr 2017 14:17:16 -0700 Subject: [PATCH 1/4] Add spec for remote setter with remote object --- spec/api-ipc-spec.js | 8 ++++++++ spec/fixtures/module/remote-object-set.js | 11 +++++++++++ 2 files changed, 19 insertions(+) create mode 100644 spec/fixtures/module/remote-object-set.js diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index c5e38e83e4db..798c26d87a48 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -199,6 +199,14 @@ describe('ipc module', function () { }, /setting error/) }) + it('can set a remote property with a remote object', function () { + const foo = remote.require(path.join(fixtures, 'module', 'remote-object-set.js')) + + assert.doesNotThrow(function () { + foo.bar = remote.getCurrentWindow() + }) + }) + it('can construct an object from its member', function () { var call = remote.require(path.join(fixtures, 'module', 'call.js')) var obj = new call.constructor() diff --git a/spec/fixtures/module/remote-object-set.js b/spec/fixtures/module/remote-object-set.js new file mode 100644 index 000000000000..5fefbf5cf36a --- /dev/null +++ b/spec/fixtures/module/remote-object-set.js @@ -0,0 +1,11 @@ +const {BrowserWindow} = require('electron') + +class Foo { + set bar (value) { + if (!(value instanceof BrowserWindow)) { + throw new Error('setting error') + } + } +} + +module.exports = new Foo() From 7065123266ec17d709348185c699d07a1f5555f1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 3 Apr 2017 14:18:04 -0700 Subject: [PATCH 2/4] Wrap remote value being set as an arg --- lib/browser/rpc-server.js | 5 +++-- lib/renderer/api/remote.js | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/browser/rpc-server.js b/lib/browser/rpc-server.js index 13d6f882c2e1..3da059079ac5 100644 --- a/lib/browser/rpc-server.js +++ b/lib/browser/rpc-server.js @@ -360,9 +360,10 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) { } }) -ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, value) { +ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, args) { try { - let obj = objectsRegistry.get(id) + const [value] = unwrapArgs(event.sender, args) + const obj = objectsRegistry.get(id) if (obj == null) { throwRPCError(`Cannot set property '${name}' on missing remote object ${id}`) diff --git a/lib/renderer/api/remote.js b/lib/renderer/api/remote.js index f65d61790ace..5e790133d383 100644 --- a/lib/renderer/api/remote.js +++ b/lib/renderer/api/remote.js @@ -139,7 +139,8 @@ const setObjectMembers = function (ref, object, metaId, members) { // Only set setter when it is writable. if (member.writable) { descriptor.set = function (value) { - const meta = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_SET', metaId, member.name, value) + const args = wrapArgs([value]) + const meta = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_SET', metaId, member.name, args) // Meta will be non-null when a setter error occurred so parse it // to a value so it gets re-thrown. if (meta != null) { From 746f636016e2cafb8ea05d08d6632066eb30fb5a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 3 Apr 2017 14:26:39 -0700 Subject: [PATCH 3/4] Add tests for setting remote property null/undefined --- spec/api-ipc-spec.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index 798c26d87a48..fb4278d180fb 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -175,8 +175,14 @@ describe('ipc module', function () { it('can change its properties', function () { var property = remote.require(path.join(fixtures, 'module', 'property.js')) assert.equal(property.property, 1127) + + property.property = null + assert.equal(property.property, null) + property.property = undefined + assert.equal(property.property, undefined) property.property = 1007 assert.equal(property.property, 1007) + assert.equal(property.getFunctionProperty(), 'foo-browser') property.func.property = 'bar' assert.equal(property.getFunctionProperty(), 'bar-browser') From fdd36334e5ae949ce4c92b7395a748cb46788d48 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 3 Apr 2017 14:30:21 -0700 Subject: [PATCH 4/4] Match args style of other IPC handlers --- lib/browser/rpc-server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/browser/rpc-server.js b/lib/browser/rpc-server.js index 3da059079ac5..8d543f2d7d30 100644 --- a/lib/browser/rpc-server.js +++ b/lib/browser/rpc-server.js @@ -362,14 +362,14 @@ ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) { ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, args) { try { - const [value] = unwrapArgs(event.sender, args) - const obj = objectsRegistry.get(id) + args = unwrapArgs(event.sender, args) + let obj = objectsRegistry.get(id) if (obj == null) { throwRPCError(`Cannot set property '${name}' on missing remote object ${id}`) } - obj[name] = value + obj[name] = args[0] event.returnValue = null } catch (error) { event.returnValue = exceptionToMeta(error)