OLD | NEW |
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/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 | 147 |
148 std::vector<unsigned char> data; | 148 std::vector<unsigned char> data; |
149 ui::AddString16ToVector(spec, &data); | 149 ui::AddString16ToVector(spec, &data); |
150 ui::AddString16ToVector(base::ASCIIToUTF16("\n"), &data); | 150 ui::AddString16ToVector(base::ASCIIToUTF16("\n"), &data); |
151 ui::AddString16ToVector(title, &data); | 151 ui::AddString16ToVector(title, &data); |
152 scoped_refptr<base::RefCountedMemory> mem( | 152 scoped_refptr<base::RefCountedMemory> mem( |
153 base::RefCountedBytes::TakeVector(&data)); | 153 base::RefCountedBytes::TakeVector(&data)); |
154 | 154 |
155 format_map_.Insert(atom_cache_.GetAtom(kMimeTypeMozillaURL), mem); | 155 format_map_.Insert(atom_cache_.GetAtom(kMimeTypeMozillaURL), mem); |
156 | 156 |
157 // Set _NETSCAPE_URL as well, since some file managers like Nautilus use it | 157 // Set a string fallback as well. |
158 // to create a link to the URL. Setting text/uri-list doesn't work as well, | 158 SetString(spec); |
159 // because Nautilus tries to fetch the contents of the URL instead. | 159 |
| 160 // Return early if this drag already contains file contents (this implies |
| 161 // that file contents must be populated before URLs). Nautilus (and possibly |
| 162 // other file managers) prefer _NETSCAPE_URL over the X Direct Save |
| 163 // protocol, but we want to prioritize XDS in this case. |
| 164 if (!file_contents_name_.empty()) |
| 165 return; |
| 166 |
| 167 // Set _NETSCAPE_URL for file managers like Nautilus that use it as a hint |
| 168 // to create a link to the URL. Setting text/uri-list doesn't work because |
| 169 // Nautilus will fetch and copy the contents of the URL to the drop target |
| 170 // instead of linking... |
160 // Format is UTF8: URL + "\n" + title. | 171 // Format is UTF8: URL + "\n" + title. |
161 std::string netscape_url = url.spec(); | 172 std::string netscape_url = url.spec(); |
162 netscape_url += "\n"; | 173 netscape_url += "\n"; |
163 netscape_url += base::UTF16ToUTF8(title); | 174 netscape_url += base::UTF16ToUTF8(title); |
164 format_map_.Insert(atom_cache_.GetAtom(kNetscapeURL), | 175 format_map_.Insert(atom_cache_.GetAtom(kNetscapeURL), |
165 scoped_refptr<base::RefCountedMemory>( | 176 scoped_refptr<base::RefCountedMemory>( |
166 base::RefCountedString::TakeString(&netscape_url))); | 177 base::RefCountedString::TakeString(&netscape_url))); |
167 | |
168 // And finally a string fallback as well. | |
169 SetString(spec); | |
170 } | 178 } |
171 } | 179 } |
172 | 180 |
173 void OSExchangeDataProviderAuraX11::SetFilename(const base::FilePath& path) { | 181 void OSExchangeDataProviderAuraX11::SetFilename(const base::FilePath& path) { |
174 std::vector<FileInfo> data; | 182 std::vector<FileInfo> data; |
175 data.push_back(FileInfo(path, base::FilePath())); | 183 data.push_back(FileInfo(path, base::FilePath())); |
176 SetFilenames(data); | 184 SetFilenames(data); |
177 } | 185 } |
178 | 186 |
179 void OSExchangeDataProviderAuraX11::SetFilenames( | 187 void OSExchangeDataProviderAuraX11::SetFilenames( |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 std::vector< ::Atom> requested_types; | 410 std::vector< ::Atom> requested_types; |
403 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); | 411 ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types); |
404 | 412 |
405 return !requested_types.empty(); | 413 return !requested_types.empty(); |
406 } | 414 } |
407 | 415 |
408 void OSExchangeDataProviderAuraX11::SetFileContents( | 416 void OSExchangeDataProviderAuraX11::SetFileContents( |
409 const base::FilePath& filename, | 417 const base::FilePath& filename, |
410 const std::string& file_contents) { | 418 const std::string& file_contents) { |
411 DCHECK(!filename.empty()); | 419 DCHECK(!filename.empty()); |
| 420 DCHECK(format_map_.end() == |
| 421 format_map_.find(atom_cache_.GetAtom(kMimeTypeMozillaURL))); |
412 | 422 |
413 file_contents_name_ = filename; | 423 file_contents_name_ = filename; |
414 | 424 |
415 // Direct save handling is a complicated juggling affair between this class, | 425 // Direct save handling is a complicated juggling affair between this class, |
416 // SelectionFormat, and DesktopDragDropClientAuraX11. The general idea behind | 426 // SelectionFormat, and DesktopDragDropClientAuraX11. The general idea behind |
417 // the protocol is this: | 427 // the protocol is this: |
418 // - The source window sets its XdndDirectSave0 window property to the | 428 // - The source window sets its XdndDirectSave0 window property to the |
419 // proposed filename. | 429 // proposed filename. |
420 // - When a target window receives the drop, it updates the XdndDirectSave0 | 430 // - When a target window receives the drop, it updates the XdndDirectSave0 |
421 // property on the source window to the filename it would like the contents | 431 // property on the source window to the filename it would like the contents |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 | 541 |
532 /////////////////////////////////////////////////////////////////////////////// | 542 /////////////////////////////////////////////////////////////////////////////// |
533 // OSExchangeData, public: | 543 // OSExchangeData, public: |
534 | 544 |
535 // static | 545 // static |
536 OSExchangeData::Provider* OSExchangeData::CreateProvider() { | 546 OSExchangeData::Provider* OSExchangeData::CreateProvider() { |
537 return new OSExchangeDataProviderAuraX11(); | 547 return new OSExchangeDataProviderAuraX11(); |
538 } | 548 } |
539 | 549 |
540 } // namespace ui | 550 } // namespace ui |
OLD | NEW |