Index: content/browser/download/download_manager_impl.cc |
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc |
index 3fcb33ef51edfe4b895112a7ce292e14f8af65c4..cdea5c32b130440cd0019f20a35a4947c80ebdef 100644 |
--- a/content/browser/download/download_manager_impl.cc |
+++ b/content/browser/download/download_manager_impl.cc |
@@ -106,6 +106,7 @@ class DownloadItemFactoryImpl : public DownloadItemFactory { |
DownloadItemImpl* CreatePersistedItem( |
DownloadItemImplDelegate* delegate, |
+ const std::string& guid, |
uint32_t download_id, |
const base::FilePath& current_path, |
const base::FilePath& target_path, |
@@ -124,26 +125,26 @@ class DownloadItemFactoryImpl : public DownloadItemFactory { |
DownloadInterruptReason interrupt_reason, |
bool opened, |
const net::BoundNetLog& bound_net_log) override { |
- return new DownloadItemImpl( |
- delegate, |
- download_id, |
- current_path, |
- target_path, |
- url_chain, |
- referrer_url, |
- mime_type, |
- original_mime_type, |
- start_time, |
- end_time, |
- etag, |
- last_modified, |
- received_bytes, |
- total_bytes, |
- state, |
- danger_type, |
- interrupt_reason, |
- opened, |
- bound_net_log); |
+ return new DownloadItemImpl(delegate, |
+ guid, |
+ download_id, |
+ current_path, |
+ target_path, |
+ url_chain, |
+ referrer_url, |
+ mime_type, |
+ original_mime_type, |
+ start_time, |
+ end_time, |
+ etag, |
+ last_modified, |
+ received_bytes, |
+ total_bytes, |
+ state, |
+ danger_type, |
+ interrupt_reason, |
+ opened, |
+ bound_net_log); |
} |
DownloadItemImpl* CreateActiveItem( |
@@ -197,6 +198,7 @@ DownloadItemImpl* DownloadManagerImpl::CreateActiveItem( |
DownloadItemImpl* download = |
item_factory_->CreateActiveItem(this, id, info, bound_net_log); |
downloads_[id] = download; |
+ downloads_by_guid_[download->GetGuid()] = download; |
return download; |
} |
@@ -285,6 +287,7 @@ void DownloadManagerImpl::Shutdown() { |
download->Cancel(false); |
} |
STLDeleteValues(&downloads_); |
+ downloads_by_guid_.clear(); |
url_downloaders_.clear(); |
// We'll have nothing more to report to the observers after this point. |
@@ -450,6 +453,8 @@ void DownloadManagerImpl::CreateSavePackageDownloadItemWithId( |
this, id, main_file_path, page_url, mime_type, std::move(request_handle), |
bound_net_log); |
downloads_[download_item->GetId()] = download_item; |
+ DCHECK(!ContainsKey(downloads_by_guid_, download_item->GetGuid())); |
+ downloads_by_guid_[download_item->GetGuid()] = download_item; |
FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated( |
this, download_item)); |
if (!item_created.is_null()) |
@@ -495,6 +500,8 @@ void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) { |
if (!download) |
return; |
+ downloads_by_guid_.erase(download->GetGuid()); |
+ |
uint32_t download_id = download->GetId(); |
if (downloads_.erase(download_id) == 0) |
return; |
@@ -596,6 +603,7 @@ void DownloadManagerImpl::RemoveObserver(Observer* observer) { |
} |
DownloadItem* DownloadManagerImpl::CreateDownloadItem( |
+ const std::string& guid, |
uint32_t id, |
const base::FilePath& current_path, |
const base::FilePath& target_path, |
@@ -617,8 +625,10 @@ DownloadItem* DownloadManagerImpl::CreateDownloadItem( |
NOTREACHED(); |
return NULL; |
} |
+ DCHECK(!ContainsKey(downloads_by_guid_, guid)); |
DownloadItemImpl* item = item_factory_->CreatePersistedItem( |
this, |
+ guid, |
id, |
current_path, |
target_path, |
@@ -638,6 +648,7 @@ DownloadItem* DownloadManagerImpl::CreateDownloadItem( |
opened, |
net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD)); |
downloads_[id] = item; |
+ downloads_by_guid_[guid] = item; |
FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, item)); |
DVLOG(20) << __FUNCTION__ << "() download = " << item->DebugString(true); |
return item; |
@@ -668,7 +679,14 @@ int DownloadManagerImpl::NonMaliciousInProgressCount() const { |
} |
DownloadItem* DownloadManagerImpl::GetDownload(uint32_t download_id) { |
- return ContainsKey(downloads_, download_id) ? downloads_[download_id] : NULL; |
+ return ContainsKey(downloads_, download_id) ? downloads_[download_id] |
+ : nullptr; |
+} |
+ |
+DownloadItem* DownloadManagerImpl::GetDownloadByGuid(const std::string& guid) { |
+ DCHECK(guid == base::ToUpperASCII(guid)); |
+ return ContainsKey(downloads_by_guid_, guid) ? downloads_by_guid_[guid] |
+ : nullptr; |
} |
void DownloadManagerImpl::GetAllDownloads(DownloadVector* downloads) { |