From 2ad46f18429a480c1b471857e80f0f24008a1bef Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 25 Jan 2017 12:57:20 -0800 Subject: [PATCH 1/3] Add failing spec for empty image crashes --- spec/api-native-image-spec.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/spec/api-native-image-spec.js b/spec/api-native-image-spec.js index 7bb2e040f6..5ad4946e70 100644 --- a/spec/api-native-image-spec.js +++ b/spec/api-native-image-spec.js @@ -7,7 +7,16 @@ const path = require('path') describe('nativeImage module', () => { describe('createEmpty()', () => { it('returns an empty image', () => { - assert(nativeImage.createEmpty().isEmpty()) + const empty = nativeImage.createEmpty() + assert.equal(empty.isEmpty(), true) + assert.equal(empty.getAspectRatio(), 1) + assert.equal(empty.toDataURL(), 'data:image/png;base64,') + assert.deepEqual(empty.getNativeHandle(), []) + assert.deepEqual(empty.getBitmap(), []) + assert.deepEqual(empty.getSize(), {width: 0, height: 0}) + assert.deepEqual(empty.toBitmap(), []) + assert.deepEqual(empty.toJPEG(100), []) + assert.deepEqual(empty.toPNG(), []) }) }) From e1281342f6525dda138e6215498ad3b2bdd67756 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 25 Jan 2017 13:22:44 -0800 Subject: [PATCH 2/3] Return empty buffers when image is empty --- atom/common/api/atom_api_native_image.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index a8f89f15e1..0c174941db 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -238,6 +238,8 @@ v8::Local NativeImage::ToPNG(v8::Isolate* isolate) { } v8::Local NativeImage::ToBitmap(v8::Isolate* isolate) { + if (IsEmpty()) return node::Buffer::New(isolate, 0).ToLocalChecked(); + const SkBitmap* bitmap = image_.ToSkBitmap(); SkPixelRef* ref = bitmap->pixelRef(); return node::Buffer::Copy(isolate, @@ -264,6 +266,8 @@ std::string NativeImage::ToDataURL() { } v8::Local NativeImage::GetBitmap(v8::Isolate* isolate) { + if (IsEmpty()) return node::Buffer::New(isolate, 0).ToLocalChecked(); + const SkBitmap* bitmap = image_.ToSkBitmap(); SkPixelRef* ref = bitmap->pixelRef(); return node::Buffer::New(isolate, @@ -276,6 +280,8 @@ v8::Local NativeImage::GetBitmap(v8::Isolate* isolate) { v8::Local NativeImage::GetNativeHandle(v8::Isolate* isolate, mate::Arguments* args) { #if defined(OS_MACOSX) + if (IsEmpty()) return node::Buffer::New(isolate, 0).ToLocalChecked(); + NSImage* ptr = image_.AsNSImage(); return node::Buffer::Copy( isolate, From 104cae8f689eddcfab6541f313a36c5731e656f5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 25 Jan 2017 13:52:18 -0800 Subject: [PATCH 3/3] Only call getNativeHandle on macOS --- spec/api-native-image-spec.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spec/api-native-image-spec.js b/spec/api-native-image-spec.js index 5ad4946e70..e28b37bebf 100644 --- a/spec/api-native-image-spec.js +++ b/spec/api-native-image-spec.js @@ -11,12 +11,15 @@ describe('nativeImage module', () => { assert.equal(empty.isEmpty(), true) assert.equal(empty.getAspectRatio(), 1) assert.equal(empty.toDataURL(), 'data:image/png;base64,') - assert.deepEqual(empty.getNativeHandle(), []) - assert.deepEqual(empty.getBitmap(), []) assert.deepEqual(empty.getSize(), {width: 0, height: 0}) + assert.deepEqual(empty.getBitmap(), []) assert.deepEqual(empty.toBitmap(), []) assert.deepEqual(empty.toJPEG(100), []) assert.deepEqual(empty.toPNG(), []) + + if (process.platform === 'darwin') { + assert.deepEqual(empty.getNativeHandle(), []) + } }) })