Index: chrome/browser/download/download_history.cc |
diff --git a/chrome/browser/download/download_history.cc b/chrome/browser/download/download_history.cc |
index 115541a4d24742ed52fa9ed9683f915109b60175..f1b6388f3366209510e6f11a35f44eeab1649750 100644 |
--- a/chrome/browser/download/download_history.cc |
+++ b/chrome/browser/download/download_history.cc |
@@ -4,22 +4,29 @@ |
#include "chrome/browser/download/download_history.h" |
+#include "base/bind.h" |
#include "base/logging.h" |
+#include "chrome/browser/download/download_item.h" |
+#include "chrome/browser/download/download_manager.h" |
+#include "chrome/browser/download/download_prefs.h" |
#include "chrome/browser/history/download_history_info.h" |
#include "chrome/browser/history/history_marshaling.h" |
-#include "chrome/browser/download/download_item.h" |
#include "chrome/browser/profiles/profile.h" |
-// Our download table ID starts at 1, so we use 0 to represent a download that |
-// has started, but has not yet had its data persisted in the table. We use fake |
-// database handles in incognito mode starting at -1 and progressively getting |
-// more negative. |
-// static |
-const int DownloadHistory::kUninitializedHandle = 0; |
+namespace { |
+int GetNextIdThunk(Profile* profile) { |
+ DCHECK(profile != NULL); |
+ DCHECK(profile->GetDownloadManager() != NULL); |
+ DCHECK(profile->GetDownloadManager()->download_prefs() != NULL); |
+ if ((profile == NULL) || |
+ (profile->GetDownloadManager() == NULL) || |
+ (profile->GetDownloadManager()->download_prefs() == NULL)) return -1; |
+ return profile->GetDownloadManager()->download_prefs()->GetNextId(); |
+} |
+} // anonymous namespace |
DownloadHistory::DownloadHistory(Profile* profile) |
- : profile_(profile), |
- next_fake_db_handle_(kUninitializedHandle - 1) { |
+ : profile_(profile) { |
DCHECK(profile); |
} |
@@ -40,7 +47,9 @@ void DownloadHistory::Load(HistoryService::DownloadQueryCallback* callback) { |
delete callback; |
return; |
} |
- hs->QueryDownloads(&history_consumer_, callback); |
+ hs->QueryDownloads(&history_consumer_, |
+ base::Bind(&GetNextIdThunk, profile_), |
+ callback); |
// This is the initial load, so do a cleanup of corrupt in-progress entries. |
hs->CleanUpInProgressEntries(); |
@@ -70,64 +79,52 @@ void DownloadHistory::AddEntry( |
DownloadItem* download_item, |
HistoryService::DownloadCreateCallback* callback) { |
DCHECK(download_item); |
- // Do not store the download in the history database for a few special cases: |
- // - incognito mode (that is the point of this mode) |
- // - extensions (users don't think of extension installation as 'downloading') |
- // - temporary download, like in drag-and-drop |
- // - history service is not available (e.g. in tests) |
- // We have to make sure that these handles don't collide with normal db |
- // handles, so we use a negative value. Eventually, they could overlap, but |
- // you'd have to do enough downloading that your ISP would likely stab you in |
- // the neck first. YMMV. |
HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- if (download_item->is_otr() || download_item->is_extension_install() || |
- download_item->is_temporary() || !hs) { |
- callback->RunWithParams( |
- history::DownloadCreateRequest::TupleType(download_item->id(), |
- GetNextFakeDbHandle())); |
+ if (download_item->is_otr() || |
+ download_item->is_extension_install() || |
+ download_item->is_temporary() || |
+ (hs == NULL)) { |
+ callback->Run(download_item->id()); |
delete callback; |
return; |
} |
- int32 id = download_item->id(); |
DownloadHistoryInfo history_info = download_item->GetHistoryInfo(); |
- hs->CreateDownload(id, history_info, &history_consumer_, callback); |
+ hs->CreateDownload(download_item->id(), |
+ history_info, |
+ &history_consumer_, |
+ callback); |
} |
void DownloadHistory::UpdateEntry(DownloadItem* download_item) { |
// Don't store info in the database if the download was initiated while in |
// incognito mode or if it hasn't been initialized in our database table. |
- if (download_item->db_handle() <= kUninitializedHandle) |
- return; |
- |
HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- if (!hs) |
- return; |
- |
+ if ((download_item == NULL) || |
+ (hs == NULL) || |
+ !download_item->IsInHistory()) return; |
hs->UpdateDownload(download_item->received_bytes(), |
download_item->state(), |
- download_item->db_handle()); |
+ download_item->id()); |
} |
void DownloadHistory::UpdateDownloadPath(DownloadItem* download_item, |
const FilePath& new_path) { |
// No update necessary if the download was initiated while in incognito mode. |
- if (download_item->db_handle() <= kUninitializedHandle) |
- return; |
- |
HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- if (hs) |
- hs->UpdateDownloadPath(new_path, download_item->db_handle()); |
+ if ((hs == NULL) || |
+ (download_item == NULL) || |
+ !download_item->IsInHistory()) return; |
+ hs->UpdateDownloadPath(new_path, download_item->id()); |
} |
void DownloadHistory::RemoveEntry(DownloadItem* download_item) { |
// No update necessary if the download was initiated while in incognito mode. |
- if (download_item->db_handle() <= kUninitializedHandle) |
- return; |
- |
HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
- if (hs) |
- hs->RemoveDownload(download_item->db_handle()); |
+ if ((hs == NULL) || |
+ (download_item == NULL) || |
+ !download_item->IsInHistory()) return; |
+ hs->RemoveDownload(download_item->id()); |
} |
void DownloadHistory::RemoveEntriesBetween(const base::Time remove_begin, |
@@ -137,10 +134,6 @@ void DownloadHistory::RemoveEntriesBetween(const base::Time remove_begin, |
hs->RemoveDownloadsBetween(remove_begin, remove_end); |
} |
-int64 DownloadHistory::GetNextFakeDbHandle() { |
- return next_fake_db_handle_--; |
-} |
- |
void DownloadHistory::OnGotVisitCountToHost(HistoryService::Handle handle, |
bool found_visits, |
int count, |