fix: clipboard.read() to recognize custom types (#31623)

This commit is contained in:
John Kleinschmidt 2021-11-01 10:00:36 -04:00 committed by GitHub
parent a938af3f54
commit 5899a72df9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 17 deletions

View file

@ -197,7 +197,7 @@ Returns `Boolean` - Whether the clipboard supports the specified `format`.
```js ```js
const { clipboard } = require('electron') const { clipboard } = require('electron')
const hasFormat = clipboard.has('<p>selection</p>') const hasFormat = clipboard.has('public/utf8-plain-text')
console.log(hasFormat) console.log(hasFormat)
// 'true' or 'false' // 'true' or 'false'
``` ```

View file

@ -51,17 +51,7 @@ bool Clipboard::Has(const std::string& format_string,
std::string Clipboard::Read(const std::string& format_string) { std::string Clipboard::Read(const std::string& format_string) {
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
ui::ClipboardFormatType format(
ui::ClipboardFormatType::CustomPlatformType(format_string));
std::string data;
clipboard->ReadData(format, /* data_dst = */ nullptr, &data);
return data;
}
v8::Local<v8::Value> Clipboard::ReadBuffer(const std::string& format_string,
gin_helper::Arguments* args) {
ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
std::map<std::string, std::string> custom_format_names; std::map<std::string, std::string> custom_format_names;
custom_format_names = custom_format_names =
clipboard->ExtractCustomPlatformNames(ui::ClipboardBuffer::kCopyPaste, clipboard->ExtractCustomPlatformNames(ui::ClipboardBuffer::kCopyPaste,
@ -73,12 +63,24 @@ v8::Local<v8::Value> Clipboard::ReadBuffer(const std::string& format_string,
/* data_dst = */ nullptr); /* data_dst = */ nullptr);
} }
#endif #endif
CHECK(custom_format_names.find(format_string) != custom_format_names.end());
ui::ClipboardFormatType format(ui::ClipboardFormatType::CustomPlatformType(
custom_format_names[format_string]));
ui::ClipboardFormatType format;
if (custom_format_names.find(format_string) != custom_format_names.end()) {
format =
ui::ClipboardFormatType(ui::ClipboardFormatType::CustomPlatformType(
custom_format_names[format_string]));
} else {
format = ui::ClipboardFormatType(
ui::ClipboardFormatType::CustomPlatformType(format_string));
}
std::string data; std::string data;
clipboard->ReadData(format, /* data_dst = */ nullptr, &data); clipboard->ReadData(format, /* data_dst = */ nullptr, &data);
return data;
}
v8::Local<v8::Value> Clipboard::ReadBuffer(const std::string& format_string,
gin_helper::Arguments* args) {
std::string data = Read(format_string);
return node::Buffer::Copy(args->isolate(), data.data(), data.length()) return node::Buffer::Copy(args->isolate(), data.data(), data.length())
.ToLocalChecked(); .ToLocalChecked();
} }

View file

@ -1,7 +1,7 @@
const { expect } = require('chai'); const { expect } = require('chai');
const path = require('path'); const path = require('path');
const { Buffer } = require('buffer'); const { Buffer } = require('buffer');
const { ifdescribe } = require('./spec-helpers'); const { ifdescribe, ifit } = require('./spec-helpers');
const { clipboard, nativeImage } = require('electron'); const { clipboard, nativeImage } = require('electron');
@ -62,14 +62,20 @@ ifdescribe(process.platform !== 'win32' || process.arch !== 'arm64')('clipboard
}); });
}); });
ifdescribe(process.platform !== 'linux')('clipboard.read()', () => { describe('clipboard.read()', () => {
it('does not crash when reading various custom clipboard types', () => { ifit(process.platform !== 'linux')('does not crash when reading various custom clipboard types', () => {
const type = process.platform === 'darwin' ? 'NSFilenamesPboardType' : 'FileNameW'; const type = process.platform === 'darwin' ? 'NSFilenamesPboardType' : 'FileNameW';
expect(() => { expect(() => {
const result = clipboard.read(type); const result = clipboard.read(type);
}).to.not.throw(); }).to.not.throw();
}); });
it('can read data written with writeBuffer', () => {
const testText = 'Testing read';
const buffer = Buffer.from(testText, 'utf8');
clipboard.writeBuffer('public/utf8-plain-text', buffer);
expect(clipboard.read('public/utf8-plain-text')).to.equal(testText);
});
}); });
describe('clipboard.write()', () => { describe('clipboard.write()', () => {