Index: chrome/browser/download/download_manager.cc |
=================================================================== |
--- chrome/browser/download/download_manager.cc (revision 92431) |
+++ chrome/browser/download/download_manager.cc (working copy) |
@@ -55,7 +55,8 @@ |
: shutdown_needed_(false), |
profile_(NULL), |
file_manager_(NULL), |
- status_updater_(status_updater->AsWeakPtr()) { |
+ status_updater_(status_updater->AsWeakPtr()), |
+ next_save_page_id_(0) { |
if (status_updater_) |
status_updater_->AddDelegate(this); |
} |
@@ -122,6 +123,7 @@ |
in_progress_.clear(); |
active_downloads_.clear(); |
+ save_page_downloads_.clear(); |
Randy Smith (Not in Mondays)
2011/07/15 17:58:39
If I'm reading the protocol right, save_page_downl
achuithb
2011/07/16 20:15:32
Didn't know that. I've deleted the line. Do you th
Randy Smith (Not in Mondays)
2011/07/17 18:25:47
Yes, if you would.
achuithb
2011/07/20 03:32:21
Done.
|
history_downloads_.clear(); |
#if !defined(NDEBUG) |
save_page_as_downloads_.clear(); |
@@ -985,14 +987,18 @@ |
return RemoveDownloadsBetween(base::Time(), base::Time()); |
} |
-void DownloadManager::SavePageAsDownloadStarted(DownloadItem* download) { |
+void DownloadManager::SavePageDownloadStarted(DownloadItem* download) { |
#if !defined(NDEBUG) |
save_page_as_downloads_.insert(download); |
#endif |
+ DCHECK(!ContainsKey(save_page_downloads_, download->id())); |
downloads_.insert(download); |
- // Add to history and notify observers. |
- AddDownloadItemToHistory(download, DownloadHistory::kUninitializedHandle); |
- NotifyModelChanged(); |
+ save_page_downloads_[download->id()] = download; |
+ |
+ // Add this entry to the history service. |
+ // Additionally, the UI is notified in the callback. |
+ download_history_->AddEntry(download, |
+ NewCallback(this, &DownloadManager::OnSavePageDownloadEntryAdded)); |
} |
// Initiate a download of a specific URL. We send the request to the |
@@ -1197,6 +1203,13 @@ |
DCHECK(!ContainsKey(history_downloads_, download->db_handle())); |
history_downloads_[download->db_handle()] = download; |
+ |
+ // Show in the appropriate browser UI. |
+ // This includes buttons to save or cancel, for a dangerous download. |
+ ShowDownloadInBrowser(download); |
+ |
+ // Inform interested objects about the new download. |
+ NotifyModelChanged(); |
} |
// Once the new DownloadItem's creation info has been committed to the history |
@@ -1215,13 +1228,6 @@ |
AddDownloadItemToHistory(download, db_handle); |
- // Show in the appropriate browser UI. |
- // This includes buttons to save or cancel, for a dangerous download. |
- ShowDownloadInBrowser(download); |
- |
- // Inform interested objects about the new download. |
- NotifyModelChanged(); |
- |
// If the download is still in progress, try to complete it. |
// |
// Otherwise, download has been cancelled or interrupted before we've |
@@ -1367,3 +1373,38 @@ |
void DownloadManager::OtherDownloadManagerObserver::ManagerGoingDown() { |
observed_download_manager_ = NULL; |
} |
+ |
+void DownloadManager::OnSavePageDownloadEntryAdded(int32 download_id, |
+ int64 db_handle) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ DownloadMap::const_iterator it = save_page_downloads_.find(download_id); |
+ DCHECK(it != save_page_downloads_.end()); |
Randy Smith (Not in Mondays)
2011/07/15 17:58:39
I believe this DCHECK is inaccurate--specifically,
achuithb
2011/07/16 20:15:32
The item remains in save_page_downloads_ until bot
Randy Smith (Not in Mondays)
2011/07/17 18:25:47
Whoops, I'm sorry; I hadn't tracked that part of t
achuithb
2011/07/20 03:32:21
Ok, I've done what you suggest. I was following th
|
+ if (it == save_page_downloads_.end()) |
+ return; |
+ |
+ DownloadItem* download = it->second; |
+ DCHECK(download); |
+ if (!download) |
+ return; |
+ |
+ AddDownloadItemToHistory(download, db_handle); |
+ |
+ // The download may have completed before we received the DB handle. |
Randy Smith (Not in Mondays)
2011/07/15 17:58:39
Not requesting a change, just registering a disqui
achuithb
2011/07/16 20:15:32
I've been thinking about this, and no elegant solu
Randy Smith (Not in Mondays)
2011/07/17 18:25:47
Nope--else I would have. I came to the same concl
|
+ if (!download->IsInProgress()) |
+ SavePageDownloadFinished(download); |
+} |
+ |
+void DownloadManager::SavePageDownloadFinished(DownloadItem* download) { |
+ if (download->db_handle() > DownloadHistory::kUninitializedHandle) { |
+ download_history_->UpdateEntry(download); |
+ DCHECK(ContainsKey(save_page_downloads_, download->id())); |
+ save_page_downloads_.erase(download->id()); |
+ } |
+} |
+ |
+int32 DownloadManager::GetNextSavePageId() { |
benjhayden
2011/07/18 15:37:45
Apologies if this was addressed elsewhere, but how
achuithb
2011/07/18 18:33:18
Not addressed elsewhere.
There's a GetNextId in b
benjhayden
2011/07/18 19:25:01
If the multi-thread accessibility is the only issu
achuith
2011/07/18 19:44:38
From reading the CL description, I feel like the i
|
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ return next_save_page_id_++; |
+} |
+ |