| Index: content/browser/download/download_item_impl.cc
|
| diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc
|
| index f23248c8fade6294e60a5e5306e94e5c4ad92a60..ecddd9458c921bdb15e1acbb776e7e5a26baa447 100644
|
| --- a/content/browser/download/download_item_impl.cc
|
| +++ b/content/browser/download/download_item_impl.cc
|
| @@ -44,7 +44,6 @@
|
| #include "content/browser/web_contents/web_contents_impl.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| -#include "content/public/browser/download_persistent_store_info.h"
|
| #include "net/base/net_util.h"
|
|
|
| namespace content {
|
| @@ -111,54 +110,48 @@ static void DownloadFileCancel(scoped_ptr<DownloadFile> download_file) {
|
|
|
| } // namespace
|
|
|
| -// Our download table ID starts at 1, so we use 0 to represent a download that
|
| -// has started, but has not yet had its data persisted in the table. We use fake
|
| -// database handles in incognito mode starting at -1 and progressively getting
|
| -// more negative.
|
| -// static
|
| -const int DownloadItem::kUninitializedHandle = 0;
|
| -
|
| const char DownloadItem::kEmptyFileHash[] = "";
|
|
|
| -// Our download table ID starts at 1, so we use 0 to represent a download that
|
| -// has started, but has not yet had its data persisted in the table. We use fake
|
| -// database handles in incognito mode starting at -1 and progressively getting
|
| -// more negative.
|
| -
|
| // Constructor for reading from the history service.
|
| DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate,
|
| DownloadId download_id,
|
| - const DownloadPersistentStoreInfo& info,
|
| + const FilePath& path,
|
| + const GURL& url,
|
| + const GURL& referrer_url,
|
| + const base::Time& start_time,
|
| + const base::Time& end_time,
|
| + int64 received_bytes,
|
| + int64 total_bytes,
|
| + DownloadItem::DownloadState state,
|
| + bool opened,
|
| const net::BoundNetLog& bound_net_log)
|
| : is_save_package_download_(false),
|
| download_id_(download_id),
|
| - current_path_(info.path),
|
| - target_path_(info.path),
|
| + current_path_(path),
|
| + target_path_(path),
|
| target_disposition_(TARGET_DISPOSITION_OVERWRITE),
|
| - url_chain_(1, info.url),
|
| - referrer_url_(info.referrer_url),
|
| + url_chain_(1, url),
|
| + referrer_url_(referrer_url),
|
| transition_type_(PAGE_TRANSITION_LINK),
|
| has_user_gesture_(false),
|
| - total_bytes_(info.total_bytes),
|
| - received_bytes_(info.received_bytes),
|
| + total_bytes_(total_bytes),
|
| + received_bytes_(received_bytes),
|
| bytes_per_sec_(0),
|
| last_reason_(DOWNLOAD_INTERRUPT_REASON_NONE),
|
| start_tick_(base::TimeTicks()),
|
| - state_(ExternalToInternalState(info.state)),
|
| + state_(ExternalToInternalState(state)),
|
| danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
|
| - start_time_(info.start_time),
|
| - end_time_(info.end_time),
|
| - db_handle_(info.db_handle),
|
| + start_time_(start_time),
|
| + end_time_(end_time),
|
| delegate_(delegate),
|
| is_paused_(false),
|
| open_when_complete_(false),
|
| file_externally_removed_(false),
|
| safety_state_(SAFE),
|
| auto_opened_(false),
|
| - is_persisted_(true),
|
| is_temporary_(false),
|
| all_data_saved_(false),
|
| - opened_(info.opened),
|
| + opened_(opened),
|
| open_enabled_(true),
|
| delegate_delayed_complete_(false),
|
| bound_net_log_(bound_net_log),
|
| @@ -201,14 +194,12 @@ DownloadItemImpl::DownloadItemImpl(
|
| state_(IN_PROGRESS_INTERNAL),
|
| danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
|
| start_time_(info.start_time),
|
| - db_handle_(DownloadItem::kUninitializedHandle),
|
| delegate_(delegate),
|
| is_paused_(false),
|
| open_when_complete_(false),
|
| file_externally_removed_(false),
|
| safety_state_(SAFE),
|
| auto_opened_(false),
|
| - is_persisted_(false),
|
| is_temporary_(!info.save_info->file_path.empty()),
|
| all_data_saved_(false),
|
| opened_(false),
|
| @@ -256,14 +247,12 @@ DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate,
|
| state_(IN_PROGRESS_INTERNAL),
|
| danger_type_(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS),
|
| start_time_(base::Time::Now()),
|
| - db_handle_(DownloadItem::kUninitializedHandle),
|
| delegate_(delegate),
|
| is_paused_(false),
|
| open_when_complete_(false),
|
| file_externally_removed_(false),
|
| safety_state_(SAFE),
|
| auto_opened_(false),
|
| - is_persisted_(false),
|
| is_temporary_(false),
|
| all_data_saved_(false),
|
| opened_(false),
|
| @@ -310,6 +299,8 @@ void DownloadItemImpl::DangerousDownloadValidated() {
|
| DCHECK_EQ(IN_PROGRESS, GetState());
|
| DCHECK_EQ(DANGEROUS, GetSafetyState());
|
|
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
| +
|
| if (GetState() != IN_PROGRESS)
|
| return;
|
|
|
| @@ -331,8 +322,8 @@ void DownloadItemImpl::DangerousDownloadValidated() {
|
|
|
| void DownloadItemImpl::TogglePause() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| DCHECK(state_ == IN_PROGRESS_INTERNAL || state_ == COMPLETING_INTERNAL);
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
|
|
| // Ignore pauses when we've passed the commit point.
|
| if (state_ == COMPLETING_INTERNAL)
|
| @@ -458,10 +449,6 @@ DownloadId DownloadItemImpl::GetGlobalId() const {
|
| return download_id_;
|
| }
|
|
|
| -int64 DownloadItemImpl::GetDbHandle() const {
|
| - return db_handle_;
|
| -}
|
| -
|
| DownloadItem::DownloadState DownloadItemImpl::GetState() const {
|
| return InternalToExternalState(state_);
|
| }
|
| @@ -478,10 +465,6 @@ bool DownloadItemImpl::IsTemporary() const {
|
| return is_temporary_;
|
| }
|
|
|
| -bool DownloadItemImpl::IsPersisted() const {
|
| - return is_persisted_;
|
| -}
|
| -
|
| // TODO(ahendrickson) -- Move |INTERRUPTED| from |IsCancelled()| to
|
| // |IsPartialDownload()|, when resuming interrupted downloads is implemented.
|
| bool DownloadItemImpl::IsPartialDownload() const {
|
| @@ -698,20 +681,6 @@ bool DownloadItemImpl::GetOpened() const {
|
| return opened_;
|
| }
|
|
|
| -DownloadPersistentStoreInfo DownloadItemImpl::GetPersistentStoreInfo() const {
|
| - // TODO(asanka): Persist GetTargetFilePath() as well.
|
| - return DownloadPersistentStoreInfo(GetFullPath(),
|
| - GetURL(),
|
| - GetReferrerUrl(),
|
| - GetStartTime(),
|
| - GetEndTime(),
|
| - GetReceivedBytes(),
|
| - GetTotalBytes(),
|
| - GetState(),
|
| - GetDbHandle(),
|
| - GetOpened());
|
| -}
|
| -
|
| BrowserContext* DownloadItemImpl::GetBrowserContext() const {
|
| return delegate_->GetBrowserContext();
|
| }
|
| @@ -729,6 +698,8 @@ WebContents* DownloadItemImpl::GetWebContents() const {
|
| void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(AllDataSaved());
|
| + VLOG(20) << __FUNCTION__ << " danger_type=" << danger_type
|
| + << " download=" << DebugString(true);
|
| SetDangerType(danger_type);
|
| UpdateObservers();
|
| }
|
| @@ -772,7 +743,6 @@ std::string DownloadItemImpl::DebugString(bool verbose) const {
|
|
|
| if (verbose) {
|
| description += base::StringPrintf(
|
| - " db_handle = %" PRId64
|
| " total = %" PRId64
|
| " received = %" PRId64
|
| " reason = %s"
|
| @@ -784,7 +754,6 @@ std::string DownloadItemImpl::DebugString(bool verbose) const {
|
| " full_path = \"%" PRFilePath "\""
|
| " target_path = \"%" PRFilePath "\""
|
| " has download file = %s",
|
| - GetDbHandle(),
|
| GetTotalBytes(),
|
| GetReceivedBytes(),
|
| InterruptReasonDebugString(last_reason_).c_str(),
|
| @@ -815,6 +784,7 @@ void DownloadItemImpl::NotifyRemoved() {
|
|
|
| void DownloadItemImpl::OnDownloadedFileRemoved() {
|
| file_externally_removed_ = true;
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
| UpdateObservers();
|
| }
|
|
|
| @@ -834,6 +804,8 @@ void DownloadItemImpl::UpdateProgress(int64 bytes_so_far,
|
| int64 bytes_per_sec,
|
| const std::string& hash_state) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + VLOG(20) << __FUNCTION__ << " so_far=" << bytes_so_far
|
| + << " per_sec=" << bytes_per_sec << " download=" << DebugString(true);
|
|
|
| if (state_ != IN_PROGRESS_INTERNAL) {
|
| // Ignore if we're no longer in-progress. This can happen if we race a
|
| @@ -871,6 +843,7 @@ void DownloadItemImpl::OnAllDataSaved(const std::string& final_hash) {
|
| DCHECK_EQ(IN_PROGRESS_INTERNAL, state_);
|
| DCHECK(!all_data_saved_);
|
| all_data_saved_ = true;
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
|
|
| // Store final hash and null out intermediate serialized hash state.
|
| hash_ = final_hash;
|
| @@ -886,24 +859,11 @@ void DownloadItemImpl::MarkAsComplete() {
|
| end_time_ = base::Time::Now();
|
| TransitionTo(COMPLETE_INTERNAL);
|
| }
|
| -
|
| -void DownloadItemImpl::SetIsPersisted() {
|
| - is_persisted_ = true;
|
| - UpdateObservers();
|
| -}
|
| -
|
| -void DownloadItemImpl::SetDbHandle(int64 handle) {
|
| - db_handle_ = handle;
|
| -
|
| - bound_net_log_.AddEvent(
|
| - net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY,
|
| - net::NetLog::Int64Callback("db_handle", db_handle_));
|
| -}
|
| -
|
| void DownloadItemImpl::DestinationUpdate(int64 bytes_so_far,
|
| int64 bytes_per_sec,
|
| const std::string& hash_state) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
|
|
| if (!IsInProgress()) {
|
| // Ignore if we're no longer in-progress. This can happen if we race a
|
| @@ -937,11 +897,12 @@ void DownloadItemImpl::DestinationUpdate(int64 bytes_so_far,
|
|
|
| void DownloadItemImpl::DestinationError(DownloadInterruptReason reason) {
|
| // The DestinationError and Interrupt routines are being kept separate
|
| - // to allow for a future merging of the Cancel and Interrupt routines..
|
| + // to allow for a future merging of the Cancel and Interrupt routines.
|
| Interrupt(reason);
|
| }
|
|
|
| void DownloadItemImpl::DestinationCompleted(const std::string& final_hash) {
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
| if (!IsInProgress())
|
| return;
|
| OnAllDataSaved(final_hash);
|
| @@ -974,18 +935,14 @@ void DownloadItemImpl::Init(bool active,
|
| file_name = GetURL().ExtractFileName();
|
| }
|
|
|
| - bound_net_log_.BeginEvent(
|
| - net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE,
|
| - base::Bind(&ItemActivatedNetLogCallback,
|
| - this, download_type, &file_name));
|
| -
|
| - // If this is not an active download, end the ACTIVE event now.
|
| - if (!active) {
|
| + base::Callback<base::Value*(net::NetLog::LogLevel)> active_data = base::Bind(
|
| + &ItemActivatedNetLogCallback, this, download_type, &file_name);
|
| + if (active) {
|
| + bound_net_log_.BeginEvent(
|
| + net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, active_data);
|
| + } else {
|
| bound_net_log_.AddEvent(
|
| - net::NetLog::TYPE_DOWNLOAD_ITEM_IN_HISTORY,
|
| - net::NetLog::Int64Callback("db_handle", db_handle_));
|
| -
|
| - bound_net_log_.EndEvent(net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE);
|
| + net::NetLog::TYPE_DOWNLOAD_ITEM_ACTIVE, active_data);
|
| }
|
|
|
| VLOG(20) << __FUNCTION__ << "() " << DebugString(true);
|
| @@ -1040,6 +997,9 @@ void DownloadItemImpl::OnDownloadTargetDetermined(
|
| return;
|
| }
|
|
|
| + VLOG(20) << __FUNCTION__ << " " << target_path.value() << " " << disposition
|
| + << " " << danger_type << " " << DebugString(true);
|
| +
|
| target_path_ = target_path;
|
| target_disposition_ = disposition;
|
| SetDangerType(danger_type);
|
| @@ -1082,14 +1042,15 @@ void DownloadItemImpl::OnDownloadRenamedToIntermediateName(
|
| DownloadInterruptReason reason,
|
| const FilePath& full_path) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
| if (DOWNLOAD_INTERRUPT_REASON_NONE != reason) {
|
| Interrupt(reason);
|
| } else {
|
| SetFullPath(full_path);
|
| - UpdateObservers();
|
| + delegate_->ShowDownloadInBrowser(this);
|
| }
|
|
|
| - delegate_->DownloadRenamedToIntermediateName(this);
|
| + MaybeCompleteDownload();
|
| }
|
|
|
| // When SavePackage downloads MHTML to GData (see
|
| @@ -1117,9 +1078,6 @@ void DownloadItemImpl::MaybeCompleteDownload() {
|
| DCHECK_EQ(IN_PROGRESS_INTERNAL, state_);
|
| DCHECK_NE(DownloadItem::DANGEROUS, GetSafetyState());
|
| DCHECK(all_data_saved_);
|
| - DCHECK(is_persisted_);
|
| -
|
| - delegate_->UpdatePersistence(this);
|
|
|
| OnDownloadCompleting();
|
| }
|
| @@ -1198,7 +1156,6 @@ void DownloadItemImpl::OnDownloadRenamedToFinalName(
|
| // full_path is now the current and target file path.
|
| DCHECK(!full_path.empty());
|
| SetFullPath(full_path);
|
| - delegate_->DownloadRenamedToFinalName(this);
|
| }
|
|
|
| // Complete the download and release the DownloadFile.
|
| @@ -1297,6 +1254,11 @@ void DownloadItemImpl::CancelDownloadFile() {
|
| }
|
|
|
| bool DownloadItemImpl::IsDownloadReadyForCompletion() {
|
| + VLOG(20) << __FUNCTION__ << " " << AllDataSaved()
|
| + << " " << (GetSafetyState() != DownloadItem::DANGEROUS)
|
| + << " " << (state_ == IN_PROGRESS_INTERNAL)
|
| + << " " << !GetTargetFilePath().empty()
|
| + << " " << (target_path_.DirName() == current_path_.DirName());
|
| // If we don't have all the data, the download is not ready for
|
| // completion.
|
| if (!AllDataSaved())
|
| @@ -1312,10 +1274,14 @@ bool DownloadItemImpl::IsDownloadReadyForCompletion() {
|
| if (state_ != IN_PROGRESS_INTERNAL)
|
| return false;
|
|
|
| - // If the download hasn't been inserted into the history system
|
| - // (which occurs strictly after file name determination, intermediate
|
| - // file rename, and UI display) then it's not ready for completion.
|
| - if (!IsPersisted())
|
| + // If the target filename hasn't been determined, then it's not ready for
|
| + // completion. This is checked in ReadyForDownloadCompletionDone().
|
| + if (GetTargetFilePath().empty())
|
| + return false;
|
| +
|
| + // This is checked in NeedsRename(). Without this conditional,
|
| + // browser_tests:DownloadTest.DownloadMimeType fails the DCHECK.
|
| + if (target_path_.DirName() != current_path_.DirName())
|
| return false;
|
|
|
| return true;
|
| @@ -1355,7 +1321,9 @@ void DownloadItemImpl::TransitionTo(DownloadInternalState new_state) {
|
| break;
|
| }
|
|
|
| - VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true);
|
| + VLOG(20) << " " << __FUNCTION__ << "()" << " this = " << DebugString(true)
|
| + << " " << InternalToExternalState(old_state)
|
| + << " " << InternalToExternalState(state_);
|
|
|
| // Only update observers on user visible state changes.
|
| if (InternalToExternalState(old_state) != InternalToExternalState(state_))
|
| @@ -1391,6 +1359,7 @@ void DownloadItemImpl::SetFullPath(const FilePath& new_path) {
|
| << " " << DebugString(true);
|
| DCHECK(!new_path.empty());
|
| current_path_ = new_path;
|
| + UpdateObservers();
|
|
|
| bound_net_log_.AddEvent(
|
| net::NetLog::TYPE_DOWNLOAD_ITEM_RENAMED,
|
|
|