Chromium Code Reviews| Index: chrome/browser/download/download_history.h |
| diff --git a/chrome/browser/download/download_history.h b/chrome/browser/download/download_history.h |
| index 1a831ed706048439d371eb0bdce1c48ce5b11a4c..61fb082b72403cf3d171830f33844bfeceec52a0 100644 |
| --- a/chrome/browser/download/download_history.h |
| +++ b/chrome/browser/download/download_history.h |
| @@ -6,86 +6,116 @@ |
| #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_HISTORY_H_ |
| #include <map> |
| +#include <set> |
| +#include <vector> |
| #include "base/basictypes.h" |
| #include "base/callback.h" |
| +#include "base/memory/weak_ptr.h" |
| +#include "base/observer_list.h" |
| #include "chrome/browser/common/cancelable_request.h" |
| +#include "chrome/browser/download/hyperbolic_download_item_notifier.h" |
| #include "chrome/browser/history/history.h" |
| +#include "content/public/browser/download_item.h" |
| +#include "content/public/browser/download_manager.h" |
| -class Profile; |
| +struct DownloadPersistentStoreInfo; |
| -namespace base { |
| -class Time; |
| -} |
| - |
| -namespace content { |
| -class DownloadItem; |
| -} |
| - |
| -// Interacts with the HistoryService on behalf of the download subsystem. |
| -class DownloadHistory { |
| +// Observes a single DownloadManager and all its DownloadItems, keeping the |
| +// DownloadDatabase up to date. |
| +class DownloadHistory: public HyperbolicDownloadItemNotifier::Observer { |
| public: |
| typedef base::Callback<void(bool)> VisitedBeforeDoneCallback; |
| + typedef std::set<int64> HandleSet; |
| + |
| + // Since there isn't (and shouldn't be) a general public way to access |
|
Randy Smith (Not in Mondays)
2012/09/24 18:03:25
Why shouldn't there be? It feels very weird for a
benjhayden
2012/11/02 17:21:37
Ok, yeah, I'll expose DownloadHistory so that we d
Randy Smith (Not in Mondays)
2012/11/02 23:31:24
I think it's a good idea.
benjhayden
2012/11/06 20:01:14
Done.
|
| + // DownloadHistory directly, observers should use |
| + // DownloadServiceFactory::GetForProfile(profile)-> |
| + // GetDownloadManagerDelegate()-> |
| + // AddHistoryObserver(this); |
| + // RemoveHistoryObserver(this); |
| + class Observer { |
| + public: |
| + Observer(); |
| + virtual ~Observer(); |
| + |
| + // Fires when CreateDownload/UpdateDownload messages are sent to the DB |
| + // thread. |
| + virtual void OnDownloadStored(const DownloadPersistentStoreInfo& info) {} |
| + |
| + // Fires when RemoveDownloads messages are sent to the DB thread. |
| + virtual void OnDownloadsRemoved(const HandleSet& db_handle) {} |
|
Randy Smith (Not in Mondays)
2012/09/24 18:03:25
The lack of an equivalent to OnDownloadDestroyed/M
benjhayden
2012/11/02 17:21:37
I'm not sure who you're referring to by 'users'.
A
Randy Smith (Not in Mondays)
2012/11/02 23:31:24
I'm confused about how you're saying relates to my
benjhayden
2012/11/06 20:01:14
Ah! Yes, thanks.
Done.
|
| + }; |
| + |
| + // Neither |manager| nor |history| may be NULL. |
| + // Caller must guarantee that HistoryService outlives DownloadHistory. |
|
Randy Smith (Not in Mondays)
2012/09/24 18:03:25
Suggestion: Add a note explicitly stating that we'
benjhayden
2012/11/02 17:21:37
What do you mean by 'independent'?
ADIN::Os deal w
Randy Smith (Not in Mondays)
2012/11/02 23:31:24
Yep, that's how the implementation deals, but user
benjhayden
2012/11/06 20:01:14
Done.
|
| + DownloadHistory( |
| + content::DownloadManager* manager, |
| + HistoryService* history); |
| + |
| + virtual ~DownloadHistory(); |
| + |
| + void AddObserver(Observer* observer); |
| + void RemoveObserver(Observer* observer); |
| + |
| + // Checks whether |referrer_url| has been visited before today. |
| + void CheckVisitedReferrerBefore(const GURL& referrer_url, |
| + const VisitedBeforeDoneCallback& callback); |
| - explicit DownloadHistory(Profile* profile); |
| - ~DownloadHistory(); |
| + private: |
| + typedef std::set<int32> IdSet; |
| + typedef std::set<content::DownloadItem*> ItemSet; |
| - // Retrieves the next_id counter from the sql meta_table. |
| - // Should be much faster than Load so that we may delay downloads until after |
| - // this call with minimal performance penalty. |
| - void GetNextId(const HistoryService::DownloadNextIdCallback& callback); |
| + // HyperbolicDownloadItemNotifier::Observer |
| + virtual void OnDownloadCreated( |
| + content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE; |
| + virtual void OnDownloadUpdated( |
| + content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE; |
| + virtual void OnDownloadOpened( |
| + content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE; |
| + virtual void OnDownloadRemoved( |
| + content::DownloadManager* manager, content::DownloadItem* item) OVERRIDE; |
| - // Retrieves DownloadCreateInfos saved in the history. |
| - void Load(const HistoryService::DownloadQueryCallback& callback); |
| + void MaybeAddToHistory(content::DownloadItem* item); |
| - // Checks whether |referrer_url| has been visited before today. This takes |
| - // ownership of |callback|. |
| - void CheckVisitedReferrerBefore(int32 download_id, |
| - const GURL& referrer_url, |
| - const VisitedBeforeDoneCallback& callback); |
| + void ItemAdded(int32 id, int64 db_handle); |
| - // Adds a new entry for a download to the history database. |
| - void AddEntry(content::DownloadItem* download_item, |
| - const HistoryService::DownloadCreateCallback& callback); |
| + void RemoveDownloadsBatch(); |
| - // Updates the history entry for |download_item|. |
| - void UpdateEntry(content::DownloadItem* download_item); |
| + void OnGotVisitCountToHost( |
| + const VisitedBeforeDoneCallback& callback, |
| + HistoryService::Handle unused_handle, |
| + bool found_visits, int count, base::Time first_visit); |
| - // Updates the download path for |download_item| to |new_path|. |
| - void UpdateDownloadPath(content::DownloadItem* download_item, |
| - const FilePath& new_path); |
| + void QueryCallback( |
| + std::vector<DownloadPersistentStoreInfo>* infos); |
| - // Removes |download_item| from the history database. |
| - void RemoveEntry(content::DownloadItem* download_item); |
| + HyperbolicDownloadItemNotifier notifier_; |
| - // Removes download-related history entries in the given time range. |
| - void RemoveEntriesBetween(const base::Time remove_begin, |
| - const base::Time remove_end); |
| + HistoryService* history_; |
| - // Returns a new unique database handle which will not collide with real ones. |
| - int64 GetNextFakeDbHandle(); |
| + // |db_handle| of the item being created in response to QueryCallback(), |
| + // matched up with created items in OnDownloadCreated() so that the item is |
| + // not re-added to the database. For items not created by QueryCallback(), |
| + // this is DownloadDatabase::kUninitializedHandle. |
| + int64 loading_db_handle_; |
| - private: |
| - typedef std::map<HistoryService::Handle, VisitedBeforeDoneCallback> |
| - VisitedBeforeRequestsMap; |
| + // |db_handles| of items that are scheduled for removal from history, to |
| + // facilitate batching removals together for database efficiency. |
| + HandleSet removing_; |
| - void OnGotVisitCountToHost(HistoryService::Handle handle, |
| - bool found_visits, |
| - int count, |
| - base::Time first_visit); |
| + // |GetId()|s of items that were removed while they were being added, so that |
| + // they can be removed when their db_handles are received from the database. |
| + IdSet removed_while_adding_; |
| - Profile* profile_; |
| + // Count the number of items in the history for UMA. |
| + int64 history_size_; |
| - // In case we don't have a valid db_handle, we use |fake_db_handle_| instead. |
| - // This is useful for incognito mode or when the history database is offline. |
| - // Downloads are expected to have unique handles, so we decrement the next |
| - // fake handle value on every use. |
| - int64 next_fake_db_handle_; |
| + ObserverList<Observer> observers_; |
| CancelableRequestConsumer history_consumer_; |
| - // The outstanding requests made by CheckVisitedReferrerBefore(). |
| - VisitedBeforeRequestsMap visited_before_requests_; |
| + base::WeakPtrFactory<DownloadHistory> weak_ptr_factory_; |
| DISALLOW_COPY_AND_ASSIGN(DownloadHistory); |
| }; |