From 66cc07d8e97799b6570c5d1eeed9c607db615537 Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 14:47:04 +0900 Subject: [PATCH 01/11] Add clipboard.writeBuffer --- atom/common/api/atom_api_clipboard.cc | 10 ++++++++++ atom/common/api/atom_api_clipboard.h | 3 +++ spec/api-clipboard-spec.js | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index 5ae318510e0..13cf3651824 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -53,6 +53,15 @@ v8::Local Clipboard::ReadBuffer(const std::string& format_string, args->isolate(), data.data(), data.length()).ToLocalChecked(); } +void Clipboard::WriteBuffer(const std::string& format_string, + const v8::Local buffer, + mate::Arguments* args) { + auto format = ui::Clipboard::GetFormatType(format_string); + ui::ScopedClipboardWriter writer(GetClipboardType(args)); + writer.WriteData(node::Buffer::Data(buffer), node::Buffer::Length(buffer), + format); +} + void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); base::string16 text, html, bookmark; @@ -191,6 +200,7 @@ void Initialize(v8::Local exports, v8::Local unused, dict.SetMethod("readFindText", &atom::api::Clipboard::ReadFindText); dict.SetMethod("writeFindText", &atom::api::Clipboard::WriteFindText); dict.SetMethod("readBuffer", &atom::api::Clipboard::ReadBuffer); + dict.SetMethod("writeBuffer", &atom::api::Clipboard::WriteBuffer); dict.SetMethod("clear", &atom::api::Clipboard::Clear); // TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings diff --git a/atom/common/api/atom_api_clipboard.h b/atom/common/api/atom_api_clipboard.h index d7cbe7a42a6..92bc7b04a45 100644 --- a/atom/common/api/atom_api_clipboard.h +++ b/atom/common/api/atom_api_clipboard.h @@ -49,6 +49,9 @@ class Clipboard { static v8::Local ReadBuffer(const std::string& format_string, mate::Arguments* args); + static void WriteBuffer(const std::string& format_string, + const v8::Local buffer, + mate::Arguments* args); private: DISALLOW_COPY_AND_ASSIGN(Clipboard); diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index a4a0e964304..b1a1b732552 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -94,6 +94,17 @@ describe('clipboard module', function () { }) }) + describe('clipboard.writeBuffer(format, buffer)', () => { + it('writes a Buffer for the specified format', () => { + if (process.platform !== 'darwin') return + + const buffer = Buffer.from('writeBuffer', 'utf8') + clipboard.writeBuffer('public.utf8-plain-text', buffer) + console.log(clipboard.readText()) + assert.equal(clipboard.readText(), 'writeBuffer') + }) + }) + describe('clipboard.readBuffer(format)', function () { it('returns a Buffer of the content for the specified format', function () { if (process.platform !== 'darwin') return From 03fdc7aa282019f2c9533ece4015e2d9ba7a505d Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 15:15:29 +0900 Subject: [PATCH 02/11] Add buffer support in clipboard.write() --- atom/common/api/atom_api_clipboard.cc | 9 +++++++++ spec/api-clipboard-spec.js | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index 13cf3651824..d54fc457309 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -66,6 +66,7 @@ void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); base::string16 text, html, bookmark; gfx::Image image; + std::map> customBuffers; if (data.Get("text", &text)) { writer.WriteText(text); @@ -84,6 +85,14 @@ void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { if (data.Get("image", &image)) writer.WriteImage(image.AsBitmap()); + + if (data.Get("buffer", &customBuffers)) { + for (auto i = customBuffers.begin(); i != customBuffers.end(); ++i) { + writer.WriteData(node::Buffer::Data(i->second), + node::Buffer::Length(i->second), + ui::Clipboard::GetFormatType(i->first)); + } + } } base::string16 Clipboard::ReadText(mate::Arguments* args) { diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index b1a1b732552..c73f0fd6e64 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -1,5 +1,6 @@ const assert = require('assert') const path = require('path') +const fs = require('fs') const {Buffer} = require('buffer') const {clipboard, nativeImage} = require('electron') @@ -67,17 +68,23 @@ describe('clipboard module', function () { var i = nativeImage.createFromPath(p) var markup = process.platform === 'darwin' ? "Hi" : process.platform === 'linux' ? 'Hi' : 'Hi' var bookmark = {title: 'a title', url: 'test'} + const pdfType = process.platform === 'darwin' ? 'com.adobe.pdf' : 'application/pdf' + const pdf = fs.readFileSync(path.join(fixtures, 'assets', 'cat.pdf')) clipboard.write({ text: 'test', html: 'Hi', rtf: '{\\rtf1\\utf8 text}', bookmark: 'a title', - image: p + image: p, + buffer: { + [pdfType]: pdf + } }) assert.equal(clipboard.readText(), text) assert.equal(clipboard.readHTML(), markup) assert.equal(clipboard.readRTF(), rtf) assert.equal(clipboard.readImage().toDataURL(), i.toDataURL()) + assert.deepEqual(clipboard.readBuffer(pdfType), pdf) if (process.platform !== 'linux') { assert.deepEqual(clipboard.readBookmark(), bookmark) From 44840ab6ccbe93e1138c5a1e970cf898fe3bae84 Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 16:23:25 +0900 Subject: [PATCH 03/11] Add docs --- docs/api/clipboard.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index 559fc01a90d..c76ab0a9590 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -157,6 +157,14 @@ Returns `String` - Reads `format` type from the clipboard. Returns `Buffer` - Reads `format` type from the clipboard. +### `clipboard.writeBuffer(format, buffer[, type])` + +* `format` String +* `buffer` Buffer +* `type` String (optional) + +Writes the `buffer` as `format` into the clipboard. + ### `clipboard.write(data[, type])` * `data` Object @@ -165,10 +173,17 @@ Returns `Buffer` - Reads `format` type from the clipboard. * `image` [NativeImage](native-image.md) (optional) * `rtf` String (optional) * `bookmark` String (optional) - The title of the url at `text`. + * `buffer` {[format: String]: Buffer} (optional) - The buffers for each format you want to write * `type` String (optional) ```javascript const {clipboard} = require('electron') -clipboard.write({text: 'test', html: 'test'}) +clipboard.write({ + text: 'test', + html: 'test', + buffer: { + 'com.adobe.pdf': pdfData + } +}) ``` Writes `data` to the clipboard. From 6ec344a499656815ab7cd3af49c23a537cd6a6da Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 16:26:57 +0900 Subject: [PATCH 04/11] Add experimental --- docs/api/clipboard.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index c76ab0a9590..75f6c381de8 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -157,7 +157,7 @@ Returns `String` - Reads `format` type from the clipboard. Returns `Buffer` - Reads `format` type from the clipboard. -### `clipboard.writeBuffer(format, buffer[, type])` +### `clipboard.writeBuffer(format, buffer[, type])` _Experimental_ * `format` String * `buffer` Buffer @@ -173,7 +173,7 @@ Writes the `buffer` as `format` into the clipboard. * `image` [NativeImage](native-image.md) (optional) * `rtf` String (optional) * `bookmark` String (optional) - The title of the url at `text`. - * `buffer` {[format: String]: Buffer} (optional) - The buffers for each format you want to write + * `buffer` {[format: String]: Buffer} (optional) _Experimental_ - The buffers for each format you want to write * `type` String (optional) ```javascript From f2471cb1b7f82d25422a5204cfbe9333caa19f80 Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 16:28:23 +0900 Subject: [PATCH 05/11] Rename buffer -> buffers --- atom/common/api/atom_api_clipboard.cc | 2 +- docs/api/clipboard.md | 4 ++-- spec/api-clipboard-spec.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index d54fc457309..2774f61ae18 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -86,7 +86,7 @@ void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { if (data.Get("image", &image)) writer.WriteImage(image.AsBitmap()); - if (data.Get("buffer", &customBuffers)) { + if (data.Get("buffers", &customBuffers)) { for (auto i = customBuffers.begin(); i != customBuffers.end(); ++i) { writer.WriteData(node::Buffer::Data(i->second), node::Buffer::Length(i->second), diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index 75f6c381de8..536a74330f6 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -173,7 +173,7 @@ Writes the `buffer` as `format` into the clipboard. * `image` [NativeImage](native-image.md) (optional) * `rtf` String (optional) * `bookmark` String (optional) - The title of the url at `text`. - * `buffer` {[format: String]: Buffer} (optional) _Experimental_ - The buffers for each format you want to write + * `buffers` {[format: String]: Buffer} (optional) _Experimental_ - The buffers for each format you want to write * `type` String (optional) ```javascript @@ -181,7 +181,7 @@ const {clipboard} = require('electron') clipboard.write({ text: 'test', html: 'test', - buffer: { + buffers: { 'com.adobe.pdf': pdfData } }) diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index c73f0fd6e64..08a79cacc47 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -76,7 +76,7 @@ describe('clipboard module', function () { rtf: '{\\rtf1\\utf8 text}', bookmark: 'a title', image: p, - buffer: { + buffers: { [pdfType]: pdf } }) From fd313ad578cf35d78662afd584ddff68c8822584 Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 16:30:23 +0900 Subject: [PATCH 06/11] Tweak doc text --- docs/api/clipboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index 536a74330f6..f96f01368c0 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -163,7 +163,7 @@ Returns `Buffer` - Reads `format` type from the clipboard. * `buffer` Buffer * `type` String (optional) -Writes the `buffer` as `format` into the clipboard. +Writes the `buffer` into the clipboard as `format`. ### `clipboard.write(data[, type])` From a26e360e827d39822b1eee99c6ff2d88d9130a7c Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 16:36:41 +0900 Subject: [PATCH 07/11] Remove console.log --- spec/api-clipboard-spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 08a79cacc47..136adc25e64 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -107,7 +107,6 @@ describe('clipboard module', function () { const buffer = Buffer.from('writeBuffer', 'utf8') clipboard.writeBuffer('public.utf8-plain-text', buffer) - console.log(clipboard.readText()) assert.equal(clipboard.readText(), 'writeBuffer') }) }) From 8f35afd941157ee7f5b63f61558caa89cad39df1 Mon Sep 17 00:00:00 2001 From: Ryohei Ikegami Date: Fri, 21 Apr 2017 18:50:17 +0900 Subject: [PATCH 08/11] Include map --- atom/common/api/atom_api_clipboard.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index 2774f61ae18..fba44bc0a39 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -4,6 +4,8 @@ #include "atom/common/api/atom_api_clipboard.h" +#include + #include "atom/common/native_mate_converters/image_converter.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "base/strings/utf_string_conversions.h" From 5adf9c47fc1251d922ea0a87092f00cac022c8e8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 22 May 2017 13:49:26 -0700 Subject: [PATCH 09/11] Remove buffers option since only a single is supported --- atom/common/api/atom_api_clipboard.cc | 11 ----------- docs/api/clipboard.md | 9 +-------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index fba44bc0a39..13cf3651824 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -4,8 +4,6 @@ #include "atom/common/api/atom_api_clipboard.h" -#include - #include "atom/common/native_mate_converters/image_converter.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "base/strings/utf_string_conversions.h" @@ -68,7 +66,6 @@ void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); base::string16 text, html, bookmark; gfx::Image image; - std::map> customBuffers; if (data.Get("text", &text)) { writer.WriteText(text); @@ -87,14 +84,6 @@ void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { if (data.Get("image", &image)) writer.WriteImage(image.AsBitmap()); - - if (data.Get("buffers", &customBuffers)) { - for (auto i = customBuffers.begin(); i != customBuffers.end(); ++i) { - writer.WriteData(node::Buffer::Data(i->second), - node::Buffer::Length(i->second), - ui::Clipboard::GetFormatType(i->first)); - } - } } base::string16 Clipboard::ReadText(mate::Arguments* args) { diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index f96f01368c0..ef62acb8bb0 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -173,17 +173,10 @@ Writes the `buffer` into the clipboard as `format`. * `image` [NativeImage](native-image.md) (optional) * `rtf` String (optional) * `bookmark` String (optional) - The title of the url at `text`. - * `buffers` {[format: String]: Buffer} (optional) _Experimental_ - The buffers for each format you want to write * `type` String (optional) ```javascript const {clipboard} = require('electron') -clipboard.write({ - text: 'test', - html: 'test', - buffers: { - 'com.adobe.pdf': pdfData - } -}) +clipboard.write({text: 'test', html: 'test'}) ``` Writes `data` to the clipboard. From 6b7ec621e381c5f315f3a61f5e3c538f4baabdae Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 22 May 2017 13:53:58 -0700 Subject: [PATCH 10/11] Throw error when non-Buffer specified instead of crashing --- atom/common/api/atom_api_clipboard.cc | 10 +++++++--- spec/api-clipboard-spec.js | 6 ++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index 13cf3651824..430d8629379 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -53,13 +53,17 @@ v8::Local Clipboard::ReadBuffer(const std::string& format_string, args->isolate(), data.data(), data.length()).ToLocalChecked(); } -void Clipboard::WriteBuffer(const std::string& format_string, +void Clipboard::WriteBuffer(const std::string& format, const v8::Local buffer, mate::Arguments* args) { - auto format = ui::Clipboard::GetFormatType(format_string); + if (!node::Buffer::HasInstance(buffer)) { + args->ThrowError("buffer must be a node Buffer"); + return; + } + ui::ScopedClipboardWriter writer(GetClipboardType(args)); writer.WriteData(node::Buffer::Data(buffer), node::Buffer::Length(buffer), - format); + ui::Clipboard::GetFormatType(format)); } void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) { diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 136adc25e64..02ed3ea5f7a 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -109,6 +109,12 @@ describe('clipboard module', function () { clipboard.writeBuffer('public.utf8-plain-text', buffer) assert.equal(clipboard.readText(), 'writeBuffer') }) + + it('throws an error when a non-Buffer is specified', () => { + assert.throws(() => { + clipboard.writeBuffer('public.utf8-plain-text', 'hello') + }, /buffer must be a node Buffer/) + }) }) describe('clipboard.readBuffer(format)', function () { From ad9496144f0f9cc0568587b1bc585ddbf579a69f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 22 May 2017 13:55:19 -0700 Subject: [PATCH 11/11] Remove buffers setting in write spec --- spec/api-clipboard-spec.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 02ed3ea5f7a..84a4de742ea 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -1,6 +1,5 @@ const assert = require('assert') const path = require('path') -const fs = require('fs') const {Buffer} = require('buffer') const {clipboard, nativeImage} = require('electron') @@ -68,23 +67,17 @@ describe('clipboard module', function () { var i = nativeImage.createFromPath(p) var markup = process.platform === 'darwin' ? "Hi" : process.platform === 'linux' ? 'Hi' : 'Hi' var bookmark = {title: 'a title', url: 'test'} - const pdfType = process.platform === 'darwin' ? 'com.adobe.pdf' : 'application/pdf' - const pdf = fs.readFileSync(path.join(fixtures, 'assets', 'cat.pdf')) clipboard.write({ text: 'test', html: 'Hi', rtf: '{\\rtf1\\utf8 text}', bookmark: 'a title', - image: p, - buffers: { - [pdfType]: pdf - } + image: p }) assert.equal(clipboard.readText(), text) assert.equal(clipboard.readHTML(), markup) assert.equal(clipboard.readRTF(), rtf) assert.equal(clipboard.readImage().toDataURL(), i.toDataURL()) - assert.deepEqual(clipboard.readBuffer(pdfType), pdf) if (process.platform !== 'linux') { assert.deepEqual(clipboard.readBookmark(), bookmark)