blob: cb72d0e9c2e21db59e7644e3f7512139943c3a27 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/safe_browsing/services_delegate_impl.h"
#include <utility>
#include "base/command_line.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/field_trial.h"
#include "base/strings/string_util.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/common/chrome_switches.h"
#include "components/safe_browsing_db/v4_local_database_manager.h"
#include "content/public/browser/browser_thread.h"
namespace safe_browsing {
#ifdef NDEBUG
namespace {
const base::Feature kSafeBrowsingV4LocalDatabaseManagerEnabled {
"SafeBrowsingV4LocalDatabaseManagerEnabled",
base::FEATURE_DISABLED_BY_DEFAULT
};
} // namespace
#endif
// static
std::unique_ptr<ServicesDelegate> ServicesDelegate::Create(
SafeBrowsingService* safe_browsing_service) {
return base::WrapUnique(
new ServicesDelegateImpl(safe_browsing_service, nullptr));
}
// static
std::unique_ptr<ServicesDelegate> ServicesDelegate::CreateForTest(
SafeBrowsingService* safe_browsing_service,
ServicesDelegate::ServicesCreator* services_creator) {
return base::WrapUnique(
new ServicesDelegateImpl(safe_browsing_service, services_creator));
}
ServicesDelegateImpl::ServicesDelegateImpl(
SafeBrowsingService* safe_browsing_service,
ServicesDelegate::ServicesCreator* services_creator)
: safe_browsing_service_(safe_browsing_service),
services_creator_(services_creator) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
ServicesDelegateImpl::~ServicesDelegateImpl() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
void ServicesDelegateImpl::InitializeCsdService(
net::URLRequestContextGetter* context_getter) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
#if defined(SAFE_BROWSING_CSD)
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableClientSidePhishingDetection)) {
csd_service_.reset(ClientSideDetectionService::Create(context_getter));
}
#endif // defined(SAFE_BROWSING_CSD)
}
void ServicesDelegateImpl::Initialize() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
download_service_.reset(
(services_creator_ &&
services_creator_->CanCreateDownloadProtectionService())
? services_creator_->CreateDownloadProtectionService()
: CreateDownloadProtectionService());
incident_service_.reset(
(services_creator_ &&
services_creator_->CanCreateIncidentReportingService())
? services_creator_->CreateIncidentReportingService()
: CreateIncidentReportingService());
resource_request_detector_.reset(
(services_creator_ &&
services_creator_->CanCreateResourceRequestDetector())
? services_creator_->CreateResourceRequestDetector()
: CreateResourceRequestDetector());
if (IsV4LocalDatabaseManagerEnabled()) {
v4_local_database_manager_ = CreateV4LocalDatabaseManager();
}
}
void ServicesDelegateImpl::ShutdownServices() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
// The IO thread is going away, so make sure the ClientSideDetectionService
// dtor executes now since it may call the dtor of URLFetcher which relies
// on it.
csd_service_.reset();
resource_request_detector_.reset();
incident_service_.reset();
// Must shut down last.
download_service_.reset();
}
void ServicesDelegateImpl::RefreshState(bool enable) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (csd_service_)
csd_service_->SetEnabledAndRefreshState(enable);
if (download_service_)
download_service_->SetEnabled(enable);
}
void ServicesDelegateImpl::ProcessResourceRequest(
const ResourceRequestInfo* request) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (resource_request_detector_)
resource_request_detector_->ProcessResourceRequest(request);
}
std::unique_ptr<TrackedPreferenceValidationDelegate>
ServicesDelegateImpl::CreatePreferenceValidationDelegate(Profile* profile) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return incident_service_->CreatePreferenceValidationDelegate(profile);
}
void ServicesDelegateImpl::RegisterDelayedAnalysisCallback(
const DelayedAnalysisCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
incident_service_->RegisterDelayedAnalysisCallback(callback);
}
void ServicesDelegateImpl::RegisterExtendedReportingOnlyDelayedAnalysisCallback(
const DelayedAnalysisCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
incident_service_->RegisterExtendedReportingOnlyDelayedAnalysisCallback(
callback);
}
void ServicesDelegateImpl::AddDownloadManager(
content::DownloadManager* download_manager) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
incident_service_->AddDownloadManager(download_manager);
}
ClientSideDetectionService* ServicesDelegateImpl::GetCsdService() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return csd_service_.get();
}
DownloadProtectionService* ServicesDelegateImpl::GetDownloadService() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return download_service_.get();
}
DownloadProtectionService*
ServicesDelegateImpl::CreateDownloadProtectionService() {
return new DownloadProtectionService(safe_browsing_service_);
}
IncidentReportingService*
ServicesDelegateImpl::CreateIncidentReportingService() {
return new IncidentReportingService(safe_browsing_service_);
}
ResourceRequestDetector* ServicesDelegateImpl::CreateResourceRequestDetector() {
return new ResourceRequestDetector(safe_browsing_service_->database_manager(),
incident_service_->GetIncidentReceiver());
}
void ServicesDelegateImpl::StartOnIOThread(
net::URLRequestContextGetter* url_request_context_getter,
const V4ProtocolConfig& v4_config) {
if (v4_local_database_manager_.get()) {
v4_local_database_manager_->StartOnIOThread(url_request_context_getter,
v4_config);
}
}
void ServicesDelegateImpl::StopOnIOThread(bool shutdown) {
if (v4_local_database_manager_.get()) {
v4_local_database_manager_->StopOnIOThread(shutdown);
}
}
V4LocalDatabaseManager* ServicesDelegateImpl::CreateV4LocalDatabaseManager() {
return new V4LocalDatabaseManager(SafeBrowsingService::GetBaseFilename());
}
bool ServicesDelegateImpl::IsV4LocalDatabaseManagerEnabled() {
#ifndef NDEBUG
return true;
#else
return base::FeatureList::IsEnabled(
kSafeBrowsingV4LocalDatabaseManagerEnabled);
#endif
}
} // namespace safe_browsing