summaryrefslogtreecommitdiffstats
path: root/chrome/browser/download/chrome_download_manager_delegate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/download/chrome_download_manager_delegate.cc')
-rw-r--r--chrome/browser/download/chrome_download_manager_delegate.cc98
1 files changed, 33 insertions, 65 deletions
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index fb4e5b6..345c4ce 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -29,6 +29,8 @@
#include "chrome/browser/extensions/api/downloads/downloads_api.h"
#include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/history/history.h"
+#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/intents/web_intents_util.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -141,6 +143,21 @@ void OnWebIntentDispatchCompleted(
base::Bind(&DeleteFile, file_path));
}
+typedef base::Callback<void(bool)> VisitedBeforeCallback;
+
+// Condenses the results from HistoryService::GetVisibleVisitCountToHost() to a
+// single bool so that VisitedBeforeCallback can curry up to 5 other parameters
+// without a struct.
+void VisitCountsToVisitedBefore(
+ const VisitedBeforeCallback& callback,
+ HistoryService::Handle unused_handle,
+ bool found_visits,
+ int count,
+ base::Time first_visit) {
+ callback.Run(found_visits && count &&
+ (first_visit.LocalMidnight() < base::Time::Now().LocalMidnight()));
+}
+
} // namespace
ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile)
@@ -154,18 +171,6 @@ ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() {
void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) {
download_manager_ = dm;
- download_history_.reset(new DownloadHistory(profile_));
- if (!profile_->IsOffTheRecord()) {
- // DownloadManager should not be RefCountedThreadSafe.
- // ChromeDownloadManagerDelegate outlives DownloadManager, and
- // DownloadHistory uses a scoped canceller to cancel tasks when it is
- // deleted. Almost all callbacks to DownloadManager should use weak pointers
- // or bounce off a container object that uses ManagerGoingDown() to simulate
- // a weak pointer.
- download_history_->Load(
- base::Bind(&DownloadManager::OnPersistentStoreQueryComplete,
- download_manager_));
- }
#if !defined(OS_ANDROID)
extension_event_router_.reset(new ExtensionDownloadsEventRouter(
profile_, download_manager_));
@@ -173,7 +178,6 @@ void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) {
}
void ChromeDownloadManagerDelegate::Shutdown() {
- download_history_.reset();
download_prefs_.reset();
#if !defined(OS_ANDROID)
extension_event_router_.reset();
@@ -481,42 +485,6 @@ bool ChromeDownloadManagerDelegate::GenerateFileHash() {
#endif
}
-void ChromeDownloadManagerDelegate::AddItemToPersistentStore(
- DownloadItem* item) {
- if (profile_->IsOffTheRecord()) {
- OnItemAddedToPersistentStore(
- item->GetId(), download_history_->GetNextFakeDbHandle());
- return;
- }
- download_history_->AddEntry(item,
- base::Bind(&ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore,
- this));
-}
-
-void ChromeDownloadManagerDelegate::UpdateItemInPersistentStore(
- DownloadItem* item) {
- download_history_->UpdateEntry(item);
-}
-
-void ChromeDownloadManagerDelegate::UpdatePathForItemInPersistentStore(
- DownloadItem* item,
- const FilePath& new_path) {
- download_history_->UpdateDownloadPath(item, new_path);
-}
-
-void ChromeDownloadManagerDelegate::RemoveItemFromPersistentStore(
- DownloadItem* item) {
- download_history_->RemoveEntry(item);
-}
-
-void ChromeDownloadManagerDelegate::RemoveItemsFromPersistentStoreBetween(
- base::Time remove_begin,
- base::Time remove_end) {
- if (profile_->IsOffTheRecord())
- return;
- download_history_->RemoveEntriesBetween(remove_begin, remove_end);
-}
-
void ChromeDownloadManagerDelegate::GetSaveDir(BrowserContext* browser_context,
FilePath* website_save_dir,
FilePath* download_save_dir,
@@ -639,10 +607,22 @@ void ChromeDownloadManagerDelegate::CheckDownloadUrlDone(
if (result != DownloadProtectionService::SAFE)
danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL;
- download_history_->CheckVisitedReferrerBefore(
- download_id, download->GetReferrerUrl(),
- base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone,
- this, download_id, callback, danger_type));
+ // HistoryServiceFactory redirects incognito profiles to on-record profiles.
+ HistoryService* history = HistoryServiceFactory::GetForProfile(
+ profile_, Profile::EXPLICIT_ACCESS);
+ if (!history || !download->GetReferrerUrl().is_valid()) {
+ // If the original profile doesn't have a HistoryService or the referrer url
+ // is invalid, then give up and assume the referrer has not been visited
+ // before. There's no history for on-record profiles in unit_tests, for
+ // example.
+ CheckVisitedReferrerBeforeDone(download_id, callback, danger_type, false);
+ return;
+ }
+ history->GetVisibleVisitCountToHost(
+ download->GetReferrerUrl(), &history_consumer_,
+ base::Bind(&VisitCountsToVisitedBefore, base::Bind(
+ &ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone,
+ this, download_id, callback, danger_type)));
}
void ChromeDownloadManagerDelegate::CheckClientDownloadDone(
@@ -887,15 +867,3 @@ void ChromeDownloadManagerDelegate::OnTargetPathDetermined(
}
callback.Run(target_path, disposition, danger_type, intermediate_path);
}
-
-void ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore(
- int32 download_id, int64 db_handle) {
- // It's not immediately obvious, but HistoryBackend::CreateDownload() can
- // call this function with an invalid |db_handle|. For instance, this can
- // happen when the history database is offline. We cannot have multiple
- // DownloadItems with the same invalid db_handle, so we need to assign a
- // unique |db_handle| here.
- if (db_handle == DownloadItem::kUninitializedHandle)
- db_handle = download_history_->GetNextFakeDbHandle();
- download_manager_->OnItemAddedToPersistentStore(download_id, db_handle);
-}