| 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 0ab139eafe8d64e6686fa43861d8e35d6dd78315..91cdae382ae2e6915a25185ed9b68fdef1f31a07 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 {
|
| @@ -113,54 +112,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),
|
| @@ -203,14 +196,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),
|
| @@ -258,14 +249,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),
|
| @@ -312,6 +301,8 @@ void DownloadItemImpl::DangerousDownloadValidated() {
|
| DCHECK_EQ(IN_PROGRESS, GetState());
|
| DCHECK_EQ(DANGEROUS, GetSafetyState());
|
|
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
| +
|
| if (GetState() != IN_PROGRESS)
|
| return;
|
|
|
| @@ -333,8 +324,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)
|
| @@ -460,10 +451,6 @@ DownloadId DownloadItemImpl::GetGlobalId() const {
|
| return download_id_;
|
| }
|
|
|
| -int64 DownloadItemImpl::GetDbHandle() const {
|
| - return db_handle_;
|
| -}
|
| -
|
| DownloadItem::DownloadState DownloadItemImpl::GetState() const {
|
| return InternalToExternalState(state_);
|
| }
|
| @@ -480,10 +467,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 {
|
| @@ -700,20 +683,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();
|
| }
|
| @@ -731,6 +700,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();
|
| }
|
| @@ -774,7 +745,6 @@ std::string DownloadItemImpl::DebugString(bool verbose) const {
|
|
|
| if (verbose) {
|
| description += base::StringPrintf(
|
| - " db_handle = %" PRId64
|
| " total = %" PRId64
|
| " received = %" PRId64
|
| " reason = %s"
|
| @@ -786,7 +756,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(),
|
| @@ -817,6 +786,7 @@ void DownloadItemImpl::NotifyRemoved() {
|
|
|
| void DownloadItemImpl::OnDownloadedFileRemoved() {
|
| file_externally_removed_ = true;
|
| + VLOG(20) << __FUNCTION__ << " download=" << DebugString(true);
|
| UpdateObservers();
|
| }
|
|
|
| @@ -863,6 +833,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
|
| @@ -900,6 +872,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;
|
| @@ -915,24 +888,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
|
| @@ -966,11 +926,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);
|
| @@ -1003,18 +964,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);
|
| @@ -1069,6 +1026,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);
|
| @@ -1111,14 +1071,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
|
| @@ -1145,9 +1106,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();
|
| }
|
| @@ -1225,7 +1183,6 @@ void DownloadItemImpl::OnDownloadRenamedToFinalName(
|
| DCHECK(!full_path.empty());
|
| target_path_ = full_path;
|
| SetFullPath(full_path);
|
| - delegate_->DownloadRenamedToFinalName(this);
|
|
|
| ReleaseDownloadFile();
|
| }
|
| @@ -1306,6 +1263,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())
|
| @@ -1321,10 +1283,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;
|
| @@ -1369,7 +1335,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_))
|
| @@ -1405,6 +1373,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,
|
|
|