Index: chrome/browser/download/download_item.cc |
diff --git a/chrome/browser/download/download_item.cc b/chrome/browser/download/download_item.cc |
index 59126a86d43769586c96fbf06678a0fd2ce9b69c..17d4fccf261fd33314f1191ab350aa95e6ec2a6e 100644 |
--- a/chrome/browser/download/download_item.cc |
+++ b/chrome/browser/download/download_item.cc |
@@ -14,13 +14,15 @@ |
#include "base/timer.h" |
#include "base/utf_string_conversions.h" |
#include "net/base/net_util.h" |
+#include "chrome/browser/download/download_create_info.h" |
#include "chrome/browser/download/download_extensions.h" |
#include "chrome/browser/download/download_file_manager.h" |
#include "chrome/browser/download/download_history.h" |
#include "chrome/browser/download/download_manager.h" |
#include "chrome/browser/download/download_prefs.h" |
+#include "chrome/browser/download/download_state_info.h" |
#include "chrome/browser/download/download_util.h" |
-#include "chrome/browser/history/download_create_info.h" |
+#include "chrome/browser/history/download_history_info.h" |
#include "chrome/browser/platform_util.h" |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -114,14 +116,11 @@ DownloadItem::DangerType GetDangerType(bool dangerous_file, |
// Constructor for reading from the history service. |
DownloadItem::DownloadItem(DownloadManager* download_manager, |
- const DownloadCreateInfo& info) |
- : id_(-1), |
+ const DownloadHistoryInfo& info) |
+ : download_id_(-1), |
full_path_(info.path), |
- path_uniquifier_(0), |
- url_chain_(info.url_chain), |
+ url_chain_(1, info.url), |
referrer_url_(info.referrer_url), |
- mime_type_(info.mime_type), |
- original_mime_type_(info.original_mime_type), |
total_bytes_(info.total_bytes), |
received_bytes_(info.received_bytes), |
start_tick_(base::TimeTicks()), |
@@ -132,12 +131,8 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
is_paused_(false), |
open_when_complete_(false), |
safety_state_(SAFE), |
- danger_type_(NOT_DANGEROUS), |
auto_opened_(false), |
- target_name_(info.original_name), |
- save_as_(false), |
is_otr_(false), |
- is_extension_install_(info.is_extension_install), |
is_temporary_(false), |
all_data_saved_(false), |
opened_(false) { |
@@ -152,13 +147,19 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
DownloadItem::DownloadItem(DownloadManager* download_manager, |
const DownloadCreateInfo& info, |
bool is_otr) |
- : id_(info.download_id), |
+ : state_info_(info.original_name, info.save_info.file_path, |
+ info.has_user_gesture, info.prompt_user_for_save_location, |
+ info.path_uniquifier, info.is_dangerous_file, |
+ info.is_dangerous_url, info.is_extension_install), |
+ process_handle_(info.process_handle), |
+ download_id_(info.download_id), |
full_path_(info.path), |
- path_uniquifier_(info.path_uniquifier), |
url_chain_(info.url_chain), |
referrer_url_(info.referrer_url), |
+ content_disposition_(info.content_disposition), |
mime_type_(info.mime_type), |
original_mime_type_(info.original_mime_type), |
+ referrer_charset_(info.referrer_charset), |
total_bytes_(info.total_bytes), |
received_bytes_(0), |
last_os_error_(0), |
@@ -171,14 +172,8 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
open_when_complete_(false), |
safety_state_(GetSafetyState(info.is_dangerous_file, |
info.is_dangerous_url)), |
- danger_type_(GetDangerType(info.is_dangerous_file, |
- info.is_dangerous_url)), |
auto_opened_(false), |
- target_name_(info.original_name), |
- process_handle_(info.process_handle), |
- save_as_(info.prompt_user_for_save_location), |
is_otr_(is_otr), |
- is_extension_install_(info.is_extension_install), |
is_temporary_(!info.save_info.file_path.empty()), |
all_data_saved_(false), |
opened_(false) { |
@@ -190,13 +185,10 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
const FilePath& path, |
const GURL& url, |
bool is_otr) |
- : id_(1), |
+ : download_id_(1), |
full_path_(path), |
- path_uniquifier_(0), |
url_chain_(1, url), |
referrer_url_(GURL()), |
- mime_type_(std::string()), |
- original_mime_type_(std::string()), |
total_bytes_(0), |
received_bytes_(0), |
last_os_error_(0), |
@@ -208,11 +200,8 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
is_paused_(false), |
open_when_complete_(false), |
safety_state_(SAFE), |
- danger_type_(NOT_DANGEROUS), |
auto_opened_(false), |
- save_as_(false), |
is_otr_(is_otr), |
- is_extension_install_(false), |
is_temporary_(false), |
all_data_saved_(false), |
opened_(false) { |
@@ -237,7 +226,7 @@ void DownloadItem::UpdateObservers() { |
} |
bool DownloadItem::CanOpenDownload() { |
- return !Extension::IsExtension(target_name_); |
+ return !Extension::IsExtension(state_info_.target_name); |
} |
bool DownloadItem::ShouldOpenFileBasedOnExtension() { |
@@ -290,7 +279,7 @@ void DownloadItem::ShowDownloadInShell() { |
void DownloadItem::DangerousDownloadValidated() { |
UMA_HISTOGRAM_ENUMERATION("Download.DangerousDownloadValidated", |
- danger_type_, |
+ GetDangerType(), |
DANGEROUS_TYPE_MAX); |
download_manager_->DangerousDownloadValidated(this); |
} |
@@ -340,7 +329,7 @@ void DownloadItem::Cancel(bool update_history) { |
UpdateObservers(); |
StopProgressTimer(); |
if (update_history) |
- download_manager_->DownloadCancelled(id_); |
+ download_manager_->DownloadCancelled(download_id_); |
} |
void DownloadItem::MarkAsComplete() { |
@@ -398,11 +387,11 @@ void DownloadItem::Interrupted(int64 size, int os_error) { |
void DownloadItem::Delete(DeleteReason reason) { |
switch (reason) { |
case DELETE_DUE_TO_USER_DISCARD: |
- UMA_HISTOGRAM_ENUMERATION("Download.UserDiscard", danger_type_, |
+ UMA_HISTOGRAM_ENUMERATION("Download.UserDiscard", GetDangerType(), |
DANGEROUS_TYPE_MAX); |
break; |
case DELETE_DUE_TO_BROWSER_SHUTDOWN: |
- UMA_HISTOGRAM_ENUMERATION("Download.Discard", danger_type_, |
+ UMA_HISTOGRAM_ENUMERATION("Download.Discard", GetDangerType(), |
DANGEROUS_TYPE_MAX); |
break; |
default: |
@@ -430,8 +419,8 @@ bool DownloadItem::TimeRemaining(base::TimeDelta* remaining) const { |
if (speed == 0) |
return false; |
- *remaining = |
- base::TimeDelta::FromSeconds((total_bytes_ - received_bytes_) / speed); |
+ *remaining = base::TimeDelta::FromSeconds( |
+ (total_bytes_ - received_bytes_) / speed); |
return true; |
} |
@@ -445,7 +434,9 @@ int64 DownloadItem::CurrentSpeed() const { |
int DownloadItem::PercentComplete() const { |
return (total_bytes_ > 0) ? |
- static_cast<int>(received_bytes_ * 100.0 / total_bytes_) : -1; |
+ static_cast<int>(received_bytes_ * 100.0 / |
+ total_bytes_) : |
+ -1; |
} |
void DownloadItem::Rename(const FilePath& full_path) { |
@@ -458,7 +449,7 @@ void DownloadItem::Rename(const FilePath& full_path) { |
void DownloadItem::TogglePause() { |
DCHECK(IsInProgress()); |
- download_manager_->PauseDownload(id_, !is_paused_); |
+ download_manager_->PauseDownload(download_id_, !is_paused_); |
is_paused_ = !is_paused_; |
UpdateObservers(); |
} |
@@ -487,7 +478,7 @@ void DownloadItem::OnDownloadCompleting(DownloadFileManager* file_manager) { |
void DownloadItem::OnDownloadRenamedToFinalName(const FilePath& full_path) { |
VLOG(20) << __FUNCTION__ << "()" |
- << " full_path = " << full_path.value() |
+ << " full_path = \"" << full_path.value() << "\"" |
<< " needed rename = " << NeedsRename() |
<< " " << DebugString(false); |
DCHECK(NeedsRename()); |
@@ -503,7 +494,7 @@ bool DownloadItem::MatchesQuery(const string16& query) const { |
DCHECK_EQ(query, base::i18n::ToLower(query)); |
- string16 url_raw(base::i18n::ToLower(UTF8ToUTF16(url().spec()))); |
+ string16 url_raw(base::i18n::ToLower(UTF8ToUTF16(GetURL().spec()))); |
if (url_raw.find(query) != string16::npos) |
return true; |
@@ -514,7 +505,8 @@ bool DownloadItem::MatchesQuery(const string16& query) const { |
// "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD" |
PrefService* prefs = download_manager_->profile()->GetPrefs(); |
std::string languages(prefs->GetString(prefs::kAcceptLanguages)); |
- string16 url_formatted(base::i18n::ToLower(net::FormatUrl(url(), languages))); |
+ string16 url_formatted( |
+ base::i18n::ToLower(net::FormatUrl(GetURL(), languages))); |
if (url_formatted.find(query) != string16::npos) |
return true; |
@@ -526,50 +518,55 @@ bool DownloadItem::MatchesQuery(const string16& query) const { |
return (path.find(query) != string16::npos); |
} |
-void DownloadItem::SetFileCheckResults(const FilePath& path, |
- bool is_dangerous_file, |
- bool is_dangerous_url, |
- int path_uniquifier, |
- bool prompt, |
- bool is_extension_install, |
- const FilePath& original_name) { |
- VLOG(20) << " " << __FUNCTION__ << "()" |
- << " path = \"" << path.value() << "\"" |
- << " is_dangerous_file = " << is_dangerous_file |
- << " is_dangerous_url = " << is_dangerous_url |
- << " path_uniquifier = " << path_uniquifier |
- << " prompt = " << prompt |
- << " is_extension_install = " << is_extension_install |
- << " path = \"" << path.value() << "\"" |
- << " original_name = \"" << original_name.value() << "\"" |
- << " " << DebugString(true); |
- // Make sure the initial file name is set only once. |
- DCHECK(full_path_.empty()); |
- DCHECK(!path.empty()); |
+void DownloadItem::SetFileCheckResults(const DownloadStateInfo& state) { |
+ VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true); |
+ state_info_ = state; |
+ VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true); |
+ |
+ safety_state_ = GetSafetyState(state_info_.is_dangerous_file, |
+ state_info_.is_dangerous_url); |
+} |
+ |
+void DownloadItem::UpdateTarget() { |
+ if (state_info_.target_name.value().empty()) |
+ state_info_.target_name = full_path_.BaseName(); |
+} |
+ |
+DownloadItem::DangerType DownloadItem::GetDangerType() const { |
+ return ::GetDangerType(state_info_.is_dangerous_file, |
+ state_info_.is_dangerous_url); |
+} |
+ |
+bool DownloadItem::IsDangerous() const { |
+ return GetDangerType() != DownloadItem::NOT_DANGEROUS; |
+} |
- full_path_ = path; |
- safety_state_ = GetSafetyState(is_dangerous_file, is_dangerous_url); |
- danger_type_ = GetDangerType(is_dangerous_file, is_dangerous_url); |
- path_uniquifier_ = path_uniquifier; |
- save_as_ = prompt; |
- is_extension_install_ = is_extension_install; |
- target_name_ = original_name; |
+void DownloadItem::MarkUrlDangerous() { |
+ state_info_.is_dangerous_url = true; |
+} |
- if (target_name_.value().empty()) |
- target_name_ = full_path_.BaseName(); |
+DownloadHistoryInfo DownloadItem::GetHistoryInfo() const { |
+ return DownloadHistoryInfo(full_path(), |
+ GetURL(), |
+ referrer_url(), |
+ start_time(), |
+ received_bytes(), |
+ total_bytes(), |
+ state(), |
+ db_handle()); |
} |
FilePath DownloadItem::GetTargetFilePath() const { |
- return full_path_.DirName().Append(target_name_); |
+ return full_path_.DirName().Append(state_info_.target_name); |
} |
FilePath DownloadItem::GetFileNameToReportUser() const { |
- if (path_uniquifier_ > 0) { |
- FilePath name(target_name_); |
- download_util::AppendNumberToPath(&name, path_uniquifier_); |
+ if (state_info_.path_uniquifier > 0) { |
+ FilePath name(state_info_.target_name); |
+ download_util::AppendNumberToPath(&name, state_info_.path_uniquifier); |
return name; |
} |
- return target_name_; |
+ return state_info_.target_name; |
} |
FilePath DownloadItem::GetUserVerifiedFilePath() const { |
@@ -578,8 +575,7 @@ FilePath DownloadItem::GetUserVerifiedFilePath() const { |
} |
void DownloadItem::Init(bool start_timer) { |
- if (target_name_.value().empty()) |
- target_name_ = full_path_.BaseName(); |
+ UpdateTarget(); |
if (start_timer) |
StartProgressTimer(); |
VLOG(20) << __FUNCTION__ << "() " << DebugString(true); |
@@ -596,7 +592,8 @@ bool DownloadItem::IsInProgress() const { |
} |
bool DownloadItem::IsCancelled() const { |
- return (state_ == CANCELLED) || (state_ == INTERRUPTED); |
+ return (state_ == CANCELLED) || |
+ (state_ == INTERRUPTED); |
} |
bool DownloadItem::IsInterrupted() const { |
@@ -607,9 +604,17 @@ bool DownloadItem::IsComplete() const { |
return (state_ == COMPLETE); |
} |
+const GURL& DownloadItem::GetURL() const { |
+ return url_chain_.empty() ? |
+ GURL::EmptyGURL() : url_chain_.back(); |
+} |
+ |
std::string DownloadItem::DebugString(bool verbose) const { |
- std::string description = base::StringPrintf( |
- "{ id_ = %d state = %s", id_, DebugDownloadStateString(state())); |
+ std::string description = |
+ base::StringPrintf("{ id = %d" |
+ " state = %s", |
+ download_id_, |
+ DebugDownloadStateString(state())); |
// Construct a string of the URL chain. |
std::string url_list("<none>"); |
@@ -619,7 +624,7 @@ std::string DownloadItem::DebugString(bool verbose) const { |
url_list = (*iter).spec(); |
++iter; |
for ( ; verbose && (iter != last); ++iter) { |
- url_list += " -> "; |
+ url_list += " ->\n\t"; |
const GURL& next_url = *iter; |
url_list += next_url.spec(); |
} |
@@ -629,12 +634,12 @@ std::string DownloadItem::DebugString(bool verbose) const { |
description += base::StringPrintf( |
" db_handle = %" PRId64 |
" total_bytes = %" PRId64 |
- " is_paused = " "%c" |
- " is_extension_install = " "%c" |
- " is_otr = " "%c" |
- " safety_state = " "%s" |
- " url_chain = " "\"%s\"" |
- " target_name_ = \"%" PRFilePath "\"" |
+ " is_paused = %c" |
+ " is_extension_install = %c" |
+ " is_otr = %c" |
+ " safety_state = %s" |
+ " url_chain = \n\t\"%s\"\n\t" |
+ " target_name = \"%" PRFilePath "\"" |
" full_path = \"%" PRFilePath "\"", |
db_handle(), |
total_bytes(), |
@@ -643,10 +648,13 @@ std::string DownloadItem::DebugString(bool verbose) const { |
is_otr() ? 'T' : 'F', |
DebugSafetyStateString(safety_state()), |
url_list.c_str(), |
- target_name_.value().c_str(), |
+ state_info_.target_name.value().c_str(), |
full_path().value().c_str()); |
} else { |
description += base::StringPrintf(" url = \"%s\"", url_list.c_str()); |
} |
+ |
+ description += " }"; |
+ |
return description; |
} |