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

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

Issue 10915180: Make DownloadHistory observe manager, items (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: @r168573 Created 8 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 3da3f5658984eb20b046e95f25f8a746ba68733f..f17da8834a2aae3f28d70b61cfb60e2aec1e03be 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -33,7 +33,6 @@
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/download_interrupt_reasons.h"
#include "content/public/browser/download_manager_delegate.h"
-#include "content/public/browser/download_persistent_store_info.h"
#include "content/public/browser/download_url_parameters.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
@@ -141,9 +140,29 @@ class DownloadItemFactoryImpl : public DownloadItemFactory {
virtual DownloadItemImpl* CreatePersistedItem(
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) OVERRIDE {
- return new DownloadItemImpl(delegate, download_id, info, bound_net_log);
+ return new DownloadItemImpl(
+ delegate,
+ download_id,
+ path,
+ url,
+ referrer_url,
+ start_time,
+ end_time,
+ received_bytes,
+ total_bytes,
+ state,
+ opened,
+ bound_net_log);
}
virtual DownloadItemImpl* CreateActiveItem(
@@ -284,8 +303,6 @@ void DownloadManagerImpl::Shutdown() {
download->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN);
} else if (download->IsPartialDownload()) {
download->Cancel(false);
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(download);
}
}
@@ -361,8 +378,7 @@ void DownloadManagerImpl::CheckForHistoryFilesRemoval() {
for (DownloadMap::iterator it = downloads_.begin();
it != downloads_.end(); ++it) {
DownloadItemImpl* item = it->second;
- if (item->IsPersisted())
- CheckForFileRemoval(item);
+ CheckForFileRemoval(item);
}
}
@@ -427,7 +443,7 @@ DownloadItemImpl* DownloadManagerImpl::CreateSavePackageDownloadItem(
DownloadItem::Observer* observer) {
net::BoundNetLog bound_net_log =
net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
- DownloadItemImpl* download = item_factory_->CreateSavePageItem(
+ DownloadItemImpl* download_item = item_factory_->CreateSavePageItem(
this,
main_file_path,
page_url,
@@ -435,18 +451,16 @@ DownloadItemImpl* DownloadManagerImpl::CreateSavePackageDownloadItem(
mime_type,
bound_net_log);
- download->AddObserver(observer);
-
- DCHECK(!ContainsKey(downloads_, download->GetId()));
- downloads_[download->GetId()] = download;
-
- FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, download));
+ download_item->AddObserver(observer);
+ DCHECK(!ContainsKey(downloads_, download_item->GetId()));
+ downloads_[download_item->GetId()] = download_item;
+ FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(
+ this, download_item));
- // Will notify the observer in the callback.
- if (delegate_)
- delegate_->AddItemToPersistentStore(download);
+ // TODO(asanka): Make the ui an observer.
+ ShowDownloadInBrowser(download_item);
- return download;
+ return download_item;
}
void DownloadManagerImpl::AssertStateConsistent(
@@ -455,12 +469,6 @@ void DownloadManagerImpl::AssertStateConsistent(
int64 state = download->GetState();
base::debug::Alias(&state);
- if (ContainsKey(active_downloads_, download->GetId())) {
- if (download->IsPersisted())
- CHECK_EQ(DownloadItem::IN_PROGRESS, download->GetState());
- if (DownloadItem::IN_PROGRESS != download->GetState())
- CHECK_EQ(DownloadItem::kUninitializedHandle, download->GetDbHandle());
- }
if (DownloadItem::IN_PROGRESS == download->GetState())
CHECK(ContainsKey(active_downloads_, download->GetId()));
}
@@ -468,8 +476,6 @@ void DownloadManagerImpl::AssertStateConsistent(
void DownloadManagerImpl::DownloadCompleted(DownloadItemImpl* download) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(download);
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(download);
active_downloads_.erase(download->GetId());
AssertStateConsistent(download);
}
@@ -481,11 +487,6 @@ void DownloadManagerImpl::CancelDownload(int32 download_id) {
active_downloads_[download_id]->Cancel(true);
}
-void DownloadManagerImpl::UpdatePersistence(DownloadItemImpl* download) {
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(download);
-}
-
void DownloadManagerImpl::DownloadStopped(DownloadItemImpl* download) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -501,14 +502,7 @@ void DownloadManagerImpl::DownloadStopped(DownloadItemImpl* download) {
void DownloadManagerImpl::RemoveFromActiveList(DownloadItemImpl* download) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(download);
-
- // Clean up will happen when the history system create callback runs if we
- // don't have a valid db_handle yet.
- if (download->IsPersisted()) {
- active_downloads_.erase(download->GetId());
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(download);
- }
+ active_downloads_.erase(download->GetId());
}
void DownloadManagerImpl::SetDownloadItemFactoryForTesting(
@@ -548,14 +542,6 @@ void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) {
downloads_.find(download->GetId()) == downloads_.end())
return;
- // TODO(benjhayden,rdsmith): Remove this.
- if (!download->IsPersisted())
- return;
-
- // Make history update.
- if (delegate_)
- delegate_->RemoveItemFromPersistentStore(download);
-
// Remove from our tables and delete.
int downloads_count =
RemoveDownloadItems(DownloadItemImplVector(1, download));
@@ -564,16 +550,12 @@ void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) {
int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin,
base::Time remove_end) {
- if (delegate_)
- delegate_->RemoveItemsFromPersistentStoreBetween(remove_begin, remove_end);
-
DownloadItemImplVector pending_deletes;
for (DownloadMap::const_iterator it = downloads_.begin();
it != downloads_.end();
++it) {
DownloadItemImpl* download = it->second;
- if (download->IsPersisted() &&
- download->GetStartTime() >= remove_begin &&
+ if (download->GetStartTime() >= remove_begin &&
(remove_end.is_null() || download->GetStartTime() < remove_end) &&
(download->IsComplete() || download->IsCancelled())) {
AssertStateConsistent(download);
@@ -614,93 +596,37 @@ void DownloadManagerImpl::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
-// Operations posted to us from the history service ----------------------------
-
-// The history service has retrieved all download entries. 'entries' contains
-// 'DownloadPersistentStoreInfo's in sorted order (by ascending start_time).
-void DownloadManagerImpl::OnPersistentStoreQueryComplete(
- std::vector<DownloadPersistentStoreInfo>* entries) {
- history_size_ = entries->size();
- for (size_t i = 0; i < entries->size(); ++i) {
- int64 db_handle = entries->at(i).db_handle;
- base::debug::Alias(&db_handle);
-
- net::BoundNetLog bound_net_log =
- net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
- DownloadItemImpl* download = item_factory_->CreatePersistedItem(
- this, GetNextId(), entries->at(i), bound_net_log);
- DCHECK(!ContainsKey(downloads_, download->GetId()));
- downloads_[download->GetId()] = download;
- FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, download));
- VLOG(20) << __FUNCTION__ << "()" << i << ">"
- << " download = " << download->DebugString(true);
- }
- CheckForHistoryFilesRemoval();
-}
-
-void DownloadManagerImpl::AddDownloadItemToHistory(DownloadItemImpl* download,
- int64 db_handle) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK_NE(DownloadItem::kUninitializedHandle, db_handle);
- DCHECK(!download->IsPersisted());
- download->SetDbHandle(db_handle);
- download->SetIsPersisted();
-
- RecordHistorySize(history_size_);
- // Not counting |download|.
- ++history_size_;
-
- // Show in the appropriate browser UI.
- // This includes buttons to save or cancel, for a dangerous download.
- ShowDownloadInBrowser(download);
-}
-
-void DownloadManagerImpl::OnItemAddedToPersistentStore(int32 download_id,
- int64 db_handle) {
- // It's valid that we don't find a matching item, i.e. on shutdown.
- if (!ContainsKey(downloads_, download_id))
- return;
-
- DownloadItemImpl* item = downloads_[download_id];
- AddDownloadItemToHistory(item, db_handle);
- if (item->IsSavePackageDownload()) {
- OnSavePageItemAddedToPersistentStore(item);
- } else {
- OnDownloadItemAddedToPersistentStore(item);
- }
-}
-
-// Once the new DownloadItem has been committed to the persistent store,
-// associate it with its db_handle (TODO(benjhayden) merge db_handle with id),
-// show it in the browser (TODO(benjhayden) the ui should observe us instead),
-// and notify observers (TODO(benjhayden) observers should be able to see the
-// item when it's created so they can observe it directly. Are there any
-// clients that actually need to know when the item is added to the history?).
-void DownloadManagerImpl::OnDownloadItemAddedToPersistentStore(
- DownloadItemImpl* item) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- VLOG(20) << __FUNCTION__ << "()" << " db_handle = " << item->GetDbHandle()
- << " download_id = " << item->GetId()
- << " download = " << item->DebugString(true);
-
- // If the download is still in progress, try to complete it.
- //
- // Otherwise, download has been cancelled or interrupted before we've
- // received the DB handle. We post one final message to the history
- // service so that it can be properly in sync with the DownloadItem's
- // completion status, and also inform any observers so that they get
- // more than just the start notification.
- if (item->IsInProgress()) {
- item->MaybeCompleteDownload();
- } else {
- DCHECK(item->IsCancelled());
- active_downloads_.erase(item->GetId());
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(item);
- item->UpdateObservers();
- }
-}
-
+DownloadItem* DownloadManagerImpl::CreateDownloadItem(
+ 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) {
+ DownloadItemImpl* item = item_factory_->CreatePersistedItem(
+ this,
+ GetNextId(),
+ path,
+ url,
+ referrer_url,
+ start_time,
+ end_time,
+ received_bytes,
+ total_bytes,
+ state,
+ opened,
+ net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD));
+ DCHECK(!ContainsKey(downloads_, item->GetId()));
+ downloads_[item->GetId()] = item;
+ FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, item));
+ VLOG(20) << __FUNCTION__ << "() download = " << item->DebugString(true);
+ return item;
+}
+
+// TODO(asanka) Move into an observer.
void DownloadManagerImpl::ShowDownloadInBrowser(DownloadItemImpl* download) {
// The 'contents' may no longer exist if the user closed the contents before
// we get this start completion event.
@@ -774,39 +700,7 @@ void DownloadManagerImpl::AssertContainersConsistent() const {
#endif
}
-// SavePackage will call SavePageDownloadFinished upon completion/cancellation.
-// The history callback will call OnSavePageItemAddedToPersistentStore.
-// If the download finishes before the history callback,
-// OnSavePageItemAddedToPersistentStore calls SavePageDownloadFinished, ensuring
-// that the history event is update regardless of the order in which these two
-// events complete.
-// If something removes the download item from the download manager (Remove,
-// Shutdown) the result will be that the SavePage system will not be able to
-// properly update the download item (which no longer exists) or the download
-// history, but the action will complete properly anyway. This may lead to the
-// history entry being wrong on a reload of chrome (specifically in the case of
-// Initiation -> History Callback -> Removal -> Completion), but there's no way
-// to solve that without canceling on Remove (which would then update the DB).
-
-void DownloadManagerImpl::OnSavePageItemAddedToPersistentStore(
- DownloadItemImpl* item) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- // Finalize this download if it finished before the history callback.
- if (!item->IsInProgress())
- SavePageDownloadFinished(item);
-}
-
-void DownloadManagerImpl::SavePageDownloadFinished(DownloadItem* download) {
- if (download->IsPersisted()) {
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(download);
- }
-}
-
void DownloadManagerImpl::DownloadOpened(DownloadItemImpl* download) {
- if (delegate_)
- delegate_->UpdateItemInPersistentStore(download);
int num_unopened = 0;
for (DownloadMap::iterator it = downloads_.begin();
it != downloads_.end(); ++it) {
@@ -818,29 +712,4 @@ void DownloadManagerImpl::DownloadOpened(DownloadItemImpl* download) {
RecordOpensOutstanding(num_unopened);
}
-void DownloadManagerImpl::DownloadRenamedToIntermediateName(
- DownloadItemImpl* download) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // download->GetFullPath() is only expected to be meaningful after this
- // callback is received. Therefore we can now add the download to a persistent
- // store. If the rename failed, we processed an interrupt
- // before we receive the DownloadRenamedToIntermediateName() call.
- if (delegate_) {
- delegate_->AddItemToPersistentStore(download);
- } else {
- OnItemAddedToPersistentStore(download->GetId(),
- DownloadItem::kUninitializedHandle);
- }
-}
-
-void DownloadManagerImpl::DownloadRenamedToFinalName(
- DownloadItemImpl* download) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // If the rename failed, we processed an interrupt before we get here.
- if (delegate_) {
- delegate_->UpdatePathForItemInPersistentStore(
- download, download->GetFullPath());
- }
-}
-
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698