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

Side by Side Diff: ui/base/dragdrop/os_exchange_data_provider_mac.mm

Issue 1947153003: Modify Pasteboard handling in OSExchangeData (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: used firstObject Created 4 years, 7 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/dragdrop/os_exchange_data_provider_mac.h" 5 #include "ui/base/dragdrop/os_exchange_data_provider_mac.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/pickle.h" 10 #include "base/pickle.h"
(...skipping 22 matching lines...) Expand all
33 void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() { 33 void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() {
34 NOTIMPLEMENTED(); 34 NOTIMPLEMENTED();
35 } 35 }
36 36
37 bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const { 37 bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const {
38 NOTIMPLEMENTED(); 38 NOTIMPLEMENTED();
39 return false; 39 return false;
40 } 40 }
41 41
42 void OSExchangeDataProviderMac::SetString(const base::string16& string) { 42 void OSExchangeDataProviderMac::SetString(const base::string16& string) {
43 [pasteboard_->get() writeObjects:@[ base::SysUTF16ToNSString(string) ]]; 43 [pasteboard_->get() setString:base::SysUTF16ToNSString(string)
44 forType:NSPasteboardTypeString];
44 } 45 }
45 46
46 void OSExchangeDataProviderMac::SetURL(const GURL& url, 47 void OSExchangeDataProviderMac::SetURL(const GURL& url,
47 const base::string16& title) { 48 const base::string16& title) {
48 NSURL* ns_url = [NSURL URLWithString:base::SysUTF8ToNSString(url.spec())]; 49 base::scoped_nsobject<NSPasteboardItem> item =
49 [pasteboard_->get() writeObjects:@[ ns_url ]]; 50 ClipboardUtil::PasteboardItemFromUrl(base::SysUTF8ToNSString(url.spec()),
50 51 base::SysUTF16ToNSString(title));
51 [pasteboard_->get() setString:base::SysUTF16ToNSString(title) 52 ui::ClipboardUtil::AddDataToPasteboard(pasteboard_->get(), item);
52 forType:kCorePasteboardFlavorType_urln];
53 } 53 }
54 54
55 void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) { 55 void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) {
56 [pasteboard_->get() setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ] 56 [pasteboard_->get() setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ]
57 forType:NSFilenamesPboardType]; 57 forType:NSFilenamesPboardType];
58 } 58 }
59 59
60 void OSExchangeDataProviderMac::SetFilenames( 60 void OSExchangeDataProviderMac::SetFilenames(
61 const std::vector<FileInfo>& filenames) { 61 const std::vector<FileInfo>& filenames) {
62 NOTIMPLEMENTED(); 62 NOTIMPLEMENTED();
63 } 63 }
64 64
65 void OSExchangeDataProviderMac::SetPickledData( 65 void OSExchangeDataProviderMac::SetPickledData(
66 const Clipboard::FormatType& format, 66 const Clipboard::FormatType& format,
67 const base::Pickle& data) { 67 const base::Pickle& data) {
68 NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()]; 68 NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()];
69 [pasteboard_->get() setData:ns_data forType:format.ToNSString()]; 69 [pasteboard_->get() setData:ns_data forType:format.ToNSString()];
70 } 70 }
71 71
72 bool OSExchangeDataProviderMac::GetString(base::string16* data) const { 72 bool OSExchangeDataProviderMac::GetString(base::string16* data) const {
73 DCHECK(data); 73 DCHECK(data);
74 NSArray* items = 74 NSString* item = [pasteboard_->get() stringForType:NSPasteboardTypeString];
75 [pasteboard_->get() readObjectsForClasses:@[ [NSString class] ] 75 if (item) {
76 options:@{}]; 76 *data = base::SysNSStringToUTF16(item);
77 return true;
78 }
77 79
78 // There was no NSString, check for an NSURL. 80 // There was no NSString, check for an NSURL.
79 if ([items count] == 0) { 81 GURL url;
80 GURL url; 82 base::string16 title;
81 base::string16 title; 83 bool result =
82 bool result = 84 GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title);
83 GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title); 85 if (result)
84 if (result) 86 *data = base::UTF8ToUTF16(url.spec());
85 *data = base::UTF8ToUTF16(url.spec());
86 return result;
87 }
88 87
89 *data = base::SysNSStringToUTF16([items objectAtIndex:0]); 88 return result;
90 return true;
91 } 89 }
92 90
93 bool OSExchangeDataProviderMac::GetURLAndTitle( 91 bool OSExchangeDataProviderMac::GetURLAndTitle(
94 OSExchangeData::FilenameToURLPolicy policy, 92 OSExchangeData::FilenameToURLPolicy policy,
95 GURL* url, 93 GURL* url,
96 base::string16* title) const { 94 base::string16* title) const {
97 DCHECK(url); 95 DCHECK(url);
98 DCHECK(title); 96 DCHECK(title);
99 NSArray* items =
100 [pasteboard_->get() readObjectsForClasses:@[ [NSURL class] ] options:@{}];
101 if ([items count] == 0)
102 return false;
103 97
104 NSURL* ns_url = [items objectAtIndex:0]; 98 NSArray* urlArray = nil;
105 99 NSArray* titleArray = nil;
106 if (policy == OSExchangeData::DO_NOT_CONVERT_FILENAMES) { 100 if (ClipboardUtil::URLsAndTitlesFromPasteboard(pasteboard_->get(), &urlArray,
107 // If the URL matches a filename, assume that it came from SetFilename(). 101 &titleArray)) {
108 // Don't return it if we are not supposed to convert filename to URL. 102 *url = GURL(base::SysNSStringToUTF8([urlArray firstObject]));
109 NSArray* paths = 103 *title = base::SysNSStringToUTF16([titleArray firstObject]);
110 [pasteboard_->get() propertyListForType:NSFilenamesPboardType]; 104 return true;
111 NSString* url_path = [[ns_url path] stringByStandardizingPath];
112 for (NSString* path in paths) {
113 if ([[path stringByStandardizingPath] isEqualToString:url_path])
114 return false;
115 }
116 } 105 }
117 106
118 *url = GURL([[ns_url absoluteString] UTF8String]); 107 // If there are no URLS, try to convert a filename to a URL if the policy
119 *title = base::SysNSStringToUTF16( 108 // allows it. The title remains blank.
120 [pasteboard_->get() stringForType:kCorePasteboardFlavorType_urln]); 109 base::FilePath path;
121 return true; 110 if (policy != OSExchangeData::DO_NOT_CONVERT_FILENAMES &&
111 GetFilename(&path)) {
112 NSURL* fileUrl =
113 [NSURL fileURLWithPath:base::SysUTF8ToNSString(path.value())];
114 *url =
115 GURL([[fileUrl absoluteString] stringByStandardizingPath].UTF8String);
116 return true;
117 }
118
119 return false;
122 } 120 }
123 121
124 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const { 122 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const {
125 NSArray* paths = 123 NSArray* paths =
126 [pasteboard_->get() propertyListForType:NSFilenamesPboardType]; 124 [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
127 if ([paths count] == 0) 125 if ([paths count] == 0)
128 return false; 126 return false;
129 127
130 *path = base::FilePath([[paths objectAtIndex:0] UTF8String]); 128 *path = base::FilePath([[paths objectAtIndex:0] UTF8String]);
131 return true; 129 return true;
(...skipping 12 matching lines...) Expand all
144 NSData* ns_data = [pasteboard_->get() dataForType:format.ToNSString()]; 142 NSData* ns_data = [pasteboard_->get() dataForType:format.ToNSString()];
145 if (!ns_data) 143 if (!ns_data)
146 return false; 144 return false;
147 145
148 *data = 146 *data =
149 base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]); 147 base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]);
150 return true; 148 return true;
151 } 149 }
152 150
153 bool OSExchangeDataProviderMac::HasString() const { 151 bool OSExchangeDataProviderMac::HasString() const {
154 NSArray* classes = @[ [NSString class] ]; 152 base::string16 string;
155 return [pasteboard_->get() canReadObjectForClasses:classes options:nil]; 153 return GetString(&string);
156 } 154 }
157 155
158 bool OSExchangeDataProviderMac::HasURL( 156 bool OSExchangeDataProviderMac::HasURL(
159 OSExchangeData::FilenameToURLPolicy policy) const { 157 OSExchangeData::FilenameToURLPolicy policy) const {
160 GURL url; 158 GURL url;
161 base::string16 title; 159 base::string16 title;
162 return GetURLAndTitle(policy, &url, &title); 160 return GetURLAndTitle(policy, &url, &title);
163 } 161 }
164 162
165 bool OSExchangeDataProviderMac::HasFile() const { 163 bool OSExchangeDataProviderMac::HasFile() const {
166 return [[pasteboard_->get() types] containsObject:NSFilenamesPboardType]; 164 return [[pasteboard_->get() types] containsObject:NSFilenamesPboardType];
167 } 165 }
168 166
169 bool OSExchangeDataProviderMac::HasCustomFormat( 167 bool OSExchangeDataProviderMac::HasCustomFormat(
170 const Clipboard::FormatType& format) const { 168 const Clipboard::FormatType& format) const {
171 return [[pasteboard_->get() types] containsObject:format.ToNSString()]; 169 return [[pasteboard_->get() types] containsObject:format.ToNSString()];
172 } 170 }
173 171
174 /////////////////////////////////////////////////////////////////////////////// 172 ///////////////////////////////////////////////////////////////////////////////
175 // OSExchangeData, public: 173 // OSExchangeData, public:
176 174
177 // static 175 // static
178 OSExchangeData::Provider* OSExchangeData::CreateProvider() { 176 OSExchangeData::Provider* OSExchangeData::CreateProvider() {
179 return new OSExchangeDataProviderMac; 177 return new OSExchangeDataProviderMac;
180 } 178 }
181 179
182 } // namespace ui 180 } // namespace ui
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