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

Side by Side Diff: base/clipboard_mac.mm

Issue 6580: clipboard_mac (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: '' Created 12 years, 2 months 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "base/clipboard.h" 5 #include "base/clipboard.h"
6 6
7 #import <Cocoa/Cocoa.h> 7 #import <Cocoa/Cocoa.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
11 #include "base/sys_string_conversions.h"
11 12
12 namespace { 13 namespace {
13 14
14 // Would be nice if this were in UTCoreTypes.h, but it isn't 15 // Would be nice if this were in UTCoreTypes.h, but it isn't
15 const NSString* kUTTypeURLName = @"public.url-name"; 16 const NSString* kUTTypeURLName = @"public.url-name";
16 17
17 NSString* nsStringForWString(const std::wstring& string) { 18 NSString* NSStringForWString(const std::wstring& string) {
18 string16 text16 = WideToUTF16(string); 19 CFStringRef cfstring = base::SysWideToCFStringRef(string);
19 return [NSString stringWithCharacters:text16.c_str() length:text16.length()]; 20 NSString* nsstring = (NSString*)cfstring;
21 [[nsstring retain] autorelease];
22 CFRelease(cfstring);
23 return nsstring;
24 }
25
26 NSPasteboard* GetPasteboard() {
27 // The pasteboard should not be nil in a UI session, but this handy DCHECK
28 // can help track down problems if someone tries using clipboard code outside
29 // of a UI session.
30 NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
31 DCHECK(pasteboard);
32 return pasteboard;
20 } 33 }
21 34
22 } // namespace 35 } // namespace
23 36
24 Clipboard::Clipboard() { 37 Clipboard::Clipboard() {
25 } 38 }
26 39
27 Clipboard::~Clipboard() { 40 Clipboard::~Clipboard() {
28 } 41 }
29 42
30 void Clipboard::Clear() { 43 void Clipboard::Clear() {
31 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 44 NSPasteboard* pb = GetPasteboard();
32 [pb declareTypes:[NSArray array] owner:nil]; 45 [pb declareTypes:[NSArray array] owner:nil];
33 } 46 }
34 47
35 void Clipboard::WriteText(const std::wstring& text) { 48 void Clipboard::WriteText(const std::wstring& text) {
36 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 49 NSPasteboard* pb = GetPasteboard();
37 [pb addTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; 50 [pb addTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
38 [pb setString:nsStringForWString(text) forType:NSStringPboardType]; 51 [pb setString:NSStringForWString(text) forType:NSStringPboardType];
39 } 52 }
40 53
41 void Clipboard::WriteHTML(const std::wstring& markup, 54 void Clipboard::WriteHTML(const std::wstring& markup,
42 const std::string& src_url) { 55 const std::string& src_url) {
43 // TODO(avi): src_url? 56 // TODO(avi): src_url?
44 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 57 NSPasteboard* pb = GetPasteboard();
45 [pb addTypes:[NSArray arrayWithObject:NSHTMLPboardType] owner:nil]; 58 [pb addTypes:[NSArray arrayWithObject:NSHTMLPboardType] owner:nil];
46 [pb setString:nsStringForWString(markup) forType:NSHTMLPboardType]; 59 [pb setString:NSStringForWString(markup) forType:NSHTMLPboardType];
47 } 60 }
48 61
49 void Clipboard::WriteBookmark(const std::wstring& title, 62 void Clipboard::WriteBookmark(const std::wstring& title,
50 const std::string& url) { 63 const std::string& url) {
51 WriteHyperlink(title, url); 64 WriteHyperlink(title, url);
52 } 65 }
53 66
54 void Clipboard::WriteHyperlink(const std::wstring& title, 67 void Clipboard::WriteHyperlink(const std::wstring& title,
55 const std::string& url) { 68 const std::string& url) {
56 // TODO(playmobil): In the Windows version of this function, an HTML 69 // TODO(playmobil): In the Windows version of this function, an HTML
57 // representation of the bookmark is also added to the clipboard, to support 70 // representation of the bookmark is also added to the clipboard, to support
58 // drag and drop of web shortcuts. I don't think we need to do this on the 71 // drag and drop of web shortcuts. I don't think we need to do this on the
59 // Mac, but we should double check later on. 72 // Mac, but we should double check later on.
60 NSURL* nsurl = [NSURL URLWithString: 73 NSURL* nsurl = [NSURL URLWithString:
61 [NSString stringWithUTF8String:url.c_str()]]; 74 [NSString stringWithUTF8String:url.c_str()]];
62 NSString* nstitle = nsStringForWString(title); 75 NSString* nstitle = NSStringForWString(title);
63 76
64 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 77 NSPasteboard* pb = GetPasteboard();
65 // passing UTIs into the pasteboard methods is valid >= 10.5 78 // passing UTIs into the pasteboard methods is valid >= 10.5
66 [pb addTypes:[NSArray arrayWithObjects:NSURLPboardType, 79 [pb addTypes:[NSArray arrayWithObjects:NSURLPboardType,
67 kUTTypeURLName, nil] 80 kUTTypeURLName,
68 owner:nil]; 81 nil]
82 owner:nil];
69 [nsurl writeToPasteboard:pb]; 83 [nsurl writeToPasteboard:pb];
70 [pb setString:nstitle forType:kUTTypeURLName]; 84 [pb setString:nstitle forType:kUTTypeURLName];
71 } 85 }
72 86
73 void Clipboard::WriteFile(const std::wstring& file) { 87 void Clipboard::WriteFile(const std::wstring& file) {
74 std::vector<std::wstring> files; 88 std::vector<std::wstring> files;
75 files.push_back(file); 89 files.push_back(file);
76 WriteFiles(files); 90 WriteFiles(files);
77 } 91 }
78 92
79 void Clipboard::WriteFiles(const std::vector<std::wstring>& files) { 93 void Clipboard::WriteFiles(const std::vector<std::wstring>& files) {
80 NSMutableArray* fileList = [NSMutableArray arrayWithCapacity:files.size()]; 94 NSMutableArray* fileList = [NSMutableArray arrayWithCapacity:files.size()];
81 for (unsigned int i = 0; i < files.size(); ++i) { 95 for (size_t i = 0; i < files.size(); ++i) {
82 [fileList addObject:nsStringForWString(files[i])]; 96 [fileList addObject:NSStringForWString(files[i])];
83 } 97 }
84 98
85 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 99 NSPasteboard* pb = GetPasteboard();
86 [pb addTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil]; 100 [pb addTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];
87 [pb setPropertyList:fileList forType:NSFilenamesPboardType]; 101 [pb setPropertyList:fileList forType:NSFilenamesPboardType];
88 } 102 }
89 103
90 bool Clipboard::IsFormatAvailable(NSString* format) const { 104 bool Clipboard::IsFormatAvailable(NSString* format) const {
91 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 105 NSPasteboard* pb = GetPasteboard();
92 NSArray* types = [pb types]; 106 NSArray* types = [pb types];
93 107
94 return [types containsObject:format]; 108 return [types containsObject:format];
95 } 109 }
96 110
97 void Clipboard::ReadText(std::wstring* result) const { 111 void Clipboard::ReadText(std::wstring* result) const {
98 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 112 NSPasteboard* pb = GetPasteboard();
99 NSString* contents = [pb stringForType:NSStringPboardType]; 113 NSString* contents = [pb stringForType:NSStringPboardType];
100 114
101 UTF8ToWide([contents UTF8String], 115 UTF8ToWide([contents UTF8String],
102 [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding], 116 [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding],
103 result); 117 result);
104 } 118 }
105 119
106 void Clipboard::ReadAsciiText(std::string* result) const { 120 void Clipboard::ReadAsciiText(std::string* result) const {
107 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 121 NSPasteboard* pb = GetPasteboard();
108 NSString* contents = [pb stringForType:NSStringPboardType]; 122 NSString* contents = [pb stringForType:NSStringPboardType];
109 123
110 *result = std::string([contents UTF8String]); 124 if (!contents)
125 result->clear();
126 else
127 result->assign([contents UTF8String]);
111 } 128 }
112 129
113 void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const { 130 void Clipboard::ReadHTML(std::wstring* markup, std::string* src_url) const {
114 if (markup) { 131 if (markup) {
115 markup->clear(); 132 NSPasteboard* pb = GetPasteboard();
116
117 NSPasteboard* pb = [NSPasteboard generalPasteboard];
118 NSArray *supportedTypes = [NSArray arrayWithObjects:NSHTMLPboardType, 133 NSArray *supportedTypes = [NSArray arrayWithObjects:NSHTMLPboardType,
119 NSStringPboardType, 134 NSStringPboardType,
120 nil]; 135 nil];
121 NSString *bestType = [pb availableTypeFromArray:supportedTypes]; 136 NSString *bestType = [pb availableTypeFromArray:supportedTypes];
122 NSString* contents = [pb stringForType:bestType]; 137 NSString* contents = [pb stringForType:bestType];
123 UTF8ToWide([contents UTF8String], 138 UTF8ToWide([contents UTF8String],
124 [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding], 139 [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding],
125 markup); 140 markup);
126 } 141 }
127 142
128 // TODO(avi): src_url? 143 // TODO(avi): src_url?
129 if (src_url) 144 if (src_url)
130 src_url->clear(); 145 src_url->clear();
131 } 146 }
132 147
133 void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const { 148 void Clipboard::ReadBookmark(std::wstring* title, std::string* url) const {
134 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 149 NSPasteboard* pb = GetPasteboard();
135 150
136 if (title) { 151 if (title) {
137 title->clear();
138
139 NSString* contents = [pb stringForType:kUTTypeURLName]; 152 NSString* contents = [pb stringForType:kUTTypeURLName];
140 UTF8ToWide([contents UTF8String], 153 UTF8ToWide([contents UTF8String],
141 [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding], 154 [contents lengthOfBytesUsingEncoding:NSUTF8StringEncoding],
142 title); 155 title);
143 } 156 }
144 157
145 if (url) { 158 if (url) {
146 url->clear(); 159 NSString* url_string = [[NSURL URLFromPasteboard:pb] absoluteString];
147 160 if (!url_string)
148 NSURL* nsurl = [NSURL URLFromPasteboard:pb]; 161 url->clear();
149 *url = std::string([[nsurl absoluteString] UTF8String]); 162 else
163 url->assign([url_string UTF8String]);
150 } 164 }
151 } 165 }
152 166
153 void Clipboard::ReadFile(std::wstring* file) const { 167 void Clipboard::ReadFile(std::wstring* file) const {
154 if (!file) { 168 if (!file) {
155 NOTREACHED(); 169 NOTREACHED();
156 return; 170 return;
157 } 171 }
158 172
159 file->clear(); 173 file->clear();
160 std::vector<std::wstring> files; 174 std::vector<std::wstring> files;
161 ReadFiles(&files); 175 ReadFiles(&files);
162 176
163 // Take the first file, if available. 177 // Take the first file, if available.
164 if (!files.empty()) 178 if (!files.empty())
165 file->assign(files[0]); 179 file->assign(files[0]);
166 } 180 }
167 181
168 void Clipboard::ReadFiles(std::vector<std::wstring>* files) const { 182 void Clipboard::ReadFiles(std::vector<std::wstring>* files) const {
169 if (!files) { 183 if (!files) {
170 NOTREACHED(); 184 NOTREACHED();
171 return; 185 return;
172 } 186 }
173 187
174 files->clear(); 188 files->clear();
175 189
176 NSPasteboard* pb = [NSPasteboard generalPasteboard]; 190 NSPasteboard* pb = GetPasteboard();
177 NSArray* fileList = [pb propertyListForType:NSFilenamesPboardType]; 191 NSArray* fileList = [pb propertyListForType:NSFilenamesPboardType];
178 192
179 for (unsigned int i = 0; i < [fileList count]; ++i) { 193 for (unsigned int i = 0; i < [fileList count]; ++i) {
180 std::wstring file = UTF8ToWide([[fileList objectAtIndex:i] UTF8String]); 194 std::wstring file = UTF8ToWide([[fileList objectAtIndex:i] UTF8String]);
181 files->push_back(file); 195 files->push_back(file);
182 } 196 }
183 } 197 }
184 198
185 // static 199 // static
186 Clipboard::FormatType Clipboard::GetUrlFormatType() { 200 Clipboard::FormatType Clipboard::GetUrlFormatType() {
(...skipping 22 matching lines...) Expand all
209 223
210 // static 224 // static
211 Clipboard::FormatType Clipboard::GetFilenameWFormatType() { 225 Clipboard::FormatType Clipboard::GetFilenameWFormatType() {
212 return NSFilenamesPboardType; 226 return NSFilenamesPboardType;
213 } 227 }
214 228
215 // static 229 // static
216 Clipboard::FormatType Clipboard::GetHtmlFormatType() { 230 Clipboard::FormatType Clipboard::GetHtmlFormatType() {
217 return NSHTMLPboardType; 231 return NSHTMLPboardType;
218 } 232 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698