Merge pull request #6963 from electron/remote-buffers

Serialize ArrayBuffers as Buffers instead of Arrays over remote
This commit is contained in:
Cheng Zhao 2016-08-25 17:29:12 +09:00 committed by GitHub
commit 97a004a357
3 changed files with 27 additions and 5 deletions

View file

@ -91,7 +91,7 @@ let valueToMeta = function (sender, value, optimizeSimpleObject = false) {
meta.members = getObjectMembers(value) meta.members = getObjectMembers(value)
meta.proto = getObjectPrototype(value) meta.proto = getObjectPrototype(value)
} else if (meta.type === 'buffer') { } else if (meta.type === 'buffer') {
meta.value = Array.prototype.slice.call(value, 0) meta.value = Buffer.from(value)
} else if (meta.type === 'promise') { } else if (meta.type === 'promise') {
// Add default handler to prevent unhandled rejections in main process // Add default handler to prevent unhandled rejections in main process
// Instead they should appear in the renderer process // Instead they should appear in the renderer process

View file

@ -33,7 +33,7 @@ const wrapArgs = function (args, visited) {
} else if (ArrayBuffer.isView(value)) { } else if (ArrayBuffer.isView(value)) {
return { return {
type: 'buffer', type: 'buffer',
value: Array.prototype.slice.call(value, 0) value: Buffer.from(value)
} }
} else if (value instanceof Date) { } else if (value instanceof Date) {
return { return {

View file

@ -163,10 +163,23 @@ describe('ipc module', function () {
assert.deepEqual(printName.echo(now), now) assert.deepEqual(printName.echo(now), now)
}) })
it('supports instanceof Buffer', function () {
const buffer = Buffer.from('test')
assert.ok(buffer.equals(printName.echo(buffer)))
const objectWithBuffer = {a: 'foo', b: Buffer.from('bar')}
assert.ok(objectWithBuffer.b.equals(printName.echo(objectWithBuffer).b))
const arrayWithBuffer = [1, 2, Buffer.from('baz')]
assert.ok(arrayWithBuffer[2].equals(printName.echo(arrayWithBuffer)[2]))
})
it('supports TypedArray', function () { it('supports TypedArray', function () {
const values = [1, 2, 3, 4] const values = [1, 2, 3, 4]
const typedArray = printName.typedArray(values) assert.deepEqual(printName.typedArray(values), values)
assert.deepEqual(values, typedArray)
const int16values = new Int16Array([1, 2, 3, 4])
assert.deepEqual(printName.typedArray(int16values), int16values)
}) })
}) })
@ -286,7 +299,7 @@ describe('ipc module', function () {
ipcRenderer.send('message', obj) ipcRenderer.send('message', obj)
}) })
it('can send instance of Date', function (done) { it('can send instances of Date', function (done) {
const currentDate = new Date() const currentDate = new Date()
ipcRenderer.once('message', function (event, value) { ipcRenderer.once('message', function (event, value) {
assert.equal(value, currentDate.toISOString()) assert.equal(value, currentDate.toISOString())
@ -295,6 +308,15 @@ describe('ipc module', function () {
ipcRenderer.send('message', currentDate) ipcRenderer.send('message', currentDate)
}) })
it('can send instances of Buffer', function (done) {
const buffer = Buffer.from('hello')
ipcRenderer.once('message', function (event, message) {
assert.ok(buffer.equals(message))
done()
})
ipcRenderer.send('message', buffer)
})
it('can send objects with DOM class prototypes', function (done) { it('can send objects with DOM class prototypes', function (done) {
ipcRenderer.once('message', function (event, value) { ipcRenderer.once('message', function (event, value) {
assert.equal(value.protocol, 'file:') assert.equal(value.protocol, 'file:')