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

Side by Side Diff: content/browser/download/save_package.cc

Issue 2890853002: Downloads: replace BrowserThread::FILE with task scheduler. (Closed)
Patch Set: Add a missing mock expectation. Created 3 years, 6 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
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 "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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698