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

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

Powered by Google App Engine
This is Rietveld 408576698