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 "content/browser/web_contents/web_contents_view_aura.h" | 5 #include "content/browser/web_contents/web_contents_view_aura.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 download_url, | 287 download_url, |
288 Referrer(page_url, drop_data.referrer_policy), | 288 Referrer(page_url, drop_data.referrer_policy), |
289 page_encoding, | 289 page_encoding, |
290 web_contents); | 290 web_contents); |
291 ui::OSExchangeData::DownloadFileInfo file_download(base::FilePath(), | 291 ui::OSExchangeData::DownloadFileInfo file_download(base::FilePath(), |
292 download_file.get()); | 292 download_file.get()); |
293 provider->SetDownloadFileInfo(file_download); | 293 provider->SetDownloadFileInfo(file_download); |
294 } | 294 } |
295 #endif // defined(OS_WIN) | 295 #endif // defined(OS_WIN) |
296 | 296 |
| 297 // Returns the CustomFormat to store file system files. |
| 298 const ui::OSExchangeData::CustomFormat& GetFileSystemFileCustomFormat() { |
| 299 static const char kFormatString[] = "chromium/x-file-system-files"; |
| 300 CR_DEFINE_STATIC_LOCAL(ui::OSExchangeData::CustomFormat, |
| 301 format, |
| 302 (ui::Clipboard::GetFormatType(kFormatString))); |
| 303 return format; |
| 304 } |
| 305 |
| 306 // Writes file system files to the pickle. |
| 307 void WriteFileSystemFilesToPickle( |
| 308 const std::vector<DropData::FileSystemFileInfo>& file_system_files, |
| 309 Pickle* pickle) { |
| 310 pickle->WriteUInt64(file_system_files.size()); |
| 311 for (size_t i = 0; i < file_system_files.size(); ++i) { |
| 312 pickle->WriteString(file_system_files[i].url.spec()); |
| 313 pickle->WriteInt64(file_system_files[i].size); |
| 314 } |
| 315 } |
| 316 |
| 317 // Reads file system files from the pickle. |
| 318 bool ReadFileSystemFilesFromPickle( |
| 319 const Pickle& pickle, |
| 320 std::vector<DropData::FileSystemFileInfo>* file_system_files) { |
| 321 PickleIterator iter(pickle); |
| 322 |
| 323 uint64 num_files = 0; |
| 324 if (!pickle.ReadUInt64(&iter, &num_files)) |
| 325 return false; |
| 326 file_system_files->resize(num_files); |
| 327 |
| 328 for (uint64 i = 0; i < num_files; ++i) { |
| 329 std::string url_string; |
| 330 int64 size = 0; |
| 331 if (!pickle.ReadString(&iter, &url_string) || |
| 332 !pickle.ReadInt64(&iter, &size)) |
| 333 return false; |
| 334 |
| 335 GURL url(url_string); |
| 336 if (!url.is_valid()) |
| 337 return false; |
| 338 |
| 339 (*file_system_files)[i].url = url; |
| 340 (*file_system_files)[i].size = size; |
| 341 } |
| 342 return true; |
| 343 } |
| 344 |
297 // Utility to fill a ui::OSExchangeDataProvider object from DropData. | 345 // Utility to fill a ui::OSExchangeDataProvider object from DropData. |
298 void PrepareDragData(const DropData& drop_data, | 346 void PrepareDragData(const DropData& drop_data, |
299 ui::OSExchangeData::Provider* provider, | 347 ui::OSExchangeData::Provider* provider, |
300 WebContentsImpl* web_contents) { | 348 WebContentsImpl* web_contents) { |
301 provider->MarkOriginatedFromRenderer(); | 349 provider->MarkOriginatedFromRenderer(); |
302 #if defined(OS_WIN) | 350 #if defined(OS_WIN) |
303 // Put download before file contents to prefer the download of a image over | 351 // Put download before file contents to prefer the download of a image over |
304 // its thumbnail link. | 352 // its thumbnail link. |
305 if (!drop_data.download_metadata.empty()) | 353 if (!drop_data.download_metadata.empty()) |
306 PrepareDragForDownload(drop_data, provider, web_contents); | 354 PrepareDragForDownload(drop_data, provider, web_contents); |
307 #endif | 355 #endif |
308 #if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN) | 356 #if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN) |
309 // We set the file contents before the URL because the URL also sets file | 357 // We set the file contents before the URL because the URL also sets file |
310 // contents (to a .URL shortcut). We want to prefer file content data over | 358 // contents (to a .URL shortcut). We want to prefer file content data over |
311 // a shortcut so we add it first. | 359 // a shortcut so we add it first. |
312 if (!drop_data.file_contents.empty()) | 360 if (!drop_data.file_contents.empty()) |
313 PrepareDragForFileContents(drop_data, provider); | 361 PrepareDragForFileContents(drop_data, provider); |
314 #endif | 362 #endif |
315 if (!drop_data.text.string().empty()) | 363 if (!drop_data.text.string().empty()) |
316 provider->SetString(drop_data.text.string()); | 364 provider->SetString(drop_data.text.string()); |
317 if (drop_data.url.is_valid()) | 365 if (drop_data.url.is_valid()) |
318 provider->SetURL(drop_data.url, drop_data.url_title); | 366 provider->SetURL(drop_data.url, drop_data.url_title); |
319 if (!drop_data.html.string().empty()) | 367 if (!drop_data.html.string().empty()) |
320 provider->SetHtml(drop_data.html.string(), drop_data.html_base_url); | 368 provider->SetHtml(drop_data.html.string(), drop_data.html_base_url); |
321 if (!drop_data.filenames.empty()) | 369 if (!drop_data.filenames.empty()) |
322 provider->SetFilenames(drop_data.filenames); | 370 provider->SetFilenames(drop_data.filenames); |
| 371 if (!drop_data.file_system_files.empty()) { |
| 372 Pickle pickle; |
| 373 WriteFileSystemFilesToPickle(drop_data.file_system_files, &pickle); |
| 374 provider->SetPickledData(GetFileSystemFileCustomFormat(), pickle); |
| 375 } |
323 if (!drop_data.custom_data.empty()) { | 376 if (!drop_data.custom_data.empty()) { |
324 Pickle pickle; | 377 Pickle pickle; |
325 ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle); | 378 ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle); |
326 provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), | 379 provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), |
327 pickle); | 380 pickle); |
328 } | 381 } |
329 } | 382 } |
330 | 383 |
331 // Utility to fill a DropData object from ui::OSExchangeData. | 384 // Utility to fill a DropData object from ui::OSExchangeData. |
332 void PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) { | 385 void PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) { |
(...skipping 17 matching lines...) Expand all Loading... |
350 GURL html_base_url; | 403 GURL html_base_url; |
351 data.GetHtml(&html, &html_base_url); | 404 data.GetHtml(&html, &html_base_url); |
352 if (!html.empty()) | 405 if (!html.empty()) |
353 drop_data->html = base::NullableString16(html, false); | 406 drop_data->html = base::NullableString16(html, false); |
354 if (html_base_url.is_valid()) | 407 if (html_base_url.is_valid()) |
355 drop_data->html_base_url = html_base_url; | 408 drop_data->html_base_url = html_base_url; |
356 | 409 |
357 data.GetFilenames(&drop_data->filenames); | 410 data.GetFilenames(&drop_data->filenames); |
358 | 411 |
359 Pickle pickle; | 412 Pickle pickle; |
| 413 std::vector<DropData::FileSystemFileInfo> file_system_files; |
| 414 if (data.GetPickledData(GetFileSystemFileCustomFormat(), &pickle) && |
| 415 ReadFileSystemFilesFromPickle(pickle, &file_system_files)) |
| 416 drop_data->file_system_files = file_system_files; |
| 417 |
360 if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle)) | 418 if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle)) |
361 ui::ReadCustomDataIntoMap( | 419 ui::ReadCustomDataIntoMap( |
362 pickle.data(), pickle.size(), &drop_data->custom_data); | 420 pickle.data(), pickle.size(), &drop_data->custom_data); |
363 } | 421 } |
364 | 422 |
365 // Utilities to convert between blink::WebDragOperationsMask and | 423 // Utilities to convert between blink::WebDragOperationsMask and |
366 // ui::DragDropTypes. | 424 // ui::DragDropTypes. |
367 int ConvertFromWeb(blink::WebDragOperationsMask ops) { | 425 int ConvertFromWeb(blink::WebDragOperationsMask ops) { |
368 int drag_op = ui::DragDropTypes::DRAG_NONE; | 426 int drag_op = ui::DragDropTypes::DRAG_NONE; |
369 if (ops & blink::WebDragOperationCopy) | 427 if (ops & blink::WebDragOperationCopy) |
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 event.location(), | 1535 event.location(), |
1478 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), | 1536 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), |
1479 ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); | 1537 ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); |
1480 if (drag_dest_delegate_) | 1538 if (drag_dest_delegate_) |
1481 drag_dest_delegate_->OnDrop(); | 1539 drag_dest_delegate_->OnDrop(); |
1482 current_drop_data_.reset(); | 1540 current_drop_data_.reset(); |
1483 return ConvertFromWeb(current_drag_op_); | 1541 return ConvertFromWeb(current_drag_op_); |
1484 } | 1542 } |
1485 | 1543 |
1486 } // namespace content | 1544 } // namespace content |
OLD | NEW |