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

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

Issue 10704052: Download filename determination refactor (3/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with r148594 to and resolve conflicts with r148576 Created 8 years, 4 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 | Annotate | Revision Log
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/download_item_impl.h" 5 #include "content/browser/download/download_item_impl.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 692
693 DCHECK(IsInProgress()); 693 DCHECK(IsInProgress());
694 if (is_paused_) 694 if (is_paused_)
695 request_handle_->ResumeRequest(); 695 request_handle_->ResumeRequest();
696 else 696 else
697 request_handle_->PauseRequest(); 697 request_handle_->PauseRequest();
698 is_paused_ = !is_paused_; 698 is_paused_ = !is_paused_;
699 UpdateObservers(); 699 UpdateObservers();
700 } 700 }
701 701
702 void DownloadItemImpl::OnDownloadCompleting(DownloadFileManager* file_manager) { 702 void DownloadItemImpl::OnDownloadCompleting() {
703 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 703 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
704 704
705 VLOG(20) << __FUNCTION__ << "()" 705 VLOG(20) << __FUNCTION__ << "()"
706 << " needs rename = " << NeedsRename() 706 << " needs rename = " << NeedsRename()
707 << " " << DebugString(true); 707 << " " << DebugString(true);
708 DCHECK(!GetTargetName().empty()); 708 DCHECK(!GetTargetName().empty());
709 DCHECK_NE(DANGEROUS, GetSafetyState()); 709 DCHECK_NE(DANGEROUS, GetSafetyState());
710 DCHECK(file_manager);
711 710
712 if (NeedsRename()) { 711 if (NeedsRename()) {
713 DownloadFileManager::RenameCompletionCallback callback = 712 DownloadFileManager::RenameCompletionCallback callback =
714 base::Bind(&DownloadItemImpl::OnDownloadRenamedToFinalName, 713 base::Bind(&DownloadItemImpl::OnDownloadRenamedToFinalName,
715 weak_ptr_factory_.GetWeakPtr(), 714 weak_ptr_factory_.GetWeakPtr());
716 base::Unretained(file_manager));
717 BrowserThread::PostTask( 715 BrowserThread::PostTask(
718 BrowserThread::FILE, FROM_HERE, 716 BrowserThread::FILE, FROM_HERE,
719 base::Bind(&DownloadFileManager::RenameDownloadFile, 717 base::Bind(&DownloadFileManager::RenameDownloadFile,
720 file_manager, GetGlobalId(), GetTargetFilePath(), 718 delegate_->GetDownloadFileManager(), GetGlobalId(),
721 true, callback)); 719 GetTargetFilePath(), true, callback));
722 } else { 720 } else {
723 // Complete the download and release the DownloadFile. 721 // Complete the download and release the DownloadFile.
724 BrowserThread::PostTask( 722 BrowserThread::PostTask(
725 BrowserThread::FILE, FROM_HERE, 723 BrowserThread::FILE, FROM_HERE,
726 base::Bind(&DownloadFileManager::CompleteDownload, 724 base::Bind(&DownloadFileManager::CompleteDownload,
727 file_manager, GetGlobalId(), 725 delegate_->GetDownloadFileManager(), GetGlobalId(),
728 base::Bind(&DownloadItemImpl::OnDownloadFileReleased, 726 base::Bind(&DownloadItemImpl::OnDownloadFileReleased,
729 weak_ptr_factory_.GetWeakPtr()))); 727 weak_ptr_factory_.GetWeakPtr())));
730 } 728 }
731 } 729 }
732 730
733 void DownloadItemImpl::OnDownloadRenamedToFinalName( 731 void DownloadItemImpl::OnDownloadRenamedToFinalName(
734 DownloadFileManager* file_manager,
735 content::DownloadInterruptReason reason, 732 content::DownloadInterruptReason reason,
736 const FilePath& full_path) { 733 const FilePath& full_path) {
737 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 734 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
738 735
739 VLOG(20) << __FUNCTION__ << "()" 736 VLOG(20) << __FUNCTION__ << "()"
740 << " full_path = \"" << full_path.value() << "\"" 737 << " full_path = \"" << full_path.value() << "\""
741 << " needed rename = " << NeedsRename() 738 << " needed rename = " << NeedsRename()
742 << " " << DebugString(false); 739 << " " << DebugString(false);
743 DCHECK(NeedsRename()); 740 DCHECK(NeedsRename());
744 741
745 if (content::DOWNLOAD_INTERRUPT_REASON_NONE != reason) { 742 if (content::DOWNLOAD_INTERRUPT_REASON_NONE != reason) {
746 Interrupt(reason); 743 Interrupt(reason);
747 return; 744 return;
748 } 745 }
749 746
750 // full_path is now the current and target file path. 747 // full_path is now the current and target file path.
751 DCHECK(!full_path.empty()); 748 DCHECK(!full_path.empty());
752 target_path_ = full_path; 749 target_path_ = full_path;
753 SetFullPath(full_path); 750 SetFullPath(full_path);
754 delegate_->DownloadRenamedToFinalName(this); 751 delegate_->DownloadRenamedToFinalName(this);
755 752
756 // Complete the download and release the DownloadFile. 753 // Complete the download and release the DownloadFile.
757 BrowserThread::PostTask( 754 BrowserThread::PostTask(
758 BrowserThread::FILE, FROM_HERE, 755 BrowserThread::FILE, FROM_HERE,
759 base::Bind(&DownloadFileManager::CompleteDownload, 756 base::Bind(&DownloadFileManager::CompleteDownload,
760 file_manager, GetGlobalId(), 757 delegate_->GetDownloadFileManager(), GetGlobalId(),
761 base::Bind(&DownloadItemImpl::OnDownloadFileReleased, 758 base::Bind(&DownloadItemImpl::OnDownloadFileReleased,
762 weak_ptr_factory_.GetWeakPtr()))); 759 weak_ptr_factory_.GetWeakPtr())));
763 } 760 }
764 761
765 void DownloadItemImpl::OnDownloadFileReleased() { 762 void DownloadItemImpl::OnDownloadFileReleased() {
766 if (delegate_->ShouldOpenDownload(this)) 763 if (delegate_->ShouldOpenDownload(this))
767 Completed(); 764 Completed();
768 else 765 else
769 delegate_delayed_complete_ = true; 766 delegate_delayed_complete_ = true;
770 } 767 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 } 856 }
860 857
861 const FilePath& DownloadItemImpl::GetTargetFilePath() const { 858 const FilePath& DownloadItemImpl::GetTargetFilePath() const {
862 return target_path_; 859 return target_path_;
863 } 860 }
864 861
865 DownloadItem::TargetDisposition DownloadItemImpl::GetTargetDisposition() const { 862 DownloadItem::TargetDisposition DownloadItemImpl::GetTargetDisposition() const {
866 return target_disposition_; 863 return target_disposition_;
867 } 864 }
868 865
869 void DownloadItemImpl::OnTargetPathDetermined( 866 void DownloadItemImpl::OnDownloadTargetDetermined(
870 const FilePath& target_path, 867 const FilePath& target_path,
871 TargetDisposition disposition, 868 TargetDisposition disposition,
872 content::DownloadDangerType danger_type) { 869 content::DownloadDangerType danger_type,
870 const FilePath& intermediate_path) {
873 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 871 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
872
873 // If the |target_path| is empty, then we consider this download to be
874 // canceled.
875 if (target_path.empty()) {
876 Cancel(true);
877 return;
878 }
879
874 target_path_ = target_path; 880 target_path_ = target_path;
875 target_disposition_ = disposition; 881 target_disposition_ = disposition;
876 SetDangerType(danger_type); 882 SetDangerType(danger_type);
877 } 883 // TODO(asanka): SetDangerType() doesn't need to send a notification here.
878 884
879 void DownloadItemImpl::OnTargetPathSelected(const FilePath& target_path) { 885 // We want the intermediate and target paths to refer to the same directory so
880 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 886 // that they are both on the same device and subject to same
881 DCHECK_EQ(TARGET_DISPOSITION_PROMPT, target_disposition_); 887 // space/permission/availability constraints.
882 target_path_ = target_path; 888 DCHECK(intermediate_path.DirName() == target_path.DirName());
889
890 // Rename to intermediate name.
891 // TODO(asanka): Skip this rename if AllDataSaved() is true. This avoids a
892 // spurious rename when we can just rename to the final
893 // filename. Unnecessary renames may cause bugs like
894 // http://crbug.com/74187.
895 DownloadFileManager::RenameCompletionCallback callback =
896 base::Bind(&DownloadItemImpl::OnDownloadRenamedToIntermediateName,
897 weak_ptr_factory_.GetWeakPtr());
898 BrowserThread::PostTask(
899 BrowserThread::FILE, FROM_HERE,
900 base::Bind(&DownloadFileManager::RenameDownloadFile,
901 delegate_->GetDownloadFileManager(), GetGlobalId(),
902 intermediate_path, false, callback));
883 } 903 }
884 904
885 void DownloadItemImpl::OnContentCheckCompleted( 905 void DownloadItemImpl::OnContentCheckCompleted(
886 content::DownloadDangerType danger_type) { 906 content::DownloadDangerType danger_type) {
887 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 907 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
888 DCHECK(AllDataSaved()); 908 DCHECK(AllDataSaved());
889 SetDangerType(danger_type); 909 SetDangerType(danger_type);
890 UpdateObservers(); 910 UpdateObservers();
891 } 911 }
892 912
893 void DownloadItemImpl::OnIntermediatePathDetermined(
894 DownloadFileManager* file_manager,
895 const FilePath& intermediate_path) {
896 DownloadFileManager::RenameCompletionCallback callback =
897 base::Bind(&DownloadItemImpl::OnDownloadRenamedToIntermediateName,
898 weak_ptr_factory_.GetWeakPtr());
899 BrowserThread::PostTask(
900 BrowserThread::FILE, FROM_HERE,
901 base::Bind(&DownloadFileManager::RenameDownloadFile,
902 file_manager, GetGlobalId(), intermediate_path,
903 false, callback));
904 }
905
906 const FilePath& DownloadItemImpl::GetFullPath() const { 913 const FilePath& DownloadItemImpl::GetFullPath() const {
907 return current_path_; 914 return current_path_;
908 } 915 }
909 916
910 FilePath DownloadItemImpl::GetFileNameToReportUser() const { 917 FilePath DownloadItemImpl::GetFileNameToReportUser() const {
911 if (!display_name_.empty()) 918 if (!display_name_.empty())
912 return display_name_; 919 return display_name_;
913 return target_path_.BaseName(); 920 return target_path_.BaseName();
914 } 921 }
915 922
916 void DownloadItemImpl::SetDisplayName(const FilePath& name) { 923 void DownloadItemImpl::SetDisplayName(const FilePath& name) {
917 display_name_ = name; 924 display_name_ = name;
918 } 925 }
919 926
920 FilePath DownloadItemImpl::GetUserVerifiedFilePath() const { 927 FilePath DownloadItemImpl::GetUserVerifiedFilePath() const {
921 return (safety_state_ == DownloadItem::SAFE) ? 928 return (safety_state_ == DownloadItem::SAFE) ?
922 GetTargetFilePath() : GetFullPath(); 929 GetTargetFilePath() : GetFullPath();
923 } 930 }
924 931
925 void DownloadItemImpl::OffThreadCancel(DownloadFileManager* file_manager) { 932 void DownloadItemImpl::OffThreadCancel() {
926 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 933 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
927 request_handle_->CancelRequest(); 934 request_handle_->CancelRequest();
928 935
929 BrowserThread::PostTask( 936 BrowserThread::PostTask(
930 BrowserThread::FILE, FROM_HERE, 937 BrowserThread::FILE, FROM_HERE,
931 base::Bind(&DownloadFileManager::CancelDownload, 938 base::Bind(&DownloadFileManager::CancelDownload,
932 file_manager, download_id_)); 939 delegate_->GetDownloadFileManager(), download_id_));
933 } 940 }
934 941
935 void DownloadItemImpl::Init(bool active, 942 void DownloadItemImpl::Init(bool active,
936 download_net_logs::DownloadType download_type) { 943 download_net_logs::DownloadType download_type) {
937 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 944 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
938 945
939 if (active) 946 if (active)
940 download_stats::RecordDownloadCount(download_stats::START_COUNT); 947 download_stats::RecordDownloadCount(download_stats::START_COUNT);
941 948
942 if (target_path_.empty()) 949 if (target_path_.empty())
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 std::map<const void*, ExternalData*>::iterator it = 1191 std::map<const void*, ExternalData*>::iterator it =
1185 external_data_map_.find(key); 1192 external_data_map_.find(key);
1186 1193
1187 if (it == external_data_map_.end()) { 1194 if (it == external_data_map_.end()) {
1188 external_data_map_[key] = data; 1195 external_data_map_[key] = data;
1189 } else if (it->second != data) { 1196 } else if (it->second != data) {
1190 delete it->second; 1197 delete it->second;
1191 it->second = data; 1198 it->second = data;
1192 } 1199 }
1193 } 1200 }
OLDNEW
« no previous file with comments | « content/browser/download/download_item_impl.h ('k') | content/browser/download/download_item_impl_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698