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

Side by Side Diff: ui/base/dragdrop/os_exchange_data_provider_aurax11.cc

Issue 129113004: linux_aura: Implement file drag and drop in content area. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_aurax11.h" 5 #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/ref_counted_memory.h" 8 #include "base/memory/ref_counted_memory.h"
9 #include "base/message_loop/message_pump_x11.h" 9 #include "base/message_loop/message_pump_x11.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 scoped_refptr<base::RefCountedMemory> mem( 132 scoped_refptr<base::RefCountedMemory> mem(
133 base::RefCountedBytes::TakeVector(&data)); 133 base::RefCountedBytes::TakeVector(&data));
134 134
135 format_map_.Insert(atom_cache_.GetAtom(kMimeTypeMozillaURL), mem); 135 format_map_.Insert(atom_cache_.GetAtom(kMimeTypeMozillaURL), mem);
136 136
137 SetString(spec); 137 SetString(spec);
138 } 138 }
139 } 139 }
140 140
141 void OSExchangeDataProviderAuraX11::SetFilename(const base::FilePath& path) { 141 void OSExchangeDataProviderAuraX11::SetFilename(const base::FilePath& path) {
142 NOTIMPLEMENTED(); 142 std::vector<OSExchangeData::FileInfo> data;
143 data.push_back(OSExchangeData::FileInfo(path, base::FilePath()));
144 SetFilenames(data);
143 } 145 }
144 146
145 void OSExchangeDataProviderAuraX11::SetFilenames( 147 void OSExchangeDataProviderAuraX11::SetFilenames(
146 const std::vector<OSExchangeData::FileInfo>& filenames) { 148 const std::vector<OSExchangeData::FileInfo>& filenames) {
147 NOTIMPLEMENTED(); 149 std::vector<std::string> paths;
150 for (std::vector<OSExchangeData::FileInfo>::const_iterator it =
151 filenames.begin(); it != filenames.end(); ++it) {
152 std::string url_spec = net::FilePathToFileURL(it->path).spec();
153 if (!url_spec.empty())
154 paths.push_back(url_spec);
155 }
156
157 std::string joined_data = JoinString(paths, '\n');
158 scoped_refptr<base::RefCountedMemory> mem(
159 base::RefCountedString::TakeString(&joined_data));
160 format_map_.Insert(atom_cache_.GetAtom(Clipboard::kMimeTypeURIList), mem);
148 } 161 }
149 162
150 void OSExchangeDataProviderAuraX11::SetPickledData( 163 void OSExchangeDataProviderAuraX11::SetPickledData(
151 const OSExchangeData::CustomFormat& format, 164 const OSExchangeData::CustomFormat& format,
152 const Pickle& pickle) { 165 const Pickle& pickle) {
153 const unsigned char* data = 166 const unsigned char* data =
154 reinterpret_cast<const unsigned char*>(pickle.data()); 167 reinterpret_cast<const unsigned char*>(pickle.data());
155 168
156 std::vector<unsigned char> bytes; 169 std::vector<unsigned char> bytes;
157 bytes.insert(bytes.end(), data, data + pickle.size()); 170 bytes.insert(bytes.end(), data, data + pickle.size());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 if (num_tokens > 1) 213 if (num_tokens > 1)
201 *title = tokens[1]; 214 *title = tokens[1];
202 else 215 else
203 *title = base::string16(); 216 *title = base::string16();
204 217
205 *url = GURL(tokens[0]); 218 *url = GURL(tokens[0]);
206 return true; 219 return true;
207 } 220 }
208 } else if (data.GetType() == atom_cache_.GetAtom( 221 } else if (data.GetType() == atom_cache_.GetAtom(
209 Clipboard::kMimeTypeURIList)) { 222 Clipboard::kMimeTypeURIList)) {
210 // uri-lists are newline separated file lists in URL encoding. 223 std::vector<std::string> tokens = ui::ParseURIList(data);
211 std::string unparsed; 224 for (std::vector<std::string>::const_iterator it = tokens.begin();
212 data.AssignTo(&unparsed); 225 it != tokens.end(); ++it) {
213 226 GURL test_url(*it);
214 std::vector<std::string> tokens; 227 if (!test_url.SchemeIsFile()) {
215 size_t num_tokens = Tokenize(unparsed, "\n", &tokens); 228 *url = test_url;
216 if (!num_tokens) { 229 *title = base::string16();
217 NOTREACHED() << "Empty URI list"; 230 return true;
218 return false; 231 }
219 } 232 }
220
221 *url = GURL(tokens[0]);
222 *title = base::string16();
223
224 return true;
225 } 233 }
226 } 234 }
227 235
228 return false; 236 return false;
229 } 237 }
230 238
231 bool OSExchangeDataProviderAuraX11::GetFilename(base::FilePath* path) const { 239 bool OSExchangeDataProviderAuraX11::GetFilename(base::FilePath* path) const {
232 // On X11, files are passed by URL and aren't separate. 240 std::vector<OSExchangeData::FileInfo> filenames;
241 if (GetFilenames(&filenames)) {
242 *path = filenames.front().path;
243 return true;
244 }
245
233 return false; 246 return false;
234 } 247 }
235 248
236 bool OSExchangeDataProviderAuraX11::GetFilenames( 249 bool OSExchangeDataProviderAuraX11::GetFilenames(
237 std::vector<OSExchangeData::FileInfo>* filenames) const { 250 std::vector<OSExchangeData::FileInfo>* filenames) const {
238 // On X11, files are passed by URL and aren't separate. 251 std::vector< ::Atom> url_atoms = ui::GetURIListAtomsFrom(&atom_cache_);
239 return false; 252 std::vector< ::Atom> requested_types;
253 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
254
255 filenames->clear();
256 ui::SelectionData data(format_map_.GetFirstOf(requested_types));
257 if (data.IsValid()) {
258 std::vector<std::string> tokens = ui::ParseURIList(data);
259 for (std::vector<std::string>::const_iterator it = tokens.begin();
260 it != tokens.end(); ++it) {
261 GURL url(*it);
262 base::FilePath file_path;
263 if (url.SchemeIsFile() && net::FileURLToFilePath(url, &file_path)) {
264 filenames->push_back(OSExchangeData::FileInfo(file_path,
265 base::FilePath()));
266 }
267 }
268 }
269
270 return !filenames->empty();
240 } 271 }
241 272
242 bool OSExchangeDataProviderAuraX11::GetPickledData( 273 bool OSExchangeDataProviderAuraX11::GetPickledData(
243 const OSExchangeData::CustomFormat& format, 274 const OSExchangeData::CustomFormat& format,
244 Pickle* pickle) const { 275 Pickle* pickle) const {
245 std::vector< ::Atom> requested_types; 276 std::vector< ::Atom> requested_types;
246 requested_types.push_back(atom_cache_.GetAtom(format.ToString().c_str())); 277 requested_types.push_back(atom_cache_.GetAtom(format.ToString().c_str()));
247 278
248 ui::SelectionData data(format_map_.GetFirstOf(requested_types)); 279 ui::SelectionData data(format_map_.GetFirstOf(requested_types));
249 if (data.IsValid()) { 280 if (data.IsValid()) {
(...skipping 11 matching lines...) Expand all
261 std::vector< ::Atom> text_atoms = ui::GetTextAtomsFrom(&atom_cache_); 292 std::vector< ::Atom> text_atoms = ui::GetTextAtomsFrom(&atom_cache_);
262 std::vector< ::Atom> requested_types; 293 std::vector< ::Atom> requested_types;
263 ui::GetAtomIntersection(text_atoms, GetTargets(), &requested_types); 294 ui::GetAtomIntersection(text_atoms, GetTargets(), &requested_types);
264 return !requested_types.empty(); 295 return !requested_types.empty();
265 } 296 }
266 297
267 bool OSExchangeDataProviderAuraX11::HasURL() const { 298 bool OSExchangeDataProviderAuraX11::HasURL() const {
268 std::vector< ::Atom> url_atoms = ui::GetURLAtomsFrom(&atom_cache_); 299 std::vector< ::Atom> url_atoms = ui::GetURLAtomsFrom(&atom_cache_);
269 std::vector< ::Atom> requested_types; 300 std::vector< ::Atom> requested_types;
270 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); 301 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
271 return !requested_types.empty(); 302
303 if (requested_types.empty())
304 return false;
305
306 // The Linux desktop doesn't differentiate between files and URLs like
307 // Windows does and stuffs all the data into one mime type.
308 ui::SelectionData data(format_map_.GetFirstOf(requested_types));
309 if (data.IsValid()) {
310 if (data.GetType() == atom_cache_.GetAtom(kMimeTypeMozillaURL)) {
311 // File managers shouldn't be using this type, so this is a URL.
312 return true;
313 } else if (data.GetType() == atom_cache_.GetAtom(
314 ui::Clipboard::kMimeTypeURIList)) {
315 std::vector<std::string> tokens = ui::ParseURIList(data);
316 for (std::vector<std::string>::const_iterator it = tokens.begin();
317 it != tokens.end(); ++it) {
318 if (!GURL(*it).SchemeIsFile())
319 return true;
320 }
321
322 return false;
323 }
324 }
325
326 return false;
272 } 327 }
273 328
274 bool OSExchangeDataProviderAuraX11::HasFile() const { 329 bool OSExchangeDataProviderAuraX11::HasFile() const {
275 // On X11, files are passed by URL and aren't separate. 330 std::vector< ::Atom> url_atoms = ui::GetURIListAtomsFrom(&atom_cache_);
331 std::vector< ::Atom> requested_types;
332 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
333
334 if (requested_types.empty())
335 return false;
336
337 // To actually answer whether we have a file, we need to look through the
338 // contents of the kMimeTypeURIList type, and see if any of them are file://
339 // URIs.
340 ui::SelectionData data(format_map_.GetFirstOf(requested_types));
341 if (data.IsValid()) {
342 std::vector<std::string> tokens = ui::ParseURIList(data);
343 for (std::vector<std::string>::const_iterator it = tokens.begin();
344 it != tokens.end(); ++it) {
345 GURL url(*it);
346 base::FilePath file_path;
347 if (url.SchemeIsFile() && net::FileURLToFilePath(url, &file_path))
348 return true;
349 }
350 }
351
276 return false; 352 return false;
277 } 353 }
278 354
279 bool OSExchangeDataProviderAuraX11::HasCustomFormat( 355 bool OSExchangeDataProviderAuraX11::HasCustomFormat(
280 const OSExchangeData::CustomFormat& format) const { 356 const OSExchangeData::CustomFormat& format) const {
281 std::vector< ::Atom> url_atoms; 357 std::vector< ::Atom> url_atoms;
282 url_atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str())); 358 url_atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str()));
283 std::vector< ::Atom> requested_types; 359 std::vector< ::Atom> requested_types;
284 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); 360 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
285 361
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 449
374 /////////////////////////////////////////////////////////////////////////////// 450 ///////////////////////////////////////////////////////////////////////////////
375 // OSExchangeData, public: 451 // OSExchangeData, public:
376 452
377 // static 453 // static
378 OSExchangeData::Provider* OSExchangeData::CreateProvider() { 454 OSExchangeData::Provider* OSExchangeData::CreateProvider() {
379 return new OSExchangeDataProviderAuraX11(); 455 return new OSExchangeDataProviderAuraX11();
380 } 456 }
381 457
382 } // namespace ui 458 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/dragdrop/os_exchange_data_provider_aurax11.h ('k') | ui/base/dragdrop/os_exchange_data_provider_aurax11_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698