| 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/download/save_package.h" | 5 #include "content/browser/download/save_package.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <utility> | 8 #include <utility> | 
| 9 | 9 | 
| 10 #include "base/bind.h" | 10 #include "base/bind.h" | 
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" | 
| 12 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" | 
| 13 #include "base/i18n/file_util_icu.h" | 13 #include "base/i18n/file_util_icu.h" | 
| 14 #include "base/logging.h" | 14 #include "base/logging.h" | 
| 15 #include "base/macros.h" | 15 #include "base/macros.h" | 
| 16 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" | 
| 17 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" | 
| 18 #include "base/stl_util.h" | 18 #include "base/stl_util.h" | 
| 19 #include "base/strings/string_piece.h" | 19 #include "base/strings/string_piece.h" | 
| 20 #include "base/strings/string_split.h" | 20 #include "base/strings/string_split.h" | 
| 21 #include "base/strings/sys_string_conversions.h" | 21 #include "base/strings/sys_string_conversions.h" | 
| 22 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" | 
|  | 23 #include "base/task_runner_util.h" | 
| 23 #include "base/threading/thread.h" | 24 #include "base/threading/thread.h" | 
| 24 #include "build/build_config.h" | 25 #include "build/build_config.h" | 
| 25 #include "components/url_formatter/url_formatter.h" | 26 #include "components/url_formatter/url_formatter.h" | 
| 26 #include "content/browser/bad_message.h" | 27 #include "content/browser/bad_message.h" | 
| 27 #include "content/browser/download/download_item_impl.h" | 28 #include "content/browser/download/download_item_impl.h" | 
| 28 #include "content/browser/download/download_manager_impl.h" | 29 #include "content/browser/download/download_manager_impl.h" | 
| 29 #include "content/browser/download/download_stats.h" | 30 #include "content/browser/download/download_stats.h" | 
|  | 31 #include "content/browser/download/download_task_runner.h" | 
| 30 #include "content/browser/download/save_file.h" | 32 #include "content/browser/download/save_file.h" | 
| 31 #include "content/browser/download/save_file_manager.h" | 33 #include "content/browser/download/save_file_manager.h" | 
| 32 #include "content/browser/download/save_item.h" | 34 #include "content/browser/download/save_item.h" | 
| 33 #include "content/browser/frame_host/frame_tree.h" | 35 #include "content/browser/frame_host/frame_tree.h" | 
| 34 #include "content/browser/frame_host/frame_tree_node.h" | 36 #include "content/browser/frame_host/frame_tree_node.h" | 
| 35 #include "content/browser/frame_host/render_frame_host_impl.h" | 37 #include "content/browser/frame_host/render_frame_host_impl.h" | 
| 36 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 38 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 
| 37 #include "content/browser/renderer_host/render_process_host_impl.h" | 39 #include "content/browser/renderer_host/render_process_host_impl.h" | 
| 38 #include "content/browser/renderer_host/render_view_host_delegate.h" | 40 #include "content/browser/renderer_host/render_view_host_delegate.h" | 
| 39 #include "content/browser/renderer_host/render_view_host_impl.h" | 41 #include "content/browser/renderer_host/render_view_host_impl.h" | 
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 621   } | 623   } | 
| 622 | 624 | 
| 623   // This vector contains the save ids of the save files which SaveFileManager | 625   // This vector contains the save ids of the save files which SaveFileManager | 
| 624   // needs to remove from its save_file_map_. | 626   // needs to remove from its save_file_map_. | 
| 625   std::vector<SaveItemId> save_item_ids; | 627   std::vector<SaveItemId> save_item_ids; | 
| 626   for (const auto& it : saved_success_items_) | 628   for (const auto& it : saved_success_items_) | 
| 627     save_item_ids.push_back(it.first); | 629     save_item_ids.push_back(it.first); | 
| 628   for (const auto& it : saved_failed_items_) | 630   for (const auto& it : saved_failed_items_) | 
| 629     save_item_ids.push_back(it.first); | 631     save_item_ids.push_back(it.first); | 
| 630 | 632 | 
| 631   BrowserThread::PostTask( | 633   GetDownloadTaskRunner()->PostTask( | 
| 632       BrowserThread::FILE, FROM_HERE, | 634       FROM_HERE, base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, | 
| 633       base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, file_manager_, | 635                             file_manager_, save_item_ids)); | 
| 634                  save_item_ids)); |  | 
| 635 | 636 | 
| 636   finished_ = true; | 637   finished_ = true; | 
| 637   wait_state_ = FAILED; | 638   wait_state_ = FAILED; | 
| 638 | 639 | 
| 639   // Inform the DownloadItem we have canceled whole save page job. | 640   // Inform the DownloadItem we have canceled whole save page job. | 
| 640   if (download_) { | 641   if (download_) { | 
| 641     if (cancel_download_item) | 642     if (cancel_download_item) | 
| 642       download_->Cancel(false); | 643       download_->Cancel(false); | 
| 643     FinalizeDownloadEntry(); | 644     FinalizeDownloadEntry(); | 
| 644   } | 645   } | 
| 645 } | 646 } | 
| 646 | 647 | 
| 647 void SavePackage::CheckFinish() { | 648 void SavePackage::CheckFinish() { | 
| 648   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 649   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 649   if (in_process_count() || finished_) | 650   if (in_process_count() || finished_) | 
| 650     return; | 651     return; | 
| 651 | 652 | 
| 652   base::FilePath dir = (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML && | 653   base::FilePath dir = (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML && | 
| 653                         saved_success_items_.size() > 1) ? | 654                         saved_success_items_.size() > 1) ? | 
| 654                         saved_main_directory_path_ : base::FilePath(); | 655                         saved_main_directory_path_ : base::FilePath(); | 
| 655 | 656 | 
| 656   FinalNamesMap final_names; | 657   FinalNamesMap final_names; | 
| 657   for (const auto& it : saved_success_items_) | 658   for (const auto& it : saved_success_items_) | 
| 658     final_names.insert(std::make_pair(it.first, it.second->full_path())); | 659     final_names.insert(std::make_pair(it.first, it.second->full_path())); | 
| 659 | 660 | 
| 660   BrowserThread::PostTask( | 661   GetDownloadTaskRunner()->PostTask( | 
| 661       BrowserThread::FILE, FROM_HERE, | 662       FROM_HERE, | 
| 662       base::Bind(&SaveFileManager::RenameAllFiles, | 663       base::Bind(&SaveFileManager::RenameAllFiles, file_manager_, final_names, | 
| 663                  file_manager_, | 664                  dir, web_contents()->GetRenderProcessHost()->GetID(), | 
| 664                  final_names, | 665                  web_contents()->GetMainFrame()->GetRoutingID(), id())); | 
| 665                  dir, |  | 
| 666                  web_contents()->GetRenderProcessHost()->GetID(), |  | 
| 667                  web_contents()->GetMainFrame()->GetRoutingID(), |  | 
| 668                  id())); |  | 
| 669 } | 666 } | 
| 670 | 667 | 
| 671 // Successfully finished all items of this SavePackage. | 668 // Successfully finished all items of this SavePackage. | 
| 672 void SavePackage::Finish() { | 669 void SavePackage::Finish() { | 
| 673   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 670   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 674   // User may cancel the job when we're moving files to the final directory. | 671   // User may cancel the job when we're moving files to the final directory. | 
| 675   if (canceled()) | 672   if (canceled()) | 
| 676     return; | 673     return; | 
| 677 | 674 | 
| 678   wait_state_ = SUCCESSFUL; | 675   wait_state_ = SUCCESSFUL; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 690 | 687 | 
| 691   // This vector contains the save ids of the save files which SaveFileManager | 688   // This vector contains the save ids of the save files which SaveFileManager | 
| 692   // needs to remove from its |save_file_map_|. | 689   // needs to remove from its |save_file_map_|. | 
| 693   std::vector<SaveItemId> list_of_failed_save_item_ids; | 690   std::vector<SaveItemId> list_of_failed_save_item_ids; | 
| 694   for (const auto& it : saved_failed_items_) { | 691   for (const auto& it : saved_failed_items_) { | 
| 695     const SaveItem* save_item = it.second.get(); | 692     const SaveItem* save_item = it.second.get(); | 
| 696     DCHECK_EQ(it.first, save_item->id()); | 693     DCHECK_EQ(it.first, save_item->id()); | 
| 697     list_of_failed_save_item_ids.push_back(save_item->id()); | 694     list_of_failed_save_item_ids.push_back(save_item->id()); | 
| 698   } | 695   } | 
| 699 | 696 | 
| 700   BrowserThread::PostTask( | 697   GetDownloadTaskRunner()->PostTask( | 
| 701       BrowserThread::FILE, FROM_HERE, | 698       FROM_HERE, base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, | 
| 702       base::Bind(&SaveFileManager::RemoveSavedFileFromFileMap, file_manager_, | 699                             file_manager_, list_of_failed_save_item_ids)); | 
| 703                  list_of_failed_save_item_ids)); |  | 
| 704 | 700 | 
| 705   if (download_) { | 701   if (download_) { | 
| 706     if (save_type_ != SAVE_PAGE_TYPE_AS_MHTML) { | 702     if (save_type_ != SAVE_PAGE_TYPE_AS_MHTML) { | 
| 707       download_->DestinationUpdate( | 703       download_->DestinationUpdate( | 
| 708           all_save_items_count_, CurrentSpeed(), | 704           all_save_items_count_, CurrentSpeed(), | 
| 709           std::vector<DownloadItem::ReceivedSlice>()); | 705           std::vector<DownloadItem::ReceivedSlice>()); | 
| 710       download_->OnAllDataSaved(all_save_items_count_, | 706       download_->OnAllDataSaved(all_save_items_count_, | 
| 711                                 std::unique_ptr<crypto::SecureHash>()); | 707                                 std::unique_ptr<crypto::SecureHash>()); | 
| 712     } | 708     } | 
| 713     download_->MarkAsComplete(); | 709     download_->MarkAsComplete(); | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 755   // Continue processing the save page job. | 751   // Continue processing the save page job. | 
| 756   DoSavingProcess(); | 752   DoSavingProcess(); | 
| 757 | 753 | 
| 758   // Check whether we can successfully finish whole job. | 754   // Check whether we can successfully finish whole job. | 
| 759   CheckFinish(); | 755   CheckFinish(); | 
| 760 } | 756 } | 
| 761 | 757 | 
| 762 void SavePackage::SaveCanceled(const SaveItem* save_item) { | 758 void SavePackage::SaveCanceled(const SaveItem* save_item) { | 
| 763   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 759   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 764   file_manager_->RemoveSaveFile(save_item->id(), this); | 760   file_manager_->RemoveSaveFile(save_item->id(), this); | 
| 765   BrowserThread::PostTask( | 761   GetDownloadTaskRunner()->PostTask( | 
| 766       BrowserThread::FILE, FROM_HERE, | 762       FROM_HERE, | 
| 767       base::Bind(&SaveFileManager::CancelSave, file_manager_, save_item->id())); | 763       base::Bind(&SaveFileManager::CancelSave, file_manager_, save_item->id())); | 
| 768 } | 764 } | 
| 769 | 765 | 
| 770 void SavePackage::SaveNextFile(bool process_all_remaining_items) { | 766 void SavePackage::SaveNextFile(bool process_all_remaining_items) { | 
| 771   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 767   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 772   DCHECK(web_contents()); | 768   DCHECK(web_contents()); | 
| 773   DCHECK(!waiting_item_queue_.empty()); | 769   DCHECK(!waiting_item_queue_.empty()); | 
| 774 | 770 | 
| 775   do { | 771   do { | 
| 776     // Pop SaveItem from waiting list. | 772     // Pop SaveItem from waiting list. | 
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 916     const SaveItem* save_item = item.second; | 912     const SaveItem* save_item = item.second; | 
| 917 | 913 | 
| 918     FrameTreeNode* frame_tree_node = frame_tree->FindByID(frame_tree_node_id); | 914     FrameTreeNode* frame_tree_node = frame_tree->FindByID(frame_tree_node_id); | 
| 919     if (frame_tree_node && | 915     if (frame_tree_node && | 
| 920         frame_tree_node->current_frame_host()->IsRenderFrameLive()) { | 916         frame_tree_node->current_frame_host()->IsRenderFrameLive()) { | 
| 921       // Ask the frame for HTML to be written to the associated SaveItem. | 917       // Ask the frame for HTML to be written to the associated SaveItem. | 
| 922       GetSerializedHtmlWithLocalLinksForFrame(frame_tree_node); | 918       GetSerializedHtmlWithLocalLinksForFrame(frame_tree_node); | 
| 923       number_of_frames_pending_response_++; | 919       number_of_frames_pending_response_++; | 
| 924     } else { | 920     } else { | 
| 925       // Notify SaveFileManager about the failure to save this SaveItem. | 921       // Notify SaveFileManager about the failure to save this SaveItem. | 
| 926       BrowserThread::PostTask( | 922       GetDownloadTaskRunner()->PostTask( | 
| 927           BrowserThread::FILE, FROM_HERE, | 923           FROM_HERE, base::Bind(&SaveFileManager::SaveFinished, file_manager_, | 
| 928           base::Bind(&SaveFileManager::SaveFinished, file_manager_, | 924                                 save_item->id(), id(), false)); | 
| 929                      save_item->id(), id(), false)); |  | 
| 930     } | 925     } | 
| 931   } | 926   } | 
| 932   if (number_of_frames_pending_response_ == 0) { | 927   if (number_of_frames_pending_response_ == 0) { | 
| 933     // All frames disappeared since gathering of savable resources? | 928     // All frames disappeared since gathering of savable resources? | 
| 934     // Treat this as cancellation. | 929     // Treat this as cancellation. | 
| 935     Cancel(false); | 930     Cancel(false); | 
| 936   } | 931   } | 
| 937 } | 932 } | 
| 938 | 933 | 
| 939 void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( | 934 void SavePackage::GetSerializedHtmlWithLocalLinksForFrame( | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1030 | 1025 | 
| 1031     return; | 1026     return; | 
| 1032   } | 1027   } | 
| 1033 | 1028 | 
| 1034   if (!data.empty()) { | 1029   if (!data.empty()) { | 
| 1035     // Prepare buffer for saving HTML data. | 1030     // Prepare buffer for saving HTML data. | 
| 1036     scoped_refptr<net::IOBuffer> new_data(new net::IOBuffer(data.size())); | 1031     scoped_refptr<net::IOBuffer> new_data(new net::IOBuffer(data.size())); | 
| 1037     memcpy(new_data->data(), data.data(), data.size()); | 1032     memcpy(new_data->data(), data.data(), data.size()); | 
| 1038 | 1033 | 
| 1039     // Call write file functionality in FILE thread. | 1034     // Call write file functionality in FILE thread. | 
| 1040     BrowserThread::PostTask( | 1035     GetDownloadTaskRunner()->PostTask( | 
| 1041         BrowserThread::FILE, FROM_HERE, | 1036         FROM_HERE, | 
| 1042         base::Bind(&SaveFileManager::UpdateSaveProgress, file_manager_, | 1037         base::Bind(&SaveFileManager::UpdateSaveProgress, file_manager_, | 
| 1043                    save_item->id(), base::RetainedRef(new_data), | 1038                    save_item->id(), base::RetainedRef(new_data), | 
| 1044                    static_cast<int>(data.size()))); | 1039                    static_cast<int>(data.size()))); | 
| 1045   } | 1040   } | 
| 1046 | 1041 | 
| 1047   // Current frame is completed saving, call finish in FILE thread. | 1042   // Current frame is completed saving, call finish in FILE thread. | 
| 1048   if (end_of_data) { | 1043   if (end_of_data) { | 
| 1049     DVLOG(20) << __func__ << "() save_item_id = " << save_item->id() | 1044     DVLOG(20) << __func__ << "() save_item_id = " << save_item->id() | 
| 1050               << " url = \"" << save_item->url().spec() << "\""; | 1045               << " url = \"" << save_item->url().spec() << "\""; | 
| 1051     BrowserThread::PostTask( | 1046     GetDownloadTaskRunner()->PostTask( | 
| 1052         BrowserThread::FILE, FROM_HERE, | 1047         FROM_HERE, base::Bind(&SaveFileManager::SaveFinished, file_manager_, | 
| 1053         base::Bind(&SaveFileManager::SaveFinished, file_manager_, | 1048                               save_item->id(), id(), true)); | 
| 1054                    save_item->id(), id(), true)); |  | 
| 1055     number_of_frames_pending_response_--; | 1049     number_of_frames_pending_response_--; | 
| 1056     DCHECK_LE(0, number_of_frames_pending_response_); | 1050     DCHECK_LE(0, number_of_frames_pending_response_); | 
| 1057   } | 1051   } | 
| 1058 } | 1052 } | 
| 1059 | 1053 | 
| 1060 // Ask for all savable resource links from backend, include main frame and | 1054 // Ask for all savable resource links from backend, include main frame and | 
| 1061 // sub-frame. | 1055 // sub-frame. | 
| 1062 void SavePackage::GetSavableResourceLinks() { | 1056 void SavePackage::GetSavableResourceLinks() { | 
| 1063   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1057   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 1064   if (wait_state_ != START_PROCESS) | 1058   if (wait_state_ != START_PROCESS) | 
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1276   if (can_save_as_complete) | 1270   if (can_save_as_complete) | 
| 1277     name_with_proper_ext = EnsureHtmlExtension(name_with_proper_ext); | 1271     name_with_proper_ext = EnsureHtmlExtension(name_with_proper_ext); | 
| 1278 | 1272 | 
| 1279   base::FilePath::StringType file_name = name_with_proper_ext.value(); | 1273   base::FilePath::StringType file_name = name_with_proper_ext.value(); | 
| 1280   base::i18n::ReplaceIllegalCharactersInPath(&file_name, '_'); | 1274   base::i18n::ReplaceIllegalCharactersInPath(&file_name, '_'); | 
| 1281   return base::FilePath(file_name); | 1275   return base::FilePath(file_name); | 
| 1282 } | 1276 } | 
| 1283 | 1277 | 
| 1284 // static | 1278 // static | 
| 1285 base::FilePath SavePackage::EnsureHtmlExtension(const base::FilePath& name) { | 1279 base::FilePath SavePackage::EnsureHtmlExtension(const base::FilePath& name) { | 
| 1286   DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 1280   DCHECK(GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); | 
| 1287 | 1281 | 
| 1288   base::FilePath::StringType ext = name.Extension(); | 1282   base::FilePath::StringType ext = name.Extension(); | 
| 1289   if (!ext.empty()) | 1283   if (!ext.empty()) | 
| 1290     ext.erase(ext.begin());  // Erase preceding '.'. | 1284     ext.erase(ext.begin());  // Erase preceding '.'. | 
| 1291   std::string mime_type; | 1285   std::string mime_type; | 
| 1292   if (!net::GetMimeTypeFromExtension(ext, &mime_type) || | 1286   if (!net::GetMimeTypeFromExtension(ext, &mime_type) || | 
| 1293       !CanSaveAsComplete(mime_type)) { | 1287       !CanSaveAsComplete(mime_type)) { | 
| 1294     return base::FilePath(name.value() + FILE_PATH_LITERAL(".") + | 1288     return base::FilePath(name.value() + FILE_PATH_LITERAL(".") + | 
| 1295                           kDefaultHtmlExtension); | 1289                           kDefaultHtmlExtension); | 
| 1296   } | 1290   } | 
| 1297   return name; | 1291   return name; | 
| 1298 } | 1292 } | 
| 1299 | 1293 | 
| 1300 // static | 1294 // static | 
| 1301 base::FilePath SavePackage::EnsureMimeExtension(const base::FilePath& name, | 1295 base::FilePath SavePackage::EnsureMimeExtension(const base::FilePath& name, | 
| 1302     const std::string& contents_mime_type) { | 1296     const std::string& contents_mime_type) { | 
| 1303   DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 1297   DCHECK(GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); | 
| 1304 | 1298 | 
| 1305   // Start extension at 1 to skip over period if non-empty. | 1299   // Start extension at 1 to skip over period if non-empty. | 
| 1306   base::FilePath::StringType ext = name.Extension(); | 1300   base::FilePath::StringType ext = name.Extension(); | 
| 1307   if (!ext.empty()) | 1301   if (!ext.empty()) | 
| 1308     ext = ext.substr(1); | 1302     ext = ext.substr(1); | 
| 1309   base::FilePath::StringType suggested_extension = | 1303   base::FilePath::StringType suggested_extension = | 
| 1310       ExtensionForMimeType(contents_mime_type); | 1304       ExtensionForMimeType(contents_mime_type); | 
| 1311   std::string mime_type; | 1305   std::string mime_type; | 
| 1312   if (!suggested_extension.empty() && | 1306   if (!suggested_extension.empty() && | 
| 1313       !net::GetMimeTypeFromExtension(ext, &mime_type)) { | 1307       !net::GetMimeTypeFromExtension(ext, &mime_type)) { | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1346   base::FilePath download_save_dir; | 1340   base::FilePath download_save_dir; | 
| 1347   bool skip_dir_check = false; | 1341   bool skip_dir_check = false; | 
| 1348   auto* delegate = download_manager_->GetDelegate(); | 1342   auto* delegate = download_manager_->GetDelegate(); | 
| 1349   if (delegate) { | 1343   if (delegate) { | 
| 1350     delegate->GetSaveDir( | 1344     delegate->GetSaveDir( | 
| 1351         web_contents()->GetBrowserContext(), &website_save_dir, | 1345         web_contents()->GetBrowserContext(), &website_save_dir, | 
| 1352         &download_save_dir, &skip_dir_check); | 1346         &download_save_dir, &skip_dir_check); | 
| 1353   } | 1347   } | 
| 1354   std::string mime_type = web_contents()->GetContentsMimeType(); | 1348   std::string mime_type = web_contents()->GetContentsMimeType(); | 
| 1355   bool can_save_as_complete = CanSaveAsComplete(mime_type); | 1349   bool can_save_as_complete = CanSaveAsComplete(mime_type); | 
| 1356   BrowserThread::PostTaskAndReplyWithResult( | 1350   PostTaskAndReplyWithResult( | 
| 1357       BrowserThread::FILE, FROM_HERE, | 1351       GetDownloadTaskRunner().get(), FROM_HERE, | 
| 1358       base::Bind(&SavePackage::CreateDirectoryOnFileThread, title_, page_url_, | 1352       base::Bind(&SavePackage::CreateDirectoryOnFileThread, title_, page_url_, | 
| 1359                  can_save_as_complete, mime_type, website_save_dir, | 1353                  can_save_as_complete, mime_type, website_save_dir, | 
| 1360                  download_save_dir, skip_dir_check), | 1354                  download_save_dir, skip_dir_check), | 
| 1361       base::Bind(&SavePackage::ContinueGetSaveInfo, this, | 1355       base::Bind(&SavePackage::ContinueGetSaveInfo, this, | 
| 1362                  can_save_as_complete)); | 1356                  can_save_as_complete)); | 
| 1363 } | 1357 } | 
| 1364 | 1358 | 
| 1365 // static | 1359 // static | 
| 1366 base::FilePath SavePackage::CreateDirectoryOnFileThread( | 1360 base::FilePath SavePackage::CreateDirectoryOnFileThread( | 
| 1367     const base::string16& title, | 1361     const base::string16& title, | 
| 1368     const GURL& page_url, | 1362     const GURL& page_url, | 
| 1369     bool can_save_as_complete, | 1363     bool can_save_as_complete, | 
| 1370     const std::string& mime_type, | 1364     const std::string& mime_type, | 
| 1371     const base::FilePath& website_save_dir, | 1365     const base::FilePath& website_save_dir, | 
| 1372     const base::FilePath& download_save_dir, | 1366     const base::FilePath& download_save_dir, | 
| 1373     bool skip_dir_check) { | 1367     bool skip_dir_check) { | 
| 1374   DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 1368   DCHECK(GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); | 
| 1375 | 1369 | 
| 1376   base::FilePath suggested_filename = GetSuggestedNameForSaveAs( | 1370   base::FilePath suggested_filename = GetSuggestedNameForSaveAs( | 
| 1377       title, page_url, can_save_as_complete, mime_type); | 1371       title, page_url, can_save_as_complete, mime_type); | 
| 1378 | 1372 | 
| 1379   base::FilePath save_dir; | 1373   base::FilePath save_dir; | 
| 1380   // If the default html/websites save folder doesn't exist... | 1374   // If the default html/websites save folder doesn't exist... | 
| 1381   // We skip the directory check for gdata directories on ChromeOS. | 1375   // We skip the directory check for gdata directories on ChromeOS. | 
| 1382   if (!skip_dir_check && !base::DirectoryExists(website_save_dir)) { | 1376   if (!skip_dir_check && !base::DirectoryExists(website_save_dir)) { | 
| 1383     // If the default download dir doesn't exist, create it. | 1377     // If the default download dir doesn't exist, create it. | 
| 1384     if (!base::DirectoryExists(download_save_dir)) { | 1378     if (!base::DirectoryExists(download_save_dir)) { | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1461 void SavePackage::FinalizeDownloadEntry() { | 1455 void SavePackage::FinalizeDownloadEntry() { | 
| 1462   DCHECK(download_); | 1456   DCHECK(download_); | 
| 1463   DCHECK(download_manager_); | 1457   DCHECK(download_manager_); | 
| 1464 | 1458 | 
| 1465   download_manager_->OnSavePackageSuccessfullyFinished(download_); | 1459   download_manager_->OnSavePackageSuccessfullyFinished(download_); | 
| 1466   download_ = nullptr; | 1460   download_ = nullptr; | 
| 1467   download_manager_ = nullptr; | 1461   download_manager_ = nullptr; | 
| 1468 } | 1462 } | 
| 1469 | 1463 | 
| 1470 }  // namespace content | 1464 }  // namespace content | 
| OLD | NEW | 
|---|