Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1075)

Side by Side Diff: ui/base/clipboard/clipboard_mac.mm

Issue 8801038: Make Clipboard::FormatType an opaque handle type. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Linux build too? Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/file_path.h" 10 #include "base/file_path.h"
10 #include "base/logging.h" 11 #include "base/logging.h"
11 #include "base/mac/mac_util.h" 12 #include "base/mac/mac_util.h"
12 #include "base/mac/scoped_cftyperef.h" 13 #include "base/mac/scoped_cftyperef.h"
13 #include "base/memory/scoped_nsobject.h" 14 #include "base/memory/scoped_nsobject.h"
15 #include "base/stl_util.h"
14 #include "base/sys_string_conversions.h" 16 #include "base/sys_string_conversions.h"
15 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
16 #import "third_party/mozilla/NSPasteboard+Utils.h" 18 #import "third_party/mozilla/NSPasteboard+Utils.h"
17 #include "third_party/skia/include/core/SkBitmap.h" 19 #include "third_party/skia/include/core/SkBitmap.h"
18 #include "ui/base/clipboard/custom_data_helper.h" 20 #include "ui/base/clipboard/custom_data_helper.h"
19 #include "ui/gfx/canvas_skia.h" 21 #include "ui/gfx/canvas_skia.h"
20 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" 22 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
21 #include "ui/gfx/size.h" 23 #include "ui/gfx/size.h"
22 24
23 namespace ui { 25 namespace ui {
(...skipping 14 matching lines...) Expand all
38 // The pasteboard should not be nil in a UI session, but this handy DCHECK 40 // The pasteboard should not be nil in a UI session, but this handy DCHECK
39 // can help track down problems if someone tries using clipboard code outside 41 // can help track down problems if someone tries using clipboard code outside
40 // of a UI session. 42 // of a UI session.
41 NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; 43 NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
42 DCHECK(pasteboard); 44 DCHECK(pasteboard);
43 return pasteboard; 45 return pasteboard;
44 } 46 }
45 47
46 } // namespace 48 } // namespace
47 49
50 Clipboard::FormatType::FormatType() {
51 }
52
53 Clipboard::FormatType::FormatType(NSString* native_format)
54 : data_([native_format retain]) {
55 }
56
57 Clipboard::FormatType::~FormatType() {
58 [data_ release];
59 }
60
48 Clipboard::Clipboard() { 61 Clipboard::Clipboard() {
49 } 62 }
50 63
51 Clipboard::~Clipboard() { 64 Clipboard::~Clipboard() {
52 } 65 }
53 66
54 void Clipboard::WriteObjects(const ObjectMap& objects) { 67 void Clipboard::WriteObjects(const ObjectMap& objects) {
55 NSPasteboard* pb = GetPasteboard(); 68 NSPasteboard* pb = GetPasteboard();
56 [pb declareTypes:[NSArray array] owner:nil]; 69 [pb declareTypes:[NSArray array] owner:nil];
57 70
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 // For now, spit out the image as a TIFF. 163 // For now, spit out the image as a TIFF.
151 NSPasteboard* pb = GetPasteboard(); 164 NSPasteboard* pb = GetPasteboard();
152 [pb addTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:nil]; 165 [pb addTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:nil];
153 NSData *tiff_data = [image TIFFRepresentation]; 166 NSData *tiff_data = [image TIFFRepresentation];
154 LOG_IF(ERROR, tiff_data == NULL) << "Failed to allocate image for clipboard"; 167 LOG_IF(ERROR, tiff_data == NULL) << "Failed to allocate image for clipboard";
155 if (tiff_data) { 168 if (tiff_data) {
156 [pb setData:tiff_data forType:NSTIFFPboardType]; 169 [pb setData:tiff_data forType:NSTIFFPboardType];
157 } 170 }
158 } 171 }
159 172
160 void Clipboard::WriteData(const char* format_name, size_t format_len, 173 void Clipboard::WriteData(const FormatType& format,
161 const char* data_data, size_t data_len) { 174 const char* data_data,
175 size_t data_len) {
162 NSPasteboard* pb = GetPasteboard(); 176 NSPasteboard* pb = GetPasteboard();
163 scoped_nsobject<NSString> format( 177 [pb addTypes:[NSArray arrayWithObject:format.data()] owner:nil];
164 [[NSString alloc] initWithBytes:format_name
165 length:format_len
166 encoding:NSUTF8StringEncoding]);
167 [pb addTypes:[NSArray arrayWithObject:format] owner:nil];
168 [pb setData:[NSData dataWithBytes:data_data length:data_len] 178 [pb setData:[NSData dataWithBytes:data_data length:data_len]
169 forType:format]; 179 forType:format.data()];
170 } 180 }
171 181
172 // Write an extra flavor that signifies WebKit was the last to modify the 182 // Write an extra flavor that signifies WebKit was the last to modify the
173 // pasteboard. This flavor has no data. 183 // pasteboard. This flavor has no data.
174 void Clipboard::WriteWebSmartPaste() { 184 void Clipboard::WriteWebSmartPaste() {
175 NSPasteboard* pb = GetPasteboard(); 185 NSPasteboard* pb = GetPasteboard();
176 NSString* format = base::SysUTF8ToNSString(GetWebKitSmartPasteFormatType()); 186 NSString* format = GetWebKitSmartPasteFormatType().data();
177 [pb addTypes:[NSArray arrayWithObject:format] owner:nil]; 187 [pb addTypes:[NSArray arrayWithObject:format] owner:nil];
178 [pb setData:nil forType:format]; 188 [pb setData:nil forType:format];
179 } 189 }
180 190
181 uint64 Clipboard::GetSequenceNumber(Buffer buffer) { 191 uint64 Clipboard::GetSequenceNumber(Buffer buffer) {
182 DCHECK_EQ(buffer, BUFFER_STANDARD); 192 DCHECK_EQ(buffer, BUFFER_STANDARD);
183 193
184 NSPasteboard* pb = GetPasteboard(); 194 NSPasteboard* pb = GetPasteboard();
185 return [pb changeCount]; 195 return [pb changeCount];
186 } 196 }
187 197
188 bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format, 198 bool Clipboard::IsFormatAvailable(const FormatType& format,
189 Buffer buffer) const { 199 Buffer buffer) const {
190 DCHECK_EQ(buffer, BUFFER_STANDARD); 200 DCHECK_EQ(buffer, BUFFER_STANDARD);
191 NSString* format_ns = base::SysUTF8ToNSString(format);
192 201
193 NSPasteboard* pb = GetPasteboard(); 202 NSPasteboard* pb = GetPasteboard();
194 NSArray* types = [pb types]; 203 NSArray* types = [pb types];
195 204
196 // Safari only places RTF on the pasteboard, never HTML. We can convert RTF 205 // Safari only places RTF on the pasteboard, never HTML. We can convert RTF
197 // to HTML, so the presence of either indicates success when looking for HTML. 206 // to HTML, so the presence of either indicates success when looking for HTML.
198 if ([format_ns isEqualToString:NSHTMLPboardType]) { 207 if ([format.data() isEqualToString:NSHTMLPboardType]) {
199 return [types containsObject:NSHTMLPboardType] || 208 return [types containsObject:NSHTMLPboardType] ||
200 [types containsObject:NSRTFPboardType]; 209 [types containsObject:NSRTFPboardType];
201 } 210 }
202 return [types containsObject:format_ns]; 211 return [types containsObject:format.data()];
203 }
204
205 bool Clipboard::IsFormatAvailableByString(const std::string& format,
206 Buffer buffer) const {
207 DCHECK_EQ(buffer, BUFFER_STANDARD);
208 NSString* format_ns = base::SysUTF8ToNSString(format);
209
210 NSPasteboard* pb = GetPasteboard();
211 NSArray* types = [pb types];
212
213 return [types containsObject:format_ns];
214 } 212 }
215 213
216 void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer, 214 void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
217 std::vector<string16>* types, 215 std::vector<string16>* types,
218 bool* contains_filenames) const { 216 bool* contains_filenames) const {
219 if (!types || !contains_filenames) {
220 NOTREACHED();
221 return;
222 }
223
224 types->clear(); 217 types->clear();
225 if (IsFormatAvailable(Clipboard::GetPlainTextFormatType(), buffer)) 218 if (IsFormatAvailable(Clipboard::GetPlainTextFormatType(), buffer))
226 types->push_back(UTF8ToUTF16(kMimeTypeText)); 219 types->push_back(UTF8ToUTF16(kMimeTypeText));
227 if (IsFormatAvailable(Clipboard::GetHtmlFormatType(), buffer)) 220 if (IsFormatAvailable(Clipboard::GetHtmlFormatType(), buffer))
228 types->push_back(UTF8ToUTF16(kMimeTypeHTML)); 221 types->push_back(UTF8ToUTF16(kMimeTypeHTML));
229 if ([NSImage canInitWithPasteboard:GetPasteboard()]) 222 if ([NSImage canInitWithPasteboard:GetPasteboard()])
230 types->push_back(UTF8ToUTF16(kMimeTypePNG)); 223 types->push_back(UTF8ToUTF16(kMimeTypePNG));
231 *contains_filenames = false; 224 *contains_filenames = false;
232 225
233 NSPasteboard* pb = GetPasteboard(); 226 NSPasteboard* pb = GetPasteboard();
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 368
376 NSPasteboard* pb = GetPasteboard(); 369 NSPasteboard* pb = GetPasteboard();
377 NSArray* fileList = [pb propertyListForType:NSFilenamesPboardType]; 370 NSArray* fileList = [pb propertyListForType:NSFilenamesPboardType];
378 371
379 for (unsigned int i = 0; i < [fileList count]; ++i) { 372 for (unsigned int i = 0; i < [fileList count]; ++i) {
380 std::string file = [[fileList objectAtIndex:i] UTF8String]; 373 std::string file = [[fileList objectAtIndex:i] UTF8String];
381 files->push_back(FilePath(file)); 374 files->push_back(FilePath(file));
382 } 375 }
383 } 376 }
384 377
385 void Clipboard::ReadData(const std::string& format, std::string* result) const { 378 void Clipboard::ReadData(const FormatType& format, std::string* result) const {
386 NSPasteboard* pb = GetPasteboard(); 379 NSPasteboard* pb = GetPasteboard();
387 NSData* data = [pb dataForType:base::SysUTF8ToNSString(format)]; 380 NSData* data = [pb dataForType:format.data()];
388 if ([data length]) 381 if ([data length])
389 result->assign(static_cast<const char*>([data bytes]), [data length]); 382 result->assign(static_cast<const char*>([data bytes]), [data length]);
390 } 383 }
391 384
392 // static 385 // static
393 Clipboard::FormatType Clipboard::GetUrlFormatType() { 386 Clipboard::FormatType Clipboard::RegisterFormatType(
394 return base::SysNSStringToUTF8(NSURLPboardType); 387 const std::string& format_string) {
388 return StringToFormatType(format_string);
389 }
390
391 std::string Clipboard::FormatTypeToString(const FormatType& type) {
392 return base::SysNSStringToUTF8(type.data());
395 } 393 }
396 394
397 // static 395 // static
398 Clipboard::FormatType Clipboard::GetUrlWFormatType() { 396 Clipboard::FormatType Clipboard::StringToFormatType(
399 return base::SysNSStringToUTF8(NSURLPboardType); 397 const std::string& format_string) {
398 return FormatType(base::SysUTF8ToNSString(format_string));
400 } 399 }
401 400
402 // static 401 // static
403 Clipboard::FormatType Clipboard::GetPlainTextFormatType() { 402 const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
404 return base::SysNSStringToUTF8(NSStringPboardType); 403 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSURLPboardType));
404 return type;
405 } 405 }
406 406
407 // static 407 // static
408 Clipboard::FormatType Clipboard::GetPlainTextWFormatType() { 408 const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
409 return base::SysNSStringToUTF8(NSStringPboardType); 409 return GetUrlFormatType();
410 } 410 }
411 411
412 // static 412 // static
413 Clipboard::FormatType Clipboard::GetFilenameFormatType() { 413 const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
414 return base::SysNSStringToUTF8(NSFilenamesPboardType); 414 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSStringPboardType));
415 return type;
415 } 416 }
416 417
417 // static 418 // static
418 Clipboard::FormatType Clipboard::GetFilenameWFormatType() { 419 const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
419 return base::SysNSStringToUTF8(NSFilenamesPboardType); 420 return GetPlainTextFormatType();
420 } 421 }
421 422
422 // static 423 // static
423 Clipboard::FormatType Clipboard::GetHtmlFormatType() { 424 const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
424 return base::SysNSStringToUTF8(NSHTMLPboardType); 425 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSFilenamesPboardType));
426 return type;
425 } 427 }
426 428
427 // static 429 // static
428 Clipboard::FormatType Clipboard::GetBitmapFormatType() { 430 const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
429 return base::SysNSStringToUTF8(NSTIFFPboardType); 431 return GetFilenameFormatType();
430 } 432 }
431 433
432 // static 434 // static
433 Clipboard::FormatType Clipboard::GetWebKitSmartPasteFormatType() { 435 const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
434 return base::SysNSStringToUTF8(kWebSmartPastePboardType); 436 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSHTMLPboardType));
437 return type;
435 } 438 }
436 439
437 // static 440 // static
438 Clipboard::FormatType Clipboard::GetWebCustomDataFormatType() { 441 const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
439 return base::SysNSStringToUTF8(kWebCustomDataType); 442 CR_DEFINE_STATIC_LOCAL(FormatType, type, (NSTIFFPboardType));
443 return type;
444 }
445
446 // static
447 const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
448 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kWebSmartPastePboardType));
449 return type;
450 }
451
452 // static
453 const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
454 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kWebCustomDataType));
455 return type;
440 } 456 }
441 457
442 } // namespace ui 458 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698