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

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: 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"
11 #include "base/strings/sys_string_conversions.h" 11 #include "base/strings/sys_string_conversions.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #import "third_party/mozilla/NSPasteboard+Utils.h" 13 #import "third_party/mozilla/NSPasteboard+Utils.h"
14 #import "ui/base/clipboard/clipboard_util_mac.h" 14 #import "ui/base/clipboard/clipboard_util_mac.h"
15 #import "ui/base/dragdrop/cocoa_dnd_util.h"
15 #include "url/gurl.h" 16 #include "url/gurl.h"
16 17
17 namespace ui { 18 namespace ui {
18 19
19 OSExchangeDataProviderMac::OSExchangeDataProviderMac() 20 OSExchangeDataProviderMac::OSExchangeDataProviderMac()
20 : pasteboard_(new ui::UniquePasteboard) {} 21 : pasteboard_(new ui::UniquePasteboard) {}
21 22
22 OSExchangeDataProviderMac::OSExchangeDataProviderMac( 23 OSExchangeDataProviderMac::OSExchangeDataProviderMac(
23 scoped_refptr<ui::UniquePasteboard> pb) 24 scoped_refptr<ui::UniquePasteboard> pb)
24 : pasteboard_(pb) {} 25 : pasteboard_(pb) {}
25 26
26 OSExchangeDataProviderMac::~OSExchangeDataProviderMac() { 27 OSExchangeDataProviderMac::~OSExchangeDataProviderMac() {
27 } 28 }
28 29
29 OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const { 30 OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const {
30 return new OSExchangeDataProviderMac(pasteboard_); 31 return new OSExchangeDataProviderMac(pasteboard_);
31 } 32 }
32 33
33 void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() { 34 void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() {
34 NOTIMPLEMENTED(); 35 NOTIMPLEMENTED();
35 } 36 }
36 37
37 bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const { 38 bool OSExchangeDataProviderMac::DidOriginateFromRenderer() const {
38 NOTIMPLEMENTED(); 39 NOTIMPLEMENTED();
39 return false; 40 return false;
40 } 41 }
41 42
42 void OSExchangeDataProviderMac::SetString(const base::string16& string) { 43 void OSExchangeDataProviderMac::SetString(const base::string16& string) {
43 [pasteboard_->get() writeObjects:@[ base::SysUTF16ToNSString(string) ]]; 44 [pasteboard_->get() setString:base::SysUTF16ToNSString(string)
45 forType:NSPasteboardTypeString];
44 } 46 }
45 47
46 void OSExchangeDataProviderMac::SetURL(const GURL& url, 48 void OSExchangeDataProviderMac::SetURL(const GURL& url,
47 const base::string16& title) { 49 const base::string16& title) {
48 NSURL* ns_url = [NSURL URLWithString:base::SysUTF8ToNSString(url.spec())]; 50 base::scoped_nsobject<NSPasteboardItem> item =
49 [pasteboard_->get() writeObjects:@[ ns_url ]]; 51 ClipboardUtil::PasteboardItemFromUrl(base::SysUTF8ToNSString(url.spec()),
50 52 base::SysUTF16ToNSString(title));
51 [pasteboard_->get() setString:base::SysUTF16ToNSString(title) 53 ui::ClipboardUtil::AddDataToPasteboard(pasteboard_->get(), item);
52 forType:kCorePasteboardFlavorType_urln];
53 } 54 }
54 55
55 void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) { 56 void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) {
56 [pasteboard_->get() setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ] 57 [pasteboard_->get() setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ]
57 forType:NSFilenamesPboardType]; 58 forType:NSFilenamesPboardType];
58 } 59 }
59 60
60 void OSExchangeDataProviderMac::SetFilenames( 61 void OSExchangeDataProviderMac::SetFilenames(
61 const std::vector<FileInfo>& filenames) { 62 const std::vector<FileInfo>& filenames) {
62 NOTIMPLEMENTED(); 63 NOTIMPLEMENTED();
63 } 64 }
64 65
65 void OSExchangeDataProviderMac::SetPickledData( 66 void OSExchangeDataProviderMac::SetPickledData(
66 const Clipboard::FormatType& format, 67 const Clipboard::FormatType& format,
67 const base::Pickle& data) { 68 const base::Pickle& data) {
68 NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()]; 69 NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()];
69 [pasteboard_->get() setData:ns_data forType:format.ToNSString()]; 70 [pasteboard_->get() setData:ns_data forType:format.ToNSString()];
70 } 71 }
71 72
72 bool OSExchangeDataProviderMac::GetString(base::string16* data) const { 73 bool OSExchangeDataProviderMac::GetString(base::string16* data) const {
73 DCHECK(data); 74 DCHECK(data);
74 NSArray* items = 75 NSString* item = [pasteboard_->get() stringForType:NSPasteboardTypeString];
erikchen 2016/05/04 18:56:21 Can you confirm that this doesn't break anything?
spqchan 2016/05/05 17:41:05 Sure thing, currently Cocoa doesn't actually use O
75 [pasteboard_->get() readObjectsForClasses:@[ [NSString class] ]
76 options:@{}];
77 76
78 // There was no NSString, check for an NSURL. 77 // There was no NSString, check for an NSURL.
79 if ([items count] == 0) { 78 if (!item) {
erikchen 2016/05/04 18:56:21 minor nit: Why a negative conditional? All else be
spqchan 2016/05/05 17:41:05 Done. I was trying to follow the format of the exi
80 GURL url; 79 GURL url;
81 base::string16 title; 80 base::string16 title;
82 bool result = 81 bool result =
83 GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title); 82 GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title);
84 if (result) 83 if (result)
85 *data = base::UTF8ToUTF16(url.spec()); 84 *data = base::UTF8ToUTF16(url.spec());
86 return result; 85 return result;
87 } 86 }
88 87
89 *data = base::SysNSStringToUTF16([items objectAtIndex:0]); 88 *data = base::SysNSStringToUTF16(item);
90 return true; 89 return true;
91 } 90 }
92 91
93 bool OSExchangeDataProviderMac::GetURLAndTitle( 92 bool OSExchangeDataProviderMac::GetURLAndTitle(
94 OSExchangeData::FilenameToURLPolicy policy, 93 OSExchangeData::FilenameToURLPolicy policy,
95 GURL* url, 94 GURL* url,
96 base::string16* title) const { 95 base::string16* title) const {
97 DCHECK(url); 96 DCHECK(url);
98 DCHECK(title); 97 DCHECK(title);
99 NSArray* items = 98 return PopulateURLAndTitleFromPasteboard(
erikchen 2016/05/04 18:56:21 Is it possible to use methods from ui/base/clipboa
spqchan 2016/05/05 17:41:05 Done
100 [pasteboard_->get() readObjectsForClasses:@[ [NSURL class] ] options:@{}]; 99 url, title, pasteboard_->get(),
101 if ([items count] == 0) 100 policy == OSExchangeData::DO_NOT_CONVERT_FILENAMES);
102 return false;
103
104 NSURL* ns_url = [items objectAtIndex:0];
105
106 if (policy == OSExchangeData::DO_NOT_CONVERT_FILENAMES) {
107 // If the URL matches a filename, assume that it came from SetFilename().
108 // Don't return it if we are not supposed to convert filename to URL.
109 NSArray* paths =
110 [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
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 }
117
118 *url = GURL([[ns_url absoluteString] UTF8String]);
119 *title = base::SysNSStringToUTF16(
120 [pasteboard_->get() stringForType:kCorePasteboardFlavorType_urln]);
121 return true;
122 } 101 }
123 102
124 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const { 103 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const {
125 NSArray* paths = 104 NSArray* paths =
126 [pasteboard_->get() propertyListForType:NSFilenamesPboardType]; 105 [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
127 if ([paths count] == 0) 106 if ([paths count] == 0)
128 return false; 107 return false;
129 108
130 *path = base::FilePath([[paths objectAtIndex:0] UTF8String]); 109 *path = base::FilePath([[paths objectAtIndex:0] UTF8String]);
131 return true; 110 return true;
(...skipping 11 matching lines...) Expand all
143 DCHECK(data); 122 DCHECK(data);
144 NSData* ns_data = [pasteboard_->get() dataForType:format.ToNSString()]; 123 NSData* ns_data = [pasteboard_->get() dataForType:format.ToNSString()];
145 if (!ns_data) 124 if (!ns_data)
146 return false; 125 return false;
147 126
148 *data = 127 *data =
149 base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]); 128 base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]);
150 return true; 129 return true;
151 } 130 }
152 131
153 bool OSExchangeDataProviderMac::HasString() const { 132 bool OSExchangeDataProviderMac::HasString() const {
erikchen 2016/05/04 18:56:21 Hm. I expect HasString() to mirror GetString(). An
spqchan 2016/05/05 17:41:05 Discussed offline: it needs to be there. Made a ch
154 NSArray* classes = @[ [NSString class] ]; 133 return [[pasteboard_->get() types] containsObject:NSPasteboardTypeString];
155 return [pasteboard_->get() canReadObjectForClasses:classes options:nil];
156 } 134 }
157 135
158 bool OSExchangeDataProviderMac::HasURL( 136 bool OSExchangeDataProviderMac::HasURL(
159 OSExchangeData::FilenameToURLPolicy policy) const { 137 OSExchangeData::FilenameToURLPolicy policy) const {
160 GURL url; 138 GURL url;
161 base::string16 title; 139 base::string16 title;
162 return GetURLAndTitle(policy, &url, &title); 140 return GetURLAndTitle(policy, &url, &title);
163 } 141 }
164 142
165 bool OSExchangeDataProviderMac::HasFile() const { 143 bool OSExchangeDataProviderMac::HasFile() const {
166 return [[pasteboard_->get() types] containsObject:NSFilenamesPboardType]; 144 return [[pasteboard_->get() types] containsObject:NSFilenamesPboardType];
167 } 145 }
168 146
169 bool OSExchangeDataProviderMac::HasCustomFormat( 147 bool OSExchangeDataProviderMac::HasCustomFormat(
170 const Clipboard::FormatType& format) const { 148 const Clipboard::FormatType& format) const {
171 return [[pasteboard_->get() types] containsObject:format.ToNSString()]; 149 return [[pasteboard_->get() types] containsObject:format.ToNSString()];
172 } 150 }
173 151
174 /////////////////////////////////////////////////////////////////////////////// 152 ///////////////////////////////////////////////////////////////////////////////
175 // OSExchangeData, public: 153 // OSExchangeData, public:
176 154
177 // static 155 // static
178 OSExchangeData::Provider* OSExchangeData::CreateProvider() { 156 OSExchangeData::Provider* OSExchangeData::CreateProvider() {
179 return new OSExchangeDataProviderMac; 157 return new OSExchangeDataProviderMac;
180 } 158 }
181 159
182 } // namespace ui 160 } // 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