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 |