atom_api_clipboard.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Copyright (c) 2013 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "atom/common/api/atom_api_clipboard.h"
  5. #include "atom/common/native_mate_converters/image_converter.h"
  6. #include "atom/common/native_mate_converters/string16_converter.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "ui/base/clipboard/scoped_clipboard_writer.h"
  9. #include "atom/common/node_includes.h"
  10. namespace atom {
  11. namespace api {
  12. ui::ClipboardType Clipboard::GetClipboardType(mate::Arguments* args) {
  13. std::string type;
  14. if (args->GetNext(&type) && type == "selection")
  15. return ui::CLIPBOARD_TYPE_SELECTION;
  16. else
  17. return ui::CLIPBOARD_TYPE_COPY_PASTE;
  18. }
  19. std::vector<base::string16> Clipboard::AvailableFormats(mate::Arguments* args) {
  20. std::vector<base::string16> format_types;
  21. bool ignore;
  22. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  23. clipboard->ReadAvailableTypes(GetClipboardType(args), &format_types, &ignore);
  24. return format_types;
  25. }
  26. bool Clipboard::Has(const std::string& format_string, mate::Arguments* args) {
  27. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  28. ui::Clipboard::FormatType format(ui::Clipboard::GetFormatType(format_string));
  29. return clipboard->IsFormatAvailable(format, GetClipboardType(args));
  30. }
  31. std::string Clipboard::Read(const std::string& format_string,
  32. mate::Arguments* args) {
  33. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  34. ui::Clipboard::FormatType format(ui::Clipboard::GetFormatType(format_string));
  35. std::string data;
  36. clipboard->ReadData(format, &data);
  37. return data;
  38. }
  39. void Clipboard::Write(const mate::Dictionary& data, mate::Arguments* args) {
  40. ui::ScopedClipboardWriter writer(GetClipboardType(args));
  41. base::string16 text, html, bookmark;
  42. gfx::Image image;
  43. if (data.Get("text", &text)) {
  44. writer.WriteText(text);
  45. if (data.Get("bookmark", &bookmark))
  46. writer.WriteBookmark(bookmark, base::UTF16ToUTF8(text));
  47. }
  48. if (data.Get("rtf", &text)) {
  49. std::string rtf = base::UTF16ToUTF8(text);
  50. writer.WriteRTF(rtf);
  51. }
  52. if (data.Get("html", &html))
  53. writer.WriteHTML(html, std::string());
  54. if (data.Get("image", &image))
  55. writer.WriteImage(image.AsBitmap());
  56. }
  57. base::string16 Clipboard::ReadText(mate::Arguments* args) {
  58. base::string16 data;
  59. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  60. auto type = GetClipboardType(args);
  61. if (clipboard->IsFormatAvailable(
  62. ui::Clipboard::GetPlainTextWFormatType(), type)) {
  63. clipboard->ReadText(type, &data);
  64. } else if (clipboard->IsFormatAvailable(
  65. ui::Clipboard::GetPlainTextFormatType(), type)) {
  66. std::string result;
  67. clipboard->ReadAsciiText(type, &result);
  68. data = base::ASCIIToUTF16(result);
  69. }
  70. return data;
  71. }
  72. void Clipboard::WriteText(const base::string16& text, mate::Arguments* args) {
  73. ui::ScopedClipboardWriter writer(GetClipboardType(args));
  74. writer.WriteText(text);
  75. }
  76. base::string16 Clipboard::ReadRtf(mate::Arguments* args) {
  77. std::string data;
  78. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  79. clipboard->ReadRTF(GetClipboardType(args), &data);
  80. return base::UTF8ToUTF16(data);
  81. }
  82. void Clipboard::WriteRtf(const std::string& text, mate::Arguments* args) {
  83. ui::ScopedClipboardWriter writer(GetClipboardType(args));
  84. writer.WriteRTF(text);
  85. }
  86. base::string16 Clipboard::ReadHtml(mate::Arguments* args) {
  87. base::string16 data;
  88. base::string16 html;
  89. std::string url;
  90. uint32_t start;
  91. uint32_t end;
  92. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  93. clipboard->ReadHTML(GetClipboardType(args), &html, &url, &start, &end);
  94. data = html.substr(start, end - start);
  95. return data;
  96. }
  97. void Clipboard::WriteHtml(const base::string16& html, mate::Arguments* args) {
  98. ui::ScopedClipboardWriter writer(GetClipboardType(args));
  99. writer.WriteHTML(html, std::string());
  100. }
  101. v8::Local<v8::Value> Clipboard::ReadBookmark(mate::Arguments* args) {
  102. base::string16 title;
  103. std::string url;
  104. mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate());
  105. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  106. clipboard->ReadBookmark(&title, &url);
  107. dict.Set("title", title);
  108. dict.Set("url", url);
  109. return dict.GetHandle();
  110. }
  111. void Clipboard::WriteBookmark(const base::string16& title,
  112. const std::string& url,
  113. mate::Arguments* args) {
  114. ui::ScopedClipboardWriter writer(GetClipboardType(args));
  115. writer.WriteBookmark(title, url);
  116. }
  117. gfx::Image Clipboard::ReadImage(mate::Arguments* args) {
  118. ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  119. SkBitmap bitmap = clipboard->ReadImage(GetClipboardType(args));
  120. return gfx::Image::CreateFrom1xBitmap(bitmap);
  121. }
  122. void Clipboard::WriteImage(const gfx::Image& image, mate::Arguments* args) {
  123. ui::ScopedClipboardWriter writer(GetClipboardType(args));
  124. writer.WriteImage(image.AsBitmap());
  125. }
  126. #if !defined(OS_MACOSX)
  127. void Clipboard::WriteFindText(const base::string16& text) {}
  128. base::string16 Clipboard::ReadFindText() { return base::string16(); }
  129. #endif
  130. void Clipboard::Clear(mate::Arguments* args) {
  131. ui::Clipboard::GetForCurrentThread()->Clear(GetClipboardType(args));
  132. }
  133. } // namespace api
  134. } // namespace atom
  135. namespace {
  136. void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
  137. v8::Local<v8::Context> context, void* priv) {
  138. mate::Dictionary dict(context->GetIsolate(), exports);
  139. dict.SetMethod("availableFormats", &atom::api::Clipboard::AvailableFormats);
  140. dict.SetMethod("has", &atom::api::Clipboard::Has);
  141. dict.SetMethod("read", &atom::api::Clipboard::Read);
  142. dict.SetMethod("write", &atom::api::Clipboard::Write);
  143. dict.SetMethod("readText", &atom::api::Clipboard::ReadText);
  144. dict.SetMethod("writeText", &atom::api::Clipboard::WriteText);
  145. dict.SetMethod("readRTF", &atom::api::Clipboard::ReadRtf);
  146. dict.SetMethod("writeRTF", &atom::api::Clipboard::WriteRtf);
  147. dict.SetMethod("readHTML", &atom::api::Clipboard::ReadHtml);
  148. dict.SetMethod("writeHTML", &atom::api::Clipboard::WriteHtml);
  149. dict.SetMethod("readBookmark", &atom::api::Clipboard::ReadBookmark);
  150. dict.SetMethod("writeBookmark", &atom::api::Clipboard::WriteBookmark);
  151. dict.SetMethod("readImage", &atom::api::Clipboard::ReadImage);
  152. dict.SetMethod("writeImage", &atom::api::Clipboard::WriteImage);
  153. dict.SetMethod("readFindText", &atom::api::Clipboard::ReadFindText);
  154. dict.SetMethod("writeFindText", &atom::api::Clipboard::WriteFindText);
  155. dict.SetMethod("clear", &atom::api::Clipboard::Clear);
  156. // TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings
  157. dict.SetMethod("readRtf", &atom::api::Clipboard::ReadRtf);
  158. dict.SetMethod("writeRtf", &atom::api::Clipboard::WriteRtf);
  159. dict.SetMethod("readHtml", &atom::api::Clipboard::ReadHtml);
  160. dict.SetMethod("writeHtml", &atom::api::Clipboard::WriteHtml);
  161. }
  162. } // namespace
  163. NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_common_clipboard, Initialize)