/ios/chrome/browser/optimization_guide/optimization_guide_service_factory.mm

https://github.com/chromium/chromium · Objective C++ · 121 lines · 93 code · 16 blank · 12 comment · 4 complexity · cffe3e6c48f286bb3597af547e98ab01 MD5 · raw file

  1. // Copyright 2021 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 "ios/chrome/browser/optimization_guide/optimization_guide_service_factory.h"
  5. #import "base/feature_list.h"
  6. #import "base/no_destructor.h"
  7. #import "components/keyed_service/ios/browser_state_dependency_manager.h"
  8. #import "components/optimization_guide/core/optimization_guide_features.h"
  9. #include "components/optimization_guide/core/prediction_manager.h"
  10. #import "ios/chrome/browser/application_context.h"
  11. #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
  12. #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
  13. #import "ios/chrome/browser/main/browser_list_factory.h"
  14. #include "ios/chrome/browser/optimization_guide/ios_chrome_hints_manager.h"
  15. #import "ios/chrome/browser/optimization_guide/optimization_guide_service.h"
  16. #import "services/network/public/cpp/shared_url_loader_factory.h"
  17. #if !defined(__has_feature) || !__has_feature(objc_arc)
  18. #error "This file requires ARC support."
  19. #endif
  20. namespace {
  21. std::unique_ptr<KeyedService> BuildOptimizationGuideService(
  22. web::BrowserState* context) {
  23. ChromeBrowserState* chrome_browser_state =
  24. ChromeBrowserState::FromBrowserState(context);
  25. ChromeBrowserState* original_browser_state =
  26. chrome_browser_state->GetOriginalChromeBrowserState();
  27. DCHECK(chrome_browser_state);
  28. // Regardless of whether the profile is off the record or not, initialize the
  29. // Optimization Guide with the database associated with the original profile.
  30. auto* proto_db_provider = original_browser_state->GetProtoDatabaseProvider();
  31. base::FilePath profile_path = original_browser_state->GetStatePath();
  32. base::WeakPtr<optimization_guide::OptimizationGuideStore> hint_store;
  33. base::WeakPtr<optimization_guide::OptimizationGuideStore>
  34. prediction_model_and_features_store;
  35. if (chrome_browser_state->IsOffTheRecord()) {
  36. OptimizationGuideService* original_ogs =
  37. OptimizationGuideServiceFactory::GetForBrowserState(
  38. original_browser_state);
  39. DCHECK(original_ogs);
  40. hint_store = original_ogs->GetHintsManager()->hint_store();
  41. if (optimization_guide::features::IsOptimizationTargetPredictionEnabled()) {
  42. prediction_model_and_features_store =
  43. original_ogs->GetPredictionManager()->model_and_features_store();
  44. }
  45. }
  46. return std::make_unique<OptimizationGuideService>(
  47. proto_db_provider, profile_path, chrome_browser_state->IsOffTheRecord(),
  48. GetApplicationContext()->GetApplicationLocale(), hint_store,
  49. prediction_model_and_features_store, chrome_browser_state->GetPrefs(),
  50. BrowserListFactory::GetForBrowserState(chrome_browser_state),
  51. chrome_browser_state->GetSharedURLLoaderFactory(),
  52. base::BindOnce(
  53. [](ChromeBrowserState* browser_state) {
  54. return BackgroundDownloadServiceFactory::GetForBrowserState(
  55. browser_state);
  56. },
  57. // base::Unretained is safe here because the callback is owned
  58. // by PredictionManager which is a transitively owned by
  59. // OptimizationGuideService (a keyed service that is
  60. // killed before ChromeBrowserState is deallocated).
  61. base::Unretained(chrome_browser_state)));
  62. }
  63. }
  64. // static
  65. OptimizationGuideService* OptimizationGuideServiceFactory::GetForBrowserState(
  66. ChromeBrowserState* context) {
  67. if (!optimization_guide::features::IsOptimizationHintsEnabled())
  68. return nullptr;
  69. return static_cast<OptimizationGuideService*>(
  70. GetInstance()->GetServiceForBrowserState(context, /*create=*/true));
  71. }
  72. // static
  73. OptimizationGuideServiceFactory*
  74. OptimizationGuideServiceFactory::GetInstance() {
  75. static base::NoDestructor<OptimizationGuideServiceFactory> instance;
  76. return instance.get();
  77. }
  78. OptimizationGuideServiceFactory::OptimizationGuideServiceFactory()
  79. : BrowserStateKeyedServiceFactory(
  80. "OptimizationGuideService",
  81. BrowserStateDependencyManager::GetInstance()) {
  82. DependsOn(BackgroundDownloadServiceFactory::GetInstance());
  83. DependsOn(BrowserListFactory::GetInstance());
  84. }
  85. OptimizationGuideServiceFactory::~OptimizationGuideServiceFactory() = default;
  86. // static
  87. BrowserStateKeyedServiceFactory::TestingFactory
  88. OptimizationGuideServiceFactory::GetDefaultFactory() {
  89. return base::BindRepeating(&BuildOptimizationGuideService);
  90. }
  91. std::unique_ptr<KeyedService>
  92. OptimizationGuideServiceFactory::BuildServiceInstanceFor(
  93. web::BrowserState* context) const {
  94. return BuildOptimizationGuideService(context);
  95. }
  96. bool OptimizationGuideServiceFactory::ServiceIsCreatedWithBrowserState() const {
  97. return optimization_guide::features::IsOptimizationHintsEnabled();
  98. }
  99. web::BrowserState* OptimizationGuideServiceFactory::GetBrowserStateToUse(
  100. web::BrowserState* context) const {
  101. return GetBrowserStateOwnInstanceInIncognito(context);
  102. }
  103. bool OptimizationGuideServiceFactory::ServiceIsNULLWhileTesting() const {
  104. return true;
  105. }