chromium/chrome/browser/profiles/profile_keyed_service_factory.h

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_PROFILES_PROFILE_KEYED_SERVICE_FACTORY_H_
#define CHROME_BROWSER_PROFILES_PROFILE_KEYED_SERVICE_FACTORY_H_

#include "components/keyed_service/content/browser_context_keyed_service_factory.h"

#include "chrome/browser/profiles/profile_selections.h"

namespace profiles::testing {
class ScopedProfileSelectionsForFactoryTesting;
}

// Detailed doc: "./profile_keyed_service_factory.md"
//
// ProfileKeyedServiceFactory provides a `Profile`-specific interface for
// `KeyedServiceFactory` under chrome/.
//
// When a KeyedServiceFactory builds a service for a "Profile A", it can
// actually return a service attached to a "Profile B". A common case is when a
// service of the original profile is reused by the Off-The-Record (OTR) profile
// (ProfileSelection::kRedirectedToOriginal()). Furthermore, a service can also
// be created for either only the original profile, or only the OTR profile.
//
// `ProfileKeyedServiceFactory' provides control over how services are created
// by default for non-regular profiles and how services are redirected across
// profiles. The defaults can be overridden with the `ProfileSelections`
// constructor parameter.
//
// - Example of a factory redirecting in incognito:
//
// class MyRedirectingKeyedServiceFactory: public ProfileKeyedServiceFactory {
//  private:
//   MyRedirectingKeyedServiceFactory()
//       : ProfileKeyedServiceFactory(
//             "MyRedirectingKeyedService",
//             ProfileSelections::BuildRedirectedInIncognito())
//             {}
//   }
// };
//
//
// - Example of a service that does not exist in OTR (default behavior):
//
// class MyDefaultKeyedServiceFactory: public ProfileKeyedServiceFactory {
//  private:
//   MyDefaultKeyedServiceFactory()
//       : ProfileKeyedServiceFactory("MyDefaultKeyedService") {}
//   }
// };
//
// Any change to this class should also be reflected on
// `RefcountedProfileKeyedServiceFactory`.
class ProfileKeyedServiceFactory : public BrowserContextKeyedServiceFactory {};

#endif  // CHROME_BROWSER_PROFILES_PROFILE_KEYED_SERVICE_FACTORY_H_