browser_context_impl.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "weblayer/browser/browser_context_impl.h"
  5. #include "base/memory/raw_ptr.h"
  6. #include "base/threading/thread_restrictions.h"
  7. #include "build/build_config.h"
  8. #include "components/background_sync/background_sync_controller_impl.h"
  9. #include "components/blocked_content/safe_browsing_triggered_popup_blocker.h"
  10. #include "components/client_hints/browser/client_hints.h"
  11. #include "components/content_settings/core/browser/host_content_settings_map.h"
  12. #include "components/download/public/common/in_progress_download_manager.h"
  13. #include "components/embedder_support/pref_names.h"
  14. #include "components/heavy_ad_intervention/heavy_ad_service.h"
  15. #include "components/keyed_service/content/browser_context_dependency_manager.h"
  16. #include "components/language/core/browser/language_prefs.h"
  17. #include "components/payments/core/payment_prefs.h"
  18. #include "components/permissions/permission_manager.h"
  19. #include "components/pref_registry/pref_registry_syncable.h"
  20. #include "components/prefs/in_memory_pref_store.h"
  21. #include "components/prefs/json_pref_store.h"
  22. #include "components/prefs/pref_service.h"
  23. #include "components/prefs/pref_service_factory.h"
  24. #include "components/reduce_accept_language/browser/reduce_accept_language_service.h"
  25. #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
  26. #include "components/security_interstitials/content/stateful_ssl_host_state_delegate.h"
  27. #include "components/site_isolation/pref_names.h"
  28. #include "components/site_isolation/site_isolation_policy.h"
  29. #include "components/translate/core/browser/translate_pref_names.h"
  30. #include "components/translate/core/browser/translate_prefs.h"
  31. #include "components/user_prefs/user_prefs.h"
  32. #include "components/variations/proto/study.pb.h"
  33. #include "components/variations/variations.mojom.h"
  34. #include "components/variations/variations_client.h"
  35. #include "components/variations/variations_ids_provider.h"
  36. #include "content/public/browser/device_service.h"
  37. #include "content/public/browser/download_request_utils.h"
  38. #include "content/public/browser/resource_context.h"
  39. #include "content/public/browser/storage_partition.h"
  40. #include "third_party/blink/public/common/web_preferences/web_preferences.h"
  41. #include "weblayer/browser/background_fetch/background_fetch_delegate_factory.h"
  42. #include "weblayer/browser/background_fetch/background_fetch_delegate_impl.h"
  43. #include "weblayer/browser/background_sync/background_sync_controller_factory.h"
  44. #include "weblayer/browser/browsing_data_remover_delegate.h"
  45. #include "weblayer/browser/browsing_data_remover_delegate_factory.h"
  46. #include "weblayer/browser/client_hints_factory.h"
  47. #include "weblayer/browser/heavy_ad_service_factory.h"
  48. #include "weblayer/browser/permissions/permission_manager_factory.h"
  49. #include "weblayer/browser/reduce_accept_language_factory.h"
  50. #include "weblayer/browser/stateful_ssl_host_state_delegate_factory.h"
  51. #include "weblayer/public/common/switches.h"
  52. #if BUILDFLAG(IS_ANDROID)
  53. #include "base/android/path_utils.h"
  54. #include "components/browser_ui/accessibility/android/font_size_prefs_android.h"
  55. #include "components/cdm/browser/media_drm_storage_impl.h" // nogncheck
  56. #include "components/permissions/contexts/geolocation_permission_context_android.h"
  57. #include "components/site_engagement/content/site_engagement_service.h"
  58. #include "components/unified_consent/pref_names.h"
  59. #elif BUILDFLAG(IS_WIN)
  60. #include <windows.h>
  61. #include <KnownFolders.h>
  62. #include <shlobj.h>
  63. #include "base/win/scoped_co_mem.h"
  64. #elif BUILDFLAG(IS_POSIX)
  65. #include "base/nix/xdg_util.h"
  66. #endif
  67. namespace weblayer {
  68. namespace {
  69. // Ignores origin security check. DownloadManagerImpl will provide its own
  70. // implementation when InProgressDownloadManager object is passed to it.
  71. bool IgnoreOriginSecurityCheck(const GURL& url) {
  72. return true;
  73. }
  74. void BindWakeLockProvider(
  75. mojo::PendingReceiver<device::mojom::WakeLockProvider> receiver) {
  76. content::GetDeviceService().BindWakeLockProvider(std::move(receiver));
  77. }
  78. } // namespace
  79. namespace prefs {
  80. // Used to persist the public SettingType::NETWORK_PREDICTION_ENABLED API.
  81. const char kNoStatePrefetchEnabled[] = "weblayer.network_prediction_enabled";
  82. // Used to persist the public SettingType::UKM_ENABLED API.
  83. const char kUkmEnabled[] = "weblayer.ukm_enabled";
  84. } // namespace prefs
  85. class ResourceContextImpl : public content::ResourceContext {
  86. public:
  87. ResourceContextImpl() = default;
  88. ResourceContextImpl(const ResourceContextImpl&) = delete;
  89. ResourceContextImpl& operator=(const ResourceContextImpl&) = delete;
  90. ~ResourceContextImpl() override = default;
  91. };
  92. BrowserContextImpl::BrowserContextImpl(ProfileImpl* profile_impl,
  93. const base::FilePath& path)
  94. : profile_impl_(profile_impl),
  95. path_(path),
  96. simple_factory_key_(path, path.empty()),
  97. resource_context_(new ResourceContextImpl()),
  98. download_delegate_(GetDownloadManager()) {
  99. CreateUserPrefService();
  100. BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
  101. this);
  102. auto* heavy_ad_service = HeavyAdServiceFactory::GetForBrowserContext(this);
  103. if (IsOffTheRecord()) {
  104. heavy_ad_service->InitializeOffTheRecord();
  105. } else {
  106. heavy_ad_service->Initialize(GetPath());
  107. }
  108. site_isolation::SiteIsolationPolicy::ApplyPersistedIsolatedOrigins(this);
  109. }
  110. BrowserContextImpl::~BrowserContextImpl() {
  111. BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
  112. this);
  113. }
  114. base::FilePath BrowserContextImpl::GetDefaultDownloadDirectory() {
  115. // Note: if we wanted to productionize this on Windows/Linux, refactor
  116. // src/chrome's GetDefaultDownloadDirectory.
  117. base::FilePath download_dir;
  118. #if BUILDFLAG(IS_ANDROID)
  119. base::android::GetDownloadsDirectory(&download_dir);
  120. #elif BUILDFLAG(IS_WIN)
  121. base::win::ScopedCoMem<wchar_t> path_buf;
  122. if (SUCCEEDED(
  123. SHGetKnownFolderPath(FOLDERID_Downloads, 0, nullptr, &path_buf))) {
  124. download_dir = base::FilePath(path_buf.get());
  125. }
  126. #else
  127. download_dir = base::nix::GetXDGUserDirectory("DOWNLOAD", "Downloads");
  128. #endif
  129. return download_dir;
  130. }
  131. std::unique_ptr<content::ZoomLevelDelegate>
  132. BrowserContextImpl::CreateZoomLevelDelegate(const base::FilePath&) {
  133. return nullptr;
  134. }
  135. base::FilePath BrowserContextImpl::GetPath() {
  136. return path_;
  137. }
  138. bool BrowserContextImpl::IsOffTheRecord() {
  139. return path_.empty();
  140. }
  141. content::DownloadManagerDelegate*
  142. BrowserContextImpl::GetDownloadManagerDelegate() {
  143. return &download_delegate_;
  144. }
  145. content::ResourceContext* BrowserContextImpl::GetResourceContext() {
  146. return resource_context_.get();
  147. }
  148. content::BrowserPluginGuestManager* BrowserContextImpl::GetGuestManager() {
  149. return nullptr;
  150. }
  151. storage::SpecialStoragePolicy* BrowserContextImpl::GetSpecialStoragePolicy() {
  152. return nullptr;
  153. }
  154. content::PlatformNotificationService*
  155. BrowserContextImpl::GetPlatformNotificationService() {
  156. return nullptr;
  157. }
  158. content::PushMessagingService* BrowserContextImpl::GetPushMessagingService() {
  159. return nullptr;
  160. }
  161. content::StorageNotificationService*
  162. BrowserContextImpl::GetStorageNotificationService() {
  163. return nullptr;
  164. }
  165. content::SSLHostStateDelegate* BrowserContextImpl::GetSSLHostStateDelegate() {
  166. return StatefulSSLHostStateDelegateFactory::GetForBrowserContext(this);
  167. }
  168. content::PermissionControllerDelegate*
  169. BrowserContextImpl::GetPermissionControllerDelegate() {
  170. return PermissionManagerFactory::GetForBrowserContext(this);
  171. }
  172. content::ClientHintsControllerDelegate*
  173. BrowserContextImpl::GetClientHintsControllerDelegate() {
  174. return ClientHintsFactory::GetForBrowserContext(this);
  175. }
  176. content::BackgroundFetchDelegate*
  177. BrowserContextImpl::GetBackgroundFetchDelegate() {
  178. return BackgroundFetchDelegateFactory::GetForBrowserContext(this);
  179. }
  180. content::BackgroundSyncController*
  181. BrowserContextImpl::GetBackgroundSyncController() {
  182. return BackgroundSyncControllerFactory::GetForBrowserContext(this);
  183. }
  184. content::BrowsingDataRemoverDelegate*
  185. BrowserContextImpl::GetBrowsingDataRemoverDelegate() {
  186. return BrowsingDataRemoverDelegateFactory::GetForBrowserContext(this);
  187. }
  188. content::ReduceAcceptLanguageControllerDelegate*
  189. BrowserContextImpl::GetReduceAcceptLanguageControllerDelegate() {
  190. return ReduceAcceptLanguageFactory::GetForBrowserContext(this);
  191. }
  192. download::InProgressDownloadManager*
  193. BrowserContextImpl::RetriveInProgressDownloadManager() {
  194. // Override this to provide a connection to the wake lock service.
  195. auto* download_manager = new download::InProgressDownloadManager(
  196. nullptr, path_,
  197. path_.empty() ? nullptr
  198. : GetDefaultStoragePartition()->GetProtoDatabaseProvider(),
  199. base::BindRepeating(&IgnoreOriginSecurityCheck),
  200. base::BindRepeating(&content::DownloadRequestUtils::IsURLSafe),
  201. base::BindRepeating(&BindWakeLockProvider));
  202. #if BUILDFLAG(IS_ANDROID)
  203. download_manager->set_default_download_dir(GetDefaultDownloadDirectory());
  204. #endif
  205. return download_manager;
  206. }
  207. content::ContentIndexProvider* BrowserContextImpl::GetContentIndexProvider() {
  208. return nullptr;
  209. }
  210. void BrowserContextImpl::CreateUserPrefService() {
  211. auto pref_registry = base::MakeRefCounted<user_prefs::PrefRegistrySyncable>();
  212. RegisterPrefs(pref_registry.get());
  213. PrefServiceFactory pref_service_factory;
  214. if (IsOffTheRecord()) {
  215. pref_service_factory.set_user_prefs(
  216. base::MakeRefCounted<InMemoryPrefStore>());
  217. } else {
  218. pref_service_factory.set_user_prefs(base::MakeRefCounted<JsonPrefStore>(
  219. path_.Append(FILE_PATH_LITERAL("Preferences"))));
  220. }
  221. {
  222. // Creating the prefs service may require reading the preferences from disk.
  223. base::ScopedAllowBlocking allow_io;
  224. user_pref_service_ = pref_service_factory.Create(pref_registry);
  225. }
  226. // Note: UserPrefs::Set also ensures that the user_pref_service_ has not
  227. // been set previously.
  228. user_prefs::UserPrefs::Set(this, user_pref_service_.get());
  229. }
  230. void BrowserContextImpl::RegisterPrefs(
  231. user_prefs::PrefRegistrySyncable* pref_registry) {
  232. pref_registry->RegisterBooleanPref(prefs::kNoStatePrefetchEnabled, true);
  233. pref_registry->RegisterBooleanPref(prefs::kUkmEnabled, false);
  234. // This pref is used by captive_portal::CaptivePortalService (as well as other
  235. // potential use cases in the future, as it is used for various purposes
  236. // through //chrome).
  237. pref_registry->RegisterBooleanPref(
  238. embedder_support::kAlternateErrorPagesEnabled, true);
  239. pref_registry->RegisterListPref(
  240. site_isolation::prefs::kUserTriggeredIsolatedOrigins);
  241. pref_registry->RegisterDictionaryPref(
  242. site_isolation::prefs::kWebTriggeredIsolatedOrigins);
  243. StatefulSSLHostStateDelegate::RegisterProfilePrefs(pref_registry);
  244. HostContentSettingsMap::RegisterProfilePrefs(pref_registry);
  245. safe_browsing::RegisterProfilePrefs(pref_registry);
  246. language::LanguagePrefs::RegisterProfilePrefs(pref_registry);
  247. translate::TranslatePrefs::RegisterProfilePrefs(pref_registry);
  248. blocked_content::SafeBrowsingTriggeredPopupBlocker::RegisterProfilePrefs(
  249. pref_registry);
  250. payments::RegisterProfilePrefs(pref_registry);
  251. pref_registry->RegisterBooleanPref(
  252. translate::prefs::kOfferTranslateEnabled, true,
  253. user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
  254. #if BUILDFLAG(IS_ANDROID)
  255. site_engagement::SiteEngagementService::RegisterProfilePrefs(pref_registry);
  256. cdm::MediaDrmStorageImpl::RegisterProfilePrefs(pref_registry);
  257. permissions::GeolocationPermissionContextAndroid::RegisterProfilePrefs(
  258. pref_registry);
  259. pref_registry->RegisterBooleanPref(
  260. unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, false);
  261. pref_registry->RegisterDoublePref(browser_ui::prefs::kWebKitFontScaleFactor,
  262. 1.0);
  263. blink::web_pref::WebPreferences pref_defaults;
  264. pref_registry->RegisterBooleanPref(browser_ui::prefs::kWebKitForceEnableZoom,
  265. pref_defaults.force_enable_zoom);
  266. #endif
  267. BrowserContextDependencyManager::GetInstance()
  268. ->RegisterProfilePrefsForServices(pref_registry);
  269. }
  270. class BrowserContextImpl::WebLayerVariationsClient
  271. : public variations::VariationsClient {
  272. public:
  273. explicit WebLayerVariationsClient(content::BrowserContext* browser_context)
  274. : browser_context_(browser_context) {}
  275. ~WebLayerVariationsClient() override = default;
  276. bool IsOffTheRecord() const override {
  277. return browser_context_->IsOffTheRecord();
  278. }
  279. variations::mojom::VariationsHeadersPtr GetVariationsHeaders()
  280. const override {
  281. // As the embedder supplies the set of ids, the signed-in state should be
  282. // ignored. The value supplied (`is_signed_in`) doesn't matter as
  283. // VariationsIdsProvider is configured to ignore the signed in state.
  284. const bool is_signed_in = true;
  285. DCHECK_EQ(variations::VariationsIdsProvider::Mode::kIgnoreSignedInState,
  286. variations::VariationsIdsProvider::GetInstance()->mode());
  287. return variations::VariationsIdsProvider::GetInstance()
  288. ->GetClientDataHeaders(is_signed_in);
  289. }
  290. private:
  291. raw_ptr<content::BrowserContext> browser_context_;
  292. };
  293. variations::VariationsClient* BrowserContextImpl::GetVariationsClient() {
  294. if (!weblayer_variations_client_) {
  295. weblayer_variations_client_ =
  296. std::make_unique<WebLayerVariationsClient>(this);
  297. }
  298. return weblayer_variations_client_.get();
  299. }
  300. } // namespace weblayer