blob: 731378a922a0f031c8dd38db1e15a3a7f5d12896 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_PROFILE_MODEL_PROFILE_MANAGER_IOS_IMPL_H_
#define IOS_CHROME_BROWSER_PROFILE_MODEL_PROFILE_MANAGER_IOS_IMPL_H_
#include <map>
#include <memory>
#include <string>
#include <string_view>
#include "base/feature_list.h"
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "ios/chrome/browser/profile/model/profile_deleter_ios.h"
#include "ios/chrome/browser/shared/model/profile/mutable_profile_attributes_storage_ios.h"
#include "ios/chrome/browser/shared/model/profile/profile_ios.h"
#include "ios/chrome/browser/shared/model/profile/profile_manager_ios.h"
#include "ios/chrome/browser/shared/model/profile/profile_manager_observer_ios.h"
class PrefService;
// ProfileManagerIOS implementation.
class ProfileManagerIOSImpl : public ProfileManagerIOS,
public ProfileIOS::Delegate {
public:
// For ProfileIOS::Delegate methods.
using CreationMode = ProfileIOS::CreationMode;
// Constructs the ProfileManagerIOSImpl with a pointer to the local state's
// PrefService and with the path to the directory containing the Profiles'
// data.
ProfileManagerIOSImpl(PrefService* local_state,
const base::FilePath& data_dir);
ProfileManagerIOSImpl(const ProfileManagerIOSImpl&) = delete;
ProfileManagerIOSImpl& operator=(const ProfileManagerIOSImpl&) = delete;
~ProfileManagerIOSImpl() override;
// ProfileManagerIOS:
void PrepareForDestruction() override;
void AddObserver(ProfileManagerObserverIOS* observer) override;
void RemoveObserver(ProfileManagerObserverIOS* observer) override;
ProfileIOS* GetProfileWithName(std::string_view name) override;
std::vector<ProfileIOS*> GetLoadedProfiles() const override;
bool HasProfileWithName(std::string_view name) const override;
bool CanCreateProfileWithName(std::string_view name) const override;
std::string ReserveNewProfileName() override;
bool CanDeleteProfileWithName(std::string_view name) const override;
bool LoadProfileAsync(std::string_view name,
ProfileLoadedCallback initialized_callback,
ProfileLoadedCallback created_callback) override;
bool CreateProfileAsync(std::string_view name,
ProfileLoadedCallback initialized_callback,
ProfileLoadedCallback created_callback) override;
void MarkProfileForDeletion(std::string_view name) override;
bool IsProfileMarkedForDeletion(std::string_view name) const override;
void PurgeProfilesMarkedForDeletion(base::OnceClosure callback) override;
ProfileAttributesStorageIOS* GetProfileAttributesStorage() override;
base::FilePath GetProfilePath(std::string_view name) override;
// ProfileIOS::Delegate:
void OnProfileCreationStarted(ProfileIOS* profile,
CreationMode creation_mode) override;
void OnProfileCreationFinished(ProfileIOS* profile,
CreationMode creation_mode,
bool is_new_profile,
bool success) override;
private:
class ProfileInfo;
// Represents how CreateOrLoadProfile(...) should behave if the profile
// does not exists on disk yet.
enum class LoadOrCreatePolicy {
kLoadOnly,
kCreateIfNecessary,
};
// Creates or loads the profile known by `name`. Helper function used to
// implement both `CreateProfileAsync()` and `LoadProfileAsync()`. The
// callback parameters have the same meaning as those two methods. If
// the profile does not exists on disk and `policy` is `kLoadOnly` then
// the method will fail and return false, otherwise it will create the
// profile if necessary and always succeed.
bool CreateOrLoadProfile(std::string_view name,
LoadOrCreatePolicy policy,
ProfileLoadedCallback initialized_callback,
ProfileLoadedCallback created_callback);
// Final initialization of the profile.
void DoFinalInit(ProfileIOS* profile);
void DoFinalInitForServices(ProfileIOS* profile);
// Invoked when a profile deletion attempts complete with success or not.
// Will invoke `closure` after updating the ProfileAttributesStorageIOS.
void OnProfileDeletionComplete(base::OnceClosure closure,
const std::string& profile_name,
ProfileDeleterIOS::Result result);
// Returns a ScopedProfileKeepAliveIOS for `info` (which may be null if
// the profile could not be loaded).
ScopedProfileKeepAliveIOS CreateScopedProfileKeepAlive(ProfileInfo* info);
// Called when a ScopedProfileKeepAliveIOS is destroyed. Will unload the
// profile if no other ScopedProfileKeepAliveIOS reference it.
void MaybeUnloadProfile(std::string_view name);
SEQUENCE_CHECKER(sequence_checker_);
// The PrefService storing the local state.
raw_ptr<PrefService> local_state_;
// The path to the directory where the Profiles' data are stored.
const base::FilePath profile_data_dir_;
// Holds the Profile instances that this instance has created.
std::map<std::string, ProfileInfo, std::less<>> profiles_map_;
// Holds the ScopedProfileKeepAliveIOS for the profiles that are loading.
std::map<std::string, ScopedProfileKeepAliveIOS, std::less<>>
loading_profiles_map_;
// The owned ProfileAttributesStorageIOS instance.
MutableProfileAttributesStorageIOS profile_attributes_storage_;
// The owned ProfileDeleterIOS instance.
ProfileDeleterIOS profile_deleter_;
// The list of registered observers.
base::ObserverList<ProfileManagerObserverIOS, true> observers_;
// Record whether the manager will soon be destroyed and loading
// profile is now forbidden.
bool will_be_destroyed_ = false;
// Factory for weak pointers.
base::WeakPtrFactory<ProfileManagerIOSImpl> weak_ptr_factory_{this};
};
#endif // IOS_CHROME_BROWSER_PROFILE_MODEL_PROFILE_MANAGER_IOS_IMPL_H_