Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(445)

Unified Diff: content/browser/download/download_manager_impl.cc

Issue 722953002: downloads: add the ability to undo download removal. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: dcheck Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 30296cb82e7bffbcf3716adf1e166e31be1069a9..236adb973146a163f6811d50abcc2dab13d2471e 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -245,6 +245,7 @@ DownloadManagerImpl::DownloadManagerImpl(
DownloadManagerImpl::~DownloadManagerImpl() {
DCHECK(!shutdown_needed_);
+ DCHECK(removed_downloads_.empty());
Dan Beam 2014/11/19 23:16:26 I could change this to: STLDeleteValues(&remove
}
DownloadItemImpl* DownloadManagerImpl::CreateActiveItem(
@@ -345,7 +346,6 @@ void DownloadManagerImpl::Shutdown() {
download->Cancel(false);
}
STLDeleteValues(&downloads_);
- downloads_.clear();
Dan Beam 2014/11/19 23:16:26 STLDeleteValues() does this already
// We'll have nothing more to report to the observers after this point.
observers_.Clear();
@@ -563,7 +563,8 @@ void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) {
uint32 download_id = download->GetId();
if (downloads_.erase(download_id) == 0)
return;
- delete download;
+
+ removed_downloads_[download_id] = download;
}
int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin,
@@ -598,6 +599,29 @@ int DownloadManagerImpl::RemoveAllDownloads() {
return num_deleted;
}
+void DownloadManagerImpl::ReviveDownload(uint32 id) {
+ auto it = removed_downloads_.find(id);
+ if (it == removed_downloads_.end())
+ return;
+
+ DownloadItemImpl* item = removed_downloads_[id];
+ removed_downloads_.erase(it);
+
+ downloads_[id] = item;
+
+ FOR_EACH_OBSERVER(Observer, observers_, OnDownloadRevived(this, item));
+ FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, item));
benjhayden 2014/11/21 00:50:01 Is every listener really ok with having a single i
Dan Beam 2014/11/21 05:32:21 According to my interpretation of the documentatio
+}
+
+void DownloadManagerImpl::FinalizeRemoval(uint32 id) {
+ auto it = removed_downloads_.find(id);
+ if (it == removed_downloads_.end())
+ return;
+
+ delete it->second;
+ removed_downloads_.erase(it);
+}
+
void DownloadManagerImpl::DownloadUrl(
scoped_ptr<DownloadUrlParameters> params) {
if (params->post_id() >= 0) {

Powered by Google App Engine
This is Rietveld 408576698