blob: f82e1aa6d153ffa75c897f1351a938a9b2cbcae5 [file] [log] [blame]
// Copyright 2015 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/content_settings/host_content_settings_map_factory.h"
#include <utility>
#include "base/feature_list.h"
#include "chrome/browser/profiles/off_the_record_profile_impl.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/common/chrome_features.h"
#include "components/content_settings/core/browser/content_settings_pref_provider.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/buildflags/buildflags.h"
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "chrome/browser/extensions/extension_service.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/extension_system_provider.h"
#include "extensions/browser/extensions_browser_client.h"
#endif
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
#include "chrome/browser/content_settings/content_settings_supervised_provider.h"
#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
#include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
#endif
#if defined(OS_ANDROID)
#include "chrome/browser/android/chrome_feature_list.h"
#include "chrome/browser/installable/installed_webapp_provider.h"
#include "chrome/browser/notifications/notification_channels_provider_android.h"
#endif // OS_ANDROID
HostContentSettingsMapFactory::HostContentSettingsMapFactory()
: RefcountedBrowserContextKeyedServiceFactory(
"HostContentSettingsMap",
BrowserContextDependencyManager::GetInstance()) {
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
DependsOn(SupervisedUserSettingsServiceFactory::GetInstance());
#endif
#if BUILDFLAG(ENABLE_EXTENSIONS)
DependsOn(
extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory());
#endif
}
HostContentSettingsMapFactory::~HostContentSettingsMapFactory() {
}
// static
HostContentSettingsMap* HostContentSettingsMapFactory::GetForProfile(
Profile* profile) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
return static_cast<HostContentSettingsMap*>(
GetInstance()->GetServiceForBrowserContext(profile, true).get());
}
// static
HostContentSettingsMapFactory* HostContentSettingsMapFactory::GetInstance() {
return base::Singleton<HostContentSettingsMapFactory>::get();
}
scoped_refptr<RefcountedKeyedService>
HostContentSettingsMapFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
Profile* profile = static_cast<Profile*>(context);
// In incognito mode, retrieve the host content settings map of the parent
// profile in order to ensure the preferences have been migrated.
// TODO(crbug.com/277296): Remove check that profile does not equal the
// original profile once TestingProfile::ForceIncognito is gone.
if (profile->IsIncognitoProfile() &&
profile != profile->GetOriginalProfile()) {
GetForProfile(profile->GetOriginalProfile());
}
scoped_refptr<HostContentSettingsMap> settings_map(new HostContentSettingsMap(
profile->GetPrefs(), profile->IsIncognitoProfile(),
profile->IsGuestProfile(),
/*store_last_modified=*/true,
base::FeatureList::IsEnabled(features::kPermissionDelegation)));
#if BUILDFLAG(ENABLE_EXTENSIONS)
// These must be registered before before the HostSettings are passed over to
// the IOThread. Simplest to do this on construction.
extensions::ExtensionService::RegisterContentSettings(settings_map.get(),
profile);
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
SupervisedUserSettingsService* supervised_service =
SupervisedUserSettingsServiceFactory::GetForKey(profile->GetProfileKey());
// This may be null in testing.
if (supervised_service) {
std::unique_ptr<content_settings::SupervisedProvider> supervised_provider(
new content_settings::SupervisedProvider(supervised_service));
settings_map->RegisterProvider(HostContentSettingsMap::SUPERVISED_PROVIDER,
std::move(supervised_provider));
}
#endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
#if defined(OS_ANDROID)
if (profile->IsRegularProfile()) {
auto channels_provider =
std::make_unique<NotificationChannelsProviderAndroid>();
channels_provider->MigrateToChannelsIfNecessary(
profile->GetPrefs(), settings_map->GetPrefProvider());
// Clear blocked channels *after* migrating in case the pref provider
// contained any erroneously-created channels that need deleting.
channels_provider->ClearBlockedChannelsIfNecessary(
profile->GetPrefs(), TemplateURLServiceFactory::GetForProfile(profile));
settings_map->RegisterUserModifiableProvider(
HostContentSettingsMap::NOTIFICATION_ANDROID_PROVIDER,
std::move(channels_provider));
if (base::FeatureList::IsEnabled(chrome::android::
kTrustedWebActivityNotificationDelegationEnrolment)) {
auto webapp_provider = std::make_unique<InstalledWebappProvider>();
settings_map->RegisterProvider(
HostContentSettingsMap::INSTALLED_WEBAPP_PROVIDER,
std::move(webapp_provider));
}
}
#endif // defined (OS_ANDROID)
return settings_map;
}
content::BrowserContext* HostContentSettingsMapFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
return context;
}