| Index: chrome/browser/download/download_item.cc
|
| diff --git a/chrome/browser/download/download_item.cc b/chrome/browser/download/download_item.cc
|
| index 787b8ad0a7165468337af6138e6c3de77339601d..4275e08548ab2adff611997813de962476eab1e8 100644
|
| --- a/chrome/browser/download/download_item.cc
|
| +++ b/chrome/browser/download/download_item.cc
|
| @@ -48,6 +48,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| original_mime_type_(info.original_mime_type),
|
| total_bytes_(info.total_bytes),
|
| received_bytes_(info.received_bytes),
|
| + last_os_error_(0),
|
| start_tick_(base::TimeTicks()),
|
| state_(static_cast<DownloadState>(info.state)),
|
| start_time_(info.start_time),
|
| @@ -85,6 +86,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| original_mime_type_(info.original_mime_type),
|
| total_bytes_(info.total_bytes),
|
| received_bytes_(0),
|
| + last_os_error_(0),
|
| start_tick_(base::TimeTicks::Now()),
|
| state_(IN_PROGRESS),
|
| start_time_(info.start_time),
|
| @@ -101,7 +103,8 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| is_otr_(is_otr),
|
| is_extension_install_(info.is_extension_install),
|
| name_finalized_(false),
|
| - is_temporary_(!info.save_info.file_path.empty()),
|
| + is_temporary_(!info.save_info.file_path.empty() &&
|
| + !info.is_partial_download),
|
| need_final_rename_(false),
|
| opened_(false) {
|
| Init(true /* start progress timer */);
|
| @@ -121,6 +124,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager,
|
| original_mime_type_(std::string()),
|
| total_bytes_(0),
|
| received_bytes_(0),
|
| + last_os_error_(0),
|
| start_tick_(base::TimeTicks::Now()),
|
| state_(IN_PROGRESS),
|
| start_time_(base::Time::Now()),
|
| @@ -186,9 +190,9 @@ void DownloadItem::OpenFilesBasedOnExtension(bool open) {
|
| }
|
|
|
| void DownloadItem::OpenDownload() {
|
| - if (state() == DownloadItem::IN_PROGRESS) {
|
| + if (state() == IN_PROGRESS) {
|
| open_when_complete_ = !open_when_complete_;
|
| - } else if (state() == DownloadItem::COMPLETE) {
|
| + } else if (state() == COMPLETE) {
|
| opened_ = true;
|
| FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this));
|
| if (is_extension_install()) {
|
| @@ -250,14 +254,18 @@ void DownloadItem::Update(int64 bytes_so_far) {
|
| NOTREACHED();
|
| return;
|
| }
|
| + // May get called once in the INTERRUPTED state.
|
| + if (state_ == INTERRUPTED)
|
| + return;
|
| UpdateSize(bytes_so_far);
|
| UpdateObservers();
|
| }
|
|
|
| // Triggered by a user action.
|
| void DownloadItem::Cancel(bool update_history) {
|
| - if (state_ != IN_PROGRESS) {
|
| - // Small downloads might be complete before this method has a chance to run.
|
| + if (!IsPartialDownload()) {
|
| + // Small downloads might be complete or interrupted before this method has
|
| + // a chance to run.
|
| return;
|
| }
|
| state_ = CANCELLED;
|
| @@ -303,6 +311,23 @@ void DownloadItem::Finished() {
|
| NotifyObserversDownloadFileCompleted();
|
| }
|
|
|
| +void DownloadItem::Interrupted(int64 size, int os_error) {
|
| + if (state_ != IN_PROGRESS)
|
| + return;
|
| + state_ = INTERRUPTED;
|
| + last_os_error_ = os_error;
|
| + UpdateSize(size);
|
| + StopProgressTimer();
|
| +}
|
| +
|
| +void DownloadItem::Resumed(int new_request_id) {
|
| + if (state_ != INTERRUPTED)
|
| + return;
|
| + state_ = IN_PROGRESS;
|
| + request_id_ = new_request_id;
|
| + StartProgressTimer();
|
| +}
|
| +
|
| void DownloadItem::Remove(bool delete_on_disk) {
|
| Cancel(true);
|
| state_ = REMOVING;
|
| @@ -348,9 +373,13 @@ void DownloadItem::Rename(const FilePath& full_path) {
|
| }
|
|
|
| void DownloadItem::TogglePause() {
|
| - DCHECK(state_ == IN_PROGRESS);
|
| - download_manager_->PauseDownload(id_, !is_paused_);
|
| - is_paused_ = !is_paused_;
|
| + DCHECK(IsPartialDownload());
|
| + if (state_ == IN_PROGRESS) {
|
| + download_manager_->PauseDownload(id_, !is_paused_);
|
| + is_paused_ = !is_paused_;
|
| + } else {
|
| + download_manager_->RestartDownload(id_);
|
| + }
|
| UpdateObservers();
|
| }
|
|
|
| @@ -393,6 +422,14 @@ bool DownloadItem::MatchesQuery(const string16& query) const {
|
| return false;
|
| }
|
|
|
| +bool DownloadItem::IsPartialDownload() const {
|
| + return (state_ == IN_PROGRESS) || (state_ == INTERRUPTED);
|
| +}
|
| +
|
| +bool DownloadItem::IsInterruptedDownload() const {
|
| + return (state_ == INTERRUPTED);
|
| +}
|
| +
|
| FilePath DownloadItem::GetFileName() const {
|
| if (safety_state_ == DownloadItem::SAFE)
|
| return file_name_;
|
|
|