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

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

Issue 1852433004: Fix NSPasteboard leaks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile error. Created 4 years, 8 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 | « ui/base/dragdrop/os_exchange_data_provider_mac.h ('k') | 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 #include "url/gurl.h" 15 #include "url/gurl.h"
15 16
16 namespace ui { 17 namespace ui {
17 18
18 OSExchangeDataProviderMac::OSExchangeDataProviderMac() 19 OSExchangeDataProviderMac::OSExchangeDataProviderMac()
19 : pasteboard_([[NSPasteboard pasteboardWithUniqueName] retain]) { 20 : pasteboard_(new ui::UniquePasteboard) {}
20 }
21 21
22 OSExchangeDataProviderMac::OSExchangeDataProviderMac(NSPasteboard* pasteboard) 22 OSExchangeDataProviderMac::OSExchangeDataProviderMac(
23 : pasteboard_([pasteboard retain]) { 23 scoped_refptr<ui::UniquePasteboard> pb)
24 } 24 : pasteboard_(pb) {}
25 25
26 OSExchangeDataProviderMac::~OSExchangeDataProviderMac() { 26 OSExchangeDataProviderMac::~OSExchangeDataProviderMac() {
27 } 27 }
28 28
29 OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const { 29 OSExchangeData::Provider* OSExchangeDataProviderMac::Clone() const {
30 return new OSExchangeDataProviderMac(pasteboard_); 30 return new OSExchangeDataProviderMac(pasteboard_);
31 } 31 }
32 32
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_ writeObjects:@[ base::SysUTF16ToNSString(string) ]]; 43 [pasteboard_->get() writeObjects:@[ base::SysUTF16ToNSString(string) ]];
44 } 44 }
45 45
46 void OSExchangeDataProviderMac::SetURL(const GURL& url, 46 void OSExchangeDataProviderMac::SetURL(const GURL& url,
47 const base::string16& title) { 47 const base::string16& title) {
48 NSURL* ns_url = [NSURL URLWithString:base::SysUTF8ToNSString(url.spec())]; 48 NSURL* ns_url = [NSURL URLWithString:base::SysUTF8ToNSString(url.spec())];
49 [pasteboard_ writeObjects:@[ ns_url ]]; 49 [pasteboard_->get() writeObjects:@[ ns_url ]];
50 50
51 [pasteboard_ setString:base::SysUTF16ToNSString(title) 51 [pasteboard_->get() setString:base::SysUTF16ToNSString(title)
52 forType:kCorePasteboardFlavorType_urln]; 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_ 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_ 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 = [pasteboard_ readObjectsForClasses:@[ [NSString class] ] 74 NSArray* items =
75 options:@{ }]; 75 [pasteboard_->get() readObjectsForClasses:@[ [NSString class] ]
76 options:@{}];
76 77
77 // There was no NSString, check for an NSURL. 78 // There was no NSString, check for an NSURL.
78 if ([items count] == 0) { 79 if ([items count] == 0) {
79 GURL url; 80 GURL url;
80 base::string16 title; 81 base::string16 title;
81 bool result = 82 bool result =
82 GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title); 83 GetURLAndTitle(OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &title);
83 if (result) 84 if (result)
84 *data = base::UTF8ToUTF16(url.spec()); 85 *data = base::UTF8ToUTF16(url.spec());
85 return result; 86 return result;
86 } 87 }
87 88
88 *data = base::SysNSStringToUTF16([items objectAtIndex:0]); 89 *data = base::SysNSStringToUTF16([items objectAtIndex:0]);
89 return true; 90 return true;
90 } 91 }
91 92
92 bool OSExchangeDataProviderMac::GetURLAndTitle( 93 bool OSExchangeDataProviderMac::GetURLAndTitle(
93 OSExchangeData::FilenameToURLPolicy policy, 94 OSExchangeData::FilenameToURLPolicy policy,
94 GURL* url, 95 GURL* url,
95 base::string16* title) const { 96 base::string16* title) const {
96 DCHECK(url); 97 DCHECK(url);
97 DCHECK(title); 98 DCHECK(title);
98 NSArray* items = [pasteboard_ readObjectsForClasses:@[ [NSURL class] ] 99 NSArray* items =
99 options:@{ }]; 100 [pasteboard_->get() readObjectsForClasses:@[ [NSURL class] ] options:@{}];
100 if ([items count] == 0) 101 if ([items count] == 0)
101 return false; 102 return false;
102 103
103 NSURL* ns_url = [items objectAtIndex:0]; 104 NSURL* ns_url = [items objectAtIndex:0];
104 105
105 if (policy == OSExchangeData::DO_NOT_CONVERT_FILENAMES) { 106 if (policy == OSExchangeData::DO_NOT_CONVERT_FILENAMES) {
106 // If the URL matches a filename, assume that it came from SetFilename(). 107 // If the URL matches a filename, assume that it came from SetFilename().
107 // Don't return it if we are not supposed to convert filename to URL. 108 // Don't return it if we are not supposed to convert filename to URL.
108 NSArray* paths = [pasteboard_ propertyListForType:NSFilenamesPboardType]; 109 NSArray* paths =
110 [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
109 NSString* url_path = [[ns_url path] stringByStandardizingPath]; 111 NSString* url_path = [[ns_url path] stringByStandardizingPath];
110 for (NSString* path in paths) { 112 for (NSString* path in paths) {
111 if ([[path stringByStandardizingPath] isEqualToString:url_path]) 113 if ([[path stringByStandardizingPath] isEqualToString:url_path])
112 return false; 114 return false;
113 } 115 }
114 } 116 }
115 117
116 *url = GURL([[ns_url absoluteString] UTF8String]); 118 *url = GURL([[ns_url absoluteString] UTF8String]);
117 *title = base::SysNSStringToUTF16( 119 *title = base::SysNSStringToUTF16(
118 [pasteboard_ stringForType:kCorePasteboardFlavorType_urln]); 120 [pasteboard_->get() stringForType:kCorePasteboardFlavorType_urln]);
119 return true; 121 return true;
120 } 122 }
121 123
122 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const { 124 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const {
123 NSArray* paths = [pasteboard_ propertyListForType:NSFilenamesPboardType]; 125 NSArray* paths =
126 [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
124 if ([paths count] == 0) 127 if ([paths count] == 0)
125 return false; 128 return false;
126 129
127 *path = base::FilePath([[paths objectAtIndex:0] UTF8String]); 130 *path = base::FilePath([[paths objectAtIndex:0] UTF8String]);
128 return true; 131 return true;
129 } 132 }
130 133
131 bool OSExchangeDataProviderMac::GetFilenames( 134 bool OSExchangeDataProviderMac::GetFilenames(
132 std::vector<FileInfo>* filenames) const { 135 std::vector<FileInfo>* filenames) const {
133 NOTIMPLEMENTED(); 136 NOTIMPLEMENTED();
134 return false; 137 return false;
135 } 138 }
136 139
137 bool OSExchangeDataProviderMac::GetPickledData( 140 bool OSExchangeDataProviderMac::GetPickledData(
138 const Clipboard::FormatType& format, 141 const Clipboard::FormatType& format,
139 base::Pickle* data) const { 142 base::Pickle* data) const {
140 DCHECK(data); 143 DCHECK(data);
141 NSData* ns_data = [pasteboard_ dataForType:format.ToNSString()]; 144 NSData* ns_data = [pasteboard_->get() dataForType:format.ToNSString()];
142 if (!ns_data) 145 if (!ns_data)
143 return false; 146 return false;
144 147
145 *data = 148 *data =
146 base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]); 149 base::Pickle(static_cast<const char*>([ns_data bytes]), [ns_data length]);
147 return true; 150 return true;
148 } 151 }
149 152
150 bool OSExchangeDataProviderMac::HasString() const { 153 bool OSExchangeDataProviderMac::HasString() const {
151 NSArray* classes = @[ [NSString class] ]; 154 NSArray* classes = @[ [NSString class] ];
152 return [pasteboard_ canReadObjectForClasses:classes options:nil]; 155 return [pasteboard_->get() canReadObjectForClasses:classes options:nil];
153 } 156 }
154 157
155 bool OSExchangeDataProviderMac::HasURL( 158 bool OSExchangeDataProviderMac::HasURL(
156 OSExchangeData::FilenameToURLPolicy policy) const { 159 OSExchangeData::FilenameToURLPolicy policy) const {
157 GURL url; 160 GURL url;
158 base::string16 title; 161 base::string16 title;
159 return GetURLAndTitle(policy, &url, &title); 162 return GetURLAndTitle(policy, &url, &title);
160 } 163 }
161 164
162 bool OSExchangeDataProviderMac::HasFile() const { 165 bool OSExchangeDataProviderMac::HasFile() const {
163 return [[pasteboard_ types] containsObject:NSFilenamesPboardType]; 166 return [[pasteboard_->get() types] containsObject:NSFilenamesPboardType];
164 } 167 }
165 168
166 bool OSExchangeDataProviderMac::HasCustomFormat( 169 bool OSExchangeDataProviderMac::HasCustomFormat(
167 const Clipboard::FormatType& format) const { 170 const Clipboard::FormatType& format) const {
168 return [[pasteboard_ types] containsObject:format.ToNSString()]; 171 return [[pasteboard_->get() types] containsObject:format.ToNSString()];
169 } 172 }
170 173
171 /////////////////////////////////////////////////////////////////////////////// 174 ///////////////////////////////////////////////////////////////////////////////
172 // OSExchangeData, public: 175 // OSExchangeData, public:
173 176
174 // static 177 // static
175 OSExchangeData::Provider* OSExchangeData::CreateProvider() { 178 OSExchangeData::Provider* OSExchangeData::CreateProvider() {
176 return new OSExchangeDataProviderMac; 179 return new OSExchangeDataProviderMac;
177 } 180 }
178 181
179 } // namespace ui 182 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/dragdrop/os_exchange_data_provider_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698