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 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/mac/mac_util.h" | 12 #include "base/mac/mac_util.h" |
13 #include "base/mac/scoped_cftyperef.h" | 13 #include "base/mac/scoped_cftyperef.h" |
14 #include "base/memory/scoped_nsobject.h" | 14 #include "base/memory/scoped_nsobject.h" |
15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
16 #include "base/sys_string_conversions.h" | 16 #include "base/sys_string_conversions.h" |
17 #include "base/utf_string_conversions.h" | 17 #include "base/utf_string_conversions.h" |
18 #import "third_party/mozilla/NSPasteboard+Utils.h" | 18 #import "third_party/mozilla/NSPasteboard+Utils.h" |
19 #include "third_party/skia/include/core/SkBitmap.h" | 19 #include "third_party/skia/include/core/SkBitmap.h" |
20 #include "ui/base/clipboard/custom_data_helper.h" | 20 #include "ui/base/clipboard/custom_data_helper.h" |
21 #include "ui/gfx/canvas.h" | 21 #include "ui/gfx/canvas.h" |
22 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 22 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
23 #include "ui/gfx/size.h" | 23 #include "ui/gfx/size.h" |
24 | 24 |
25 namespace ui { | 25 namespace ui { |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 // Source tag format type. | |
30 NSString* const kSourceTagPboardType = @"org.chromium.source-tag-data"; | |
31 | |
32 // Would be nice if this were in UTCoreTypes.h, but it isn't | 29 // Would be nice if this were in UTCoreTypes.h, but it isn't |
33 NSString* const kUTTypeURLName = @"public.url-name"; | 30 NSString* const kUTTypeURLName = @"public.url-name"; |
34 | 31 |
35 // Tells us if WebKit was the last to write to the pasteboard. There's no | 32 // Tells us if WebKit was the last to write to the pasteboard. There's no |
36 // actual data associated with this type. | 33 // actual data associated with this type. |
37 NSString* const kWebSmartPastePboardType = @"NeXT smart paste pasteboard type"; | 34 NSString* const kWebSmartPastePboardType = @"NeXT smart paste pasteboard type"; |
38 | 35 |
39 // Pepper custom data format type. | 36 // Pepper custom data format type. |
40 NSString* const kPepperCustomDataPboardType = | 37 NSString* const kPepperCustomDataPboardType = |
41 @"org.chromium.pepper-custom-data"; | 38 @"org.chromium.pepper-custom-data"; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 } | 83 } |
87 | 84 |
88 Clipboard::Clipboard() { | 85 Clipboard::Clipboard() { |
89 DCHECK(CalledOnValidThread()); | 86 DCHECK(CalledOnValidThread()); |
90 } | 87 } |
91 | 88 |
92 Clipboard::~Clipboard() { | 89 Clipboard::~Clipboard() { |
93 DCHECK(CalledOnValidThread()); | 90 DCHECK(CalledOnValidThread()); |
94 } | 91 } |
95 | 92 |
96 void Clipboard::WriteObjectsImpl(Buffer buffer, | 93 void Clipboard::WriteObjects(Buffer buffer, const ObjectMap& objects) { |
97 const ObjectMap& objects, | |
98 SourceTag tag) { | |
99 DCHECK(CalledOnValidThread()); | 94 DCHECK(CalledOnValidThread()); |
100 DCHECK_EQ(buffer, BUFFER_STANDARD); | 95 DCHECK_EQ(buffer, BUFFER_STANDARD); |
101 | 96 |
102 NSPasteboard* pb = GetPasteboard(); | 97 NSPasteboard* pb = GetPasteboard(); |
103 [pb declareTypes:[NSArray array] owner:nil]; | 98 [pb declareTypes:[NSArray array] owner:nil]; |
104 | 99 |
105 for (ObjectMap::const_iterator iter = objects.begin(); | 100 for (ObjectMap::const_iterator iter = objects.begin(); |
106 iter != objects.end(); ++iter) { | 101 iter != objects.end(); ++iter) { |
107 DispatchObject(static_cast<ObjectType>(iter->first), iter->second); | 102 DispatchObject(static_cast<ObjectType>(iter->first), iter->second); |
108 } | 103 } |
109 WriteSourceTag(tag); | |
110 } | 104 } |
111 | 105 |
112 void Clipboard::WriteText(const char* text_data, size_t text_len) { | 106 void Clipboard::WriteText(const char* text_data, size_t text_len) { |
113 std::string text_str(text_data, text_len); | 107 std::string text_str(text_data, text_len); |
114 NSString *text = base::SysUTF8ToNSString(text_str); | 108 NSString *text = base::SysUTF8ToNSString(text_str); |
115 NSPasteboard* pb = GetPasteboard(); | 109 NSPasteboard* pb = GetPasteboard(); |
116 [pb addTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; | 110 [pb addTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; |
117 [pb setString:text forType:NSStringPboardType]; | 111 [pb setString:text forType:NSStringPboardType]; |
118 } | 112 } |
119 | 113 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 | 205 |
212 void Clipboard::WriteData(const FormatType& format, | 206 void Clipboard::WriteData(const FormatType& format, |
213 const char* data_data, | 207 const char* data_data, |
214 size_t data_len) { | 208 size_t data_len) { |
215 NSPasteboard* pb = GetPasteboard(); | 209 NSPasteboard* pb = GetPasteboard(); |
216 [pb addTypes:[NSArray arrayWithObject:format.ToNSString()] owner:nil]; | 210 [pb addTypes:[NSArray arrayWithObject:format.ToNSString()] owner:nil]; |
217 [pb setData:[NSData dataWithBytes:data_data length:data_len] | 211 [pb setData:[NSData dataWithBytes:data_data length:data_len] |
218 forType:format.ToNSString()]; | 212 forType:format.ToNSString()]; |
219 } | 213 } |
220 | 214 |
221 void Clipboard::WriteSourceTag(SourceTag tag) { | |
222 if (tag != SourceTag()) { | |
223 ObjectMapParam binary = SourceTag2Binary(tag); | |
224 WriteData(GetSourceTagFormatType(), &binary[0], binary.size()); | |
225 } | |
226 } | |
227 | |
228 // Write an extra flavor that signifies WebKit was the last to modify the | 215 // Write an extra flavor that signifies WebKit was the last to modify the |
229 // pasteboard. This flavor has no data. | 216 // pasteboard. This flavor has no data. |
230 void Clipboard::WriteWebSmartPaste() { | 217 void Clipboard::WriteWebSmartPaste() { |
231 NSPasteboard* pb = GetPasteboard(); | 218 NSPasteboard* pb = GetPasteboard(); |
232 NSString* format = GetWebKitSmartPasteFormatType().ToNSString(); | 219 NSString* format = GetWebKitSmartPasteFormatType().ToNSString(); |
233 [pb addTypes:[NSArray arrayWithObject:format] owner:nil]; | 220 [pb addTypes:[NSArray arrayWithObject:format] owner:nil]; |
234 [pb setData:nil forType:format]; | 221 [pb setData:nil forType:format]; |
235 } | 222 } |
236 | 223 |
237 uint64 Clipboard::GetSequenceNumber(Buffer buffer) { | 224 uint64 Clipboard::GetSequenceNumber(Buffer buffer) { |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 } | 403 } |
417 | 404 |
418 void Clipboard::ReadData(const FormatType& format, std::string* result) const { | 405 void Clipboard::ReadData(const FormatType& format, std::string* result) const { |
419 DCHECK(CalledOnValidThread()); | 406 DCHECK(CalledOnValidThread()); |
420 NSPasteboard* pb = GetPasteboard(); | 407 NSPasteboard* pb = GetPasteboard(); |
421 NSData* data = [pb dataForType:format.ToNSString()]; | 408 NSData* data = [pb dataForType:format.ToNSString()]; |
422 if ([data length]) | 409 if ([data length]) |
423 result->assign(static_cast<const char*>([data bytes]), [data length]); | 410 result->assign(static_cast<const char*>([data bytes]), [data length]); |
424 } | 411 } |
425 | 412 |
426 Clipboard::SourceTag Clipboard::ReadSourceTag(Buffer buffer) const { | |
427 DCHECK_EQ(buffer, BUFFER_STANDARD); | |
428 std::string result; | |
429 ReadData(GetSourceTagFormatType(), &result); | |
430 return Binary2SourceTag(result); | |
431 } | |
432 | |
433 // static | 413 // static |
434 Clipboard::FormatType Clipboard::GetFormatType( | 414 Clipboard::FormatType Clipboard::GetFormatType( |
435 const std::string& format_string) { | 415 const std::string& format_string) { |
436 return FormatType::Deserialize(format_string); | 416 return FormatType::Deserialize(format_string); |
437 } | 417 } |
438 | 418 |
439 // static | 419 // static |
440 const Clipboard::FormatType& Clipboard::GetUrlFormatType() { | 420 const Clipboard::FormatType& Clipboard::GetUrlFormatType() { |
441 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSURLPboardType)); | 421 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSURLPboardType)); |
442 return type; | 422 return type; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kWebCustomDataPboardType)); | 478 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kWebCustomDataPboardType)); |
499 return type; | 479 return type; |
500 } | 480 } |
501 | 481 |
502 // static | 482 // static |
503 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { | 483 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() { |
504 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kPepperCustomDataPboardType)); | 484 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kPepperCustomDataPboardType)); |
505 return type; | 485 return type; |
506 } | 486 } |
507 | 487 |
508 // static | |
509 const Clipboard::FormatType& Clipboard::GetSourceTagFormatType() { | |
510 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kSourceTagPboardType)); | |
511 return type; | |
512 } | |
513 | |
514 } // namespace ui | 488 } // namespace ui |
OLD | NEW |