| Index: chrome/browser/download/download_item.cc
|
| diff --git a/chrome/browser/download/download_item.cc b/chrome/browser/download/download_item.cc
|
| index f4a6cb19e790093f3f1d4a02b51bb1cd9d0b08ec..f67b1a19b7f484f27ccca2d9565e451e34bd4ba3 100644
|
| --- a/chrome/browser/download/download_item.cc
|
| +++ b/chrome/browser/download/download_item.cc
|
| @@ -9,6 +9,7 @@
|
| #include "chrome/browser/download/download_manager.h"
|
| #include "chrome/browser/download/download_util.h"
|
| #include "chrome/browser/history/download_types.h"
|
| +#include "chrome/common/extensions/extension.h"
|
|
|
| namespace {
|
|
|
| @@ -18,7 +19,8 @@ const int kUpdateTimeMs = 1000;
|
| } // namespace
|
|
|
| // Constructor for reading from the history service.
|
| -DownloadItem::DownloadItem(const DownloadCreateInfo& info)
|
| +DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| + const DownloadCreateInfo& info)
|
| : id_(-1),
|
| full_path_(info.path),
|
| url_(info.url),
|
| @@ -31,7 +33,7 @@ DownloadItem::DownloadItem(const DownloadCreateInfo& info)
|
| state_(static_cast<DownloadState>(info.state)),
|
| start_time_(info.start_time),
|
| db_handle_(info.db_handle),
|
| - manager_(NULL),
|
| + download_manager_(download_manager),
|
| is_paused_(false),
|
| open_when_complete_(false),
|
| safety_state_(SAFE),
|
| @@ -50,60 +52,75 @@ DownloadItem::DownloadItem(const DownloadCreateInfo& info)
|
| Init(false /* don't start progress timer */);
|
| }
|
|
|
| -// Constructor for DownloadItem created via user action in the main thread.
|
| -DownloadItem::DownloadItem(int32 download_id,
|
| +// Constructing for a regular download:
|
| +DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| + const DownloadCreateInfo& info,
|
| + bool is_otr)
|
| + : id_(info.download_id),
|
| + full_path_(info.path),
|
| + path_uniquifier_(info.path_uniquifier),
|
| + url_(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_(0),
|
| + start_tick_(base::TimeTicks::Now()),
|
| + state_(IN_PROGRESS),
|
| + start_time_(info.start_time),
|
| + db_handle_(DownloadManager::kUninitializedHandle),
|
| + download_manager_(download_manager),
|
| + is_paused_(false),
|
| + open_when_complete_(false),
|
| + safety_state_(info.is_dangerous ? DANGEROUS : SAFE),
|
| + auto_opened_(false),
|
| + original_name_(info.original_name),
|
| + render_process_id_(info.child_id),
|
| + request_id_(info.request_id),
|
| + save_as_(info.prompt_user_for_save_location),
|
| + is_otr_(is_otr),
|
| + is_extension_install_(info.is_extension_install),
|
| + name_finalized_(false),
|
| + is_temporary_(!info.save_info.file_path.empty()),
|
| + need_final_rename_(false) {
|
| + Init(true /* start progress timer */);
|
| +}
|
| +
|
| +// Constructing for the "Save Page As..." feature:
|
| +DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| const FilePath& path,
|
| - int path_uniquifier,
|
| const GURL& url,
|
| - const GURL& referrer_url,
|
| - const std::string& mime_type,
|
| - const std::string& original_mime_type,
|
| - const FilePath& original_name,
|
| - const base::Time start_time,
|
| - int64 download_size,
|
| - int render_process_id,
|
| - int request_id,
|
| - bool is_dangerous,
|
| - bool save_as,
|
| - bool is_otr,
|
| - bool is_extension_install,
|
| - bool is_temporary)
|
| - : id_(download_id),
|
| + bool is_otr)
|
| + : id_(1),
|
| full_path_(path),
|
| - path_uniquifier_(path_uniquifier),
|
| + path_uniquifier_(0),
|
| url_(url),
|
| - referrer_url_(referrer_url),
|
| - mime_type_(mime_type),
|
| - original_mime_type_(original_mime_type),
|
| - total_bytes_(download_size),
|
| + referrer_url_(GURL()),
|
| + mime_type_(std::string()),
|
| + original_mime_type_(std::string()),
|
| + total_bytes_(0),
|
| received_bytes_(0),
|
| start_tick_(base::TimeTicks::Now()),
|
| state_(IN_PROGRESS),
|
| - start_time_(start_time),
|
| + start_time_(base::Time::Now()),
|
| db_handle_(DownloadManager::kUninitializedHandle),
|
| - manager_(NULL),
|
| + download_manager_(download_manager),
|
| is_paused_(false),
|
| open_when_complete_(false),
|
| - safety_state_(is_dangerous ? DANGEROUS : SAFE),
|
| + safety_state_(SAFE),
|
| auto_opened_(false),
|
| - original_name_(original_name),
|
| - render_process_id_(render_process_id),
|
| - request_id_(request_id),
|
| - save_as_(save_as),
|
| + original_name_(FilePath()),
|
| + render_process_id_(-1),
|
| + request_id_(-1),
|
| + save_as_(false),
|
| is_otr_(is_otr),
|
| - is_extension_install_(is_extension_install),
|
| + is_extension_install_(false),
|
| name_finalized_(false),
|
| - is_temporary_(is_temporary),
|
| + is_temporary_(false),
|
| need_final_rename_(false) {
|
| Init(true /* start progress timer */);
|
| }
|
|
|
| -void DownloadItem::Init(bool start_timer) {
|
| - file_name_ = full_path_.BaseName();
|
| - if (start_timer)
|
| - StartProgressTimer();
|
| -}
|
| -
|
| DownloadItem::~DownloadItem() {
|
| state_ = REMOVING;
|
| UpdateObservers();
|
| @@ -125,14 +142,45 @@ void DownloadItem::NotifyObserversDownloadFileCompleted() {
|
| FOR_EACH_OBSERVER(Observer, observers_, OnDownloadFileCompleted(this));
|
| }
|
|
|
| -void DownloadItem::NotifyObserversDownloadOpened() {
|
| - FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this));
|
| +bool DownloadItem::CanOpenDownload() {
|
| + FilePath file_to_use = full_path();
|
| + if (!original_name().value().empty())
|
| + file_to_use = original_name();
|
| +
|
| + return !Extension::IsExtension(file_to_use) &&
|
| + !download_manager_->IsExecutableFile(file_to_use);
|
| +}
|
| +
|
| +bool DownloadItem::ShouldOpenFileBasedOnExtension() {
|
| + return download_manager_->ShouldOpenFileBasedOnExtension(full_path());
|
| +}
|
| +
|
| +void DownloadItem::OpenFilesBasedOnExtension(bool open) {
|
| + return download_manager_->OpenFilesBasedOnExtension(full_path(), open);
|
| +}
|
| +
|
| +void DownloadItem::OpenDownload() {
|
| + if (state() == DownloadItem::IN_PROGRESS) {
|
| + open_when_complete_ = !open_when_complete_;
|
| + } else if (state() == DownloadItem::COMPLETE) {
|
| + FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this));
|
| + download_manager_->OpenDownload(this, NULL);
|
| + }
|
| +}
|
| +
|
| +void DownloadItem::ShowDownloadInShell() {
|
| + download_manager_->ShowDownloadInShell(this);
|
| +}
|
| +
|
| +void DownloadItem::DangerousDownloadValidated() {
|
| + download_manager_->DangerousDownloadValidated(this);
|
| }
|
|
|
| -// If we've received more data than we were expecting (bad server info?), revert
|
| -// to 'unknown size mode'.
|
| void DownloadItem::UpdateSize(int64 bytes_so_far) {
|
| received_bytes_ = bytes_so_far;
|
| +
|
| + // If we've received more data than we were expecting (bad server info?),
|
| + // revert to 'unknown size mode'.
|
| if (received_bytes_ > total_bytes_)
|
| total_bytes_ = 0;
|
| }
|
| @@ -168,7 +216,7 @@ void DownloadItem::Cancel(bool update_history) {
|
| UpdateObservers();
|
| StopProgressTimer();
|
| if (update_history)
|
| - manager_->DownloadCancelled(id_);
|
| + download_manager_->DownloadCancelled(id_);
|
| }
|
|
|
| void DownloadItem::Finished(int64 size) {
|
| @@ -181,8 +229,8 @@ void DownloadItem::Remove(bool delete_on_disk) {
|
| Cancel(true);
|
| state_ = REMOVING;
|
| if (delete_on_disk)
|
| - manager_->DeleteDownload(full_path_);
|
| - manager_->RemoveDownload(db_handle_);
|
| + download_manager_->DeleteDownload(full_path_);
|
| + download_manager_->RemoveDownload(db_handle_);
|
| // We have now been deleted.
|
| }
|
|
|
| @@ -220,7 +268,7 @@ void DownloadItem::Rename(const FilePath& full_path) {
|
|
|
| void DownloadItem::TogglePause() {
|
| DCHECK(state_ == IN_PROGRESS);
|
| - manager_->PauseDownload(id_, !is_paused_);
|
| + download_manager_->PauseDownload(id_, !is_paused_);
|
| is_paused_ = !is_paused_;
|
| UpdateObservers();
|
| }
|
| @@ -246,3 +294,9 @@ FilePath DownloadItem::GetFileName() const {
|
| }
|
| return original_name_;
|
| }
|
| +
|
| +void DownloadItem::Init(bool start_timer) {
|
| + file_name_ = full_path_.BaseName();
|
| + if (start_timer)
|
| + StartProgressTimer();
|
| +}
|
|
|