OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/base/clipboard/clipboard.h" | 5 #include "ui/base/clipboard/clipboard.h" |
6 | 6 |
7 #include "base/android/jni_string.h" | 7 #include "base/android/jni_string.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 namespace { | 33 namespace { |
34 // Various formats we support. | 34 // Various formats we support. |
35 const char kPlainTextFormat[] = "text"; | 35 const char kPlainTextFormat[] = "text"; |
36 const char kHTMLFormat[] = "html"; | 36 const char kHTMLFormat[] = "html"; |
37 const char kRTFFormat[] = "rtf"; | 37 const char kRTFFormat[] = "rtf"; |
38 const char kBitmapFormat[] = "bitmap"; | 38 const char kBitmapFormat[] = "bitmap"; |
39 const char kWebKitSmartPasteFormat[] = "webkit_smart"; | 39 const char kWebKitSmartPasteFormat[] = "webkit_smart"; |
40 const char kBookmarkFormat[] = "bookmark"; | 40 const char kBookmarkFormat[] = "bookmark"; |
41 const char kMimeTypePepperCustomData[] = "chromium/x-pepper-custom-data"; | 41 const char kMimeTypePepperCustomData[] = "chromium/x-pepper-custom-data"; |
42 const char kMimeTypeWebCustomData[] = "chromium/x-web-custom-data"; | 42 const char kMimeTypeWebCustomData[] = "chromium/x-web-custom-data"; |
| 43 const char kSourceTagFormat[] = "source_tag"; |
43 | 44 |
44 class ClipboardMap { | 45 class ClipboardMap { |
45 public: | 46 public: |
46 ClipboardMap(); | 47 ClipboardMap(); |
47 std::string Get(const std::string& format); | 48 std::string Get(const std::string& format); |
48 bool HasFormat(const std::string& format); | 49 bool HasFormat(const std::string& format); |
49 void Set(const std::string& format, const std::string& data); | 50 void Set(const std::string& format, const std::string& data); |
50 void Clear(); | 51 void Clear(); |
51 | 52 |
52 private: | 53 private: |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 return data_ == other.data_; | 192 return data_ == other.data_; |
192 } | 193 } |
193 | 194 |
194 Clipboard::Clipboard() { | 195 Clipboard::Clipboard() { |
195 } | 196 } |
196 | 197 |
197 Clipboard::~Clipboard() { | 198 Clipboard::~Clipboard() { |
198 } | 199 } |
199 | 200 |
200 // Main entry point used to write several values in the clipboard. | 201 // Main entry point used to write several values in the clipboard. |
201 void Clipboard::WriteObjects(Buffer buffer, const ObjectMap& objects) { | 202 void Clipboard::WriteObjectsImpl(Buffer buffer, |
| 203 const ObjectMap& objects, |
| 204 SourceTag tag) { |
202 DCHECK_EQ(buffer, BUFFER_STANDARD); | 205 DCHECK_EQ(buffer, BUFFER_STANDARD); |
203 g_map.Get().Clear(); | 206 g_map.Get().Clear(); |
204 for (ObjectMap::const_iterator iter = objects.begin(); | 207 for (ObjectMap::const_iterator iter = objects.begin(); |
205 iter != objects.end(); ++iter) { | 208 iter != objects.end(); ++iter) { |
206 DispatchObject(static_cast<ObjectType>(iter->first), iter->second); | 209 DispatchObject(static_cast<ObjectType>(iter->first), iter->second); |
207 } | 210 } |
| 211 WriteSourceTag(tag); |
208 } | 212 } |
209 | 213 |
210 uint64 Clipboard::GetSequenceNumber(Clipboard::Buffer /* buffer */) { | 214 uint64 Clipboard::GetSequenceNumber(Clipboard::Buffer /* buffer */) { |
211 // TODO: implement this. For now this interface will advertise | 215 // TODO: implement this. For now this interface will advertise |
212 // that the clipboard never changes. That's fine as long as we | 216 // that the clipboard never changes. That's fine as long as we |
213 // don't rely on this signal. | 217 // don't rely on this signal. |
214 return 0; | 218 return 0; |
215 } | 219 } |
216 | 220 |
217 bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format, | 221 bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format, |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 | 307 |
304 void Clipboard::ReadBookmark(string16* title, std::string* url) const { | 308 void Clipboard::ReadBookmark(string16* title, std::string* url) const { |
305 NOTIMPLEMENTED(); | 309 NOTIMPLEMENTED(); |
306 } | 310 } |
307 | 311 |
308 void Clipboard::ReadData(const Clipboard::FormatType& format, | 312 void Clipboard::ReadData(const Clipboard::FormatType& format, |
309 std::string* result) const { | 313 std::string* result) const { |
310 *result = g_map.Get().Get(format.data()); | 314 *result = g_map.Get().Get(format.data()); |
311 } | 315 } |
312 | 316 |
| 317 Clipboard::SourceTag Clipboard::ReadSourceTag() const { |
| 318 std::string result; |
| 319 ReadData(GetSourceTagFormatType(), &result); |
| 320 return Binary2SourceTag(result); |
| 321 } |
| 322 |
313 // static | 323 // static |
314 Clipboard::FormatType Clipboard::GetFormatType( | 324 Clipboard::FormatType Clipboard::GetFormatType( |
315 const std::string& format_string) { | 325 const std::string& format_string) { |
316 return FormatType::Deserialize(format_string); | 326 return FormatType::Deserialize(format_string); |
317 } | 327 } |
318 | 328 |
319 // static | 329 // static |
320 const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() { | 330 const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() { |
321 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kPlainTextFormat)); | 331 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kPlainTextFormat)); |
322 return type; | 332 return type; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData)); | 367 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData)); |
358 return type; | 368 return type; |
359 } | 369 } |
360 | 370 |
361 // static | 371 // static |
362 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { | 372 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { |
363 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); | 373 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData)); |
364 return type; | 374 return type; |
365 } | 375 } |
366 | 376 |
| 377 // static |
| 378 const Clipboard::FormatType& Clipboard::GetSourceTagFormatType() { |
| 379 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kSourceTagFormat)); |
| 380 return type; |
| 381 } |
| 382 |
367 void Clipboard::WriteText(const char* text_data, size_t text_len) { | 383 void Clipboard::WriteText(const char* text_data, size_t text_len) { |
368 g_map.Get().Set(kPlainTextFormat, std::string(text_data, text_len)); | 384 g_map.Get().Set(kPlainTextFormat, std::string(text_data, text_len)); |
369 } | 385 } |
370 | 386 |
371 void Clipboard::WriteHTML(const char* markup_data, | 387 void Clipboard::WriteHTML(const char* markup_data, |
372 size_t markup_len, | 388 size_t markup_len, |
373 const char* url_data, | 389 const char* url_data, |
374 size_t url_len) { | 390 size_t url_len) { |
375 g_map.Get().Set(kHTMLFormat, std::string(markup_data, markup_len)); | 391 g_map.Get().Set(kHTMLFormat, std::string(markup_data, markup_len)); |
376 } | 392 } |
(...skipping 26 matching lines...) Expand all Loading... |
403 std::string packed(size_data, sizeof(gfx::Size)); | 419 std::string packed(size_data, sizeof(gfx::Size)); |
404 packed += std::string(pixel_data, bm_size); | 420 packed += std::string(pixel_data, bm_size); |
405 g_map.Get().Set(kBitmapFormat, packed); | 421 g_map.Get().Set(kBitmapFormat, packed); |
406 } | 422 } |
407 | 423 |
408 void Clipboard::WriteData(const Clipboard::FormatType& format, | 424 void Clipboard::WriteData(const Clipboard::FormatType& format, |
409 const char* data_data, size_t data_len) { | 425 const char* data_data, size_t data_len) { |
410 g_map.Get().Set(format.data(), std::string(data_data, data_len)); | 426 g_map.Get().Set(format.data(), std::string(data_data, data_len)); |
411 } | 427 } |
412 | 428 |
| 429 void Clipboard::WriteSourceTag(SourceTag tag) { |
| 430 if (tag != SourceTag()) { |
| 431 ObjectMapParam binary = SourceTag2Binary(tag); |
| 432 WriteData(GetSourceTagFormatType(), &binary[0], binary.size()); |
| 433 } |
| 434 } |
| 435 |
413 } // namespace ui | 436 } // namespace ui |
OLD | NEW |