| // Copyright 2019 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_WEB_APPLICATIONS_APP_SHIM_REGISTRY_MAC_H_ |
| #define CHROME_BROWSER_WEB_APPLICATIONS_APP_SHIM_REGISTRY_MAC_H_ |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| |
| #include "base/files/file_path.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/no_destructor.h" |
| #include "base/values.h" |
| |
| class PrefService; |
| class PrefRegistrySimple; |
| |
| // This class is used to store information about which app shims have been |
| // installed for which profiles in local storage. This is used to: |
| // - Open the last active profile when an app shim is launched. |
| // - Populate the profile switcher menu in the app with only those profile |
| // for which the app is installed. |
| // - Only delete the app shim when it has been uninstalled for all profiles. |
| // All base::FilePath arguments to functions are expected to be full profile |
| // paths (e.g, the result of calling Profile::GetPath). |
| // |
| // This class should arguably be a extensions::ExtensionRegistryObserver. It |
| // is not (and instead is called by WebAppShortcutManager, which is one), |
| // because apps are in the process of being disentangled from extensions. |
| class AppShimRegistry { |
| public: |
| AppShimRegistry(const AppShimRegistry& other) = delete; |
| AppShimRegistry& operator=(const AppShimRegistry& other) = delete; |
| |
| static AppShimRegistry* Get(); |
| void RegisterLocalPrefs(PrefRegistrySimple* registry); |
| |
| // Query the profiles paths for which the specified app is installed. |
| std::set<base::FilePath> GetInstalledProfilesForApp( |
| const std::string& app_id) const; |
| |
| // Query the profiles paths that were last open in the app (which are the |
| // profiles to open when the app starts). |
| std::set<base::FilePath> GetLastActiveProfilesForApp( |
| const std::string& app_id) const; |
| |
| // Called when an app is installed for a profile (or any other action that |
| // would create an app shim, e.g: launching the shim). |
| void OnAppInstalledForProfile(const std::string& app_id, |
| const base::FilePath& profile); |
| |
| // Called when an app is uninstalled for a profile. Returns true if no |
| // profiles have this app installed anymore. |
| bool OnAppUninstalledForProfile(const std::string& app_id, |
| const base::FilePath& profile); |
| |
| // Called to save a list of the profiles that were last in use for an app. |
| // This is called for example when an app quits, providing the profiles that |
| // were in use at that time. |
| void SaveLastActiveProfilesForApp(const std::string& app_id, |
| std::set<base::FilePath> active_profiles); |
| |
| // Return all apps installed for the specified profile. Used to delete apps |
| // when a profile is removed. |
| std::set<std::string> GetInstalledAppsForProfile( |
| const base::FilePath& profile) const; |
| |
| // Called when the file and/or protocol handlers for an app are updated in a |
| // specific profile. Used to calculate the union of all handlers for a app |
| // when updating the app shim. |
| void SaveFileHandlersForAppAndProfile( |
| const std::string& app_id, |
| const base::FilePath& profile, |
| std::set<std::string> file_handler_extensions, |
| std::set<std::string> file_handler_mime_types); |
| void SaveProtocolHandlersForAppAndProfile( |
| const std::string& app_id, |
| const base::FilePath& profile, |
| std::set<std::string> protocol_handlers); |
| |
| struct HandlerInfo { |
| HandlerInfo(); |
| ~HandlerInfo(); |
| HandlerInfo(HandlerInfo&&); |
| HandlerInfo(const HandlerInfo&); |
| HandlerInfo& operator=(HandlerInfo&&); |
| HandlerInfo& operator=(const HandlerInfo&); |
| |
| bool IsEmpty() const { |
| return file_handler_extensions.empty() && |
| file_handler_mime_types.empty() && protocol_handlers.empty(); |
| } |
| |
| std::set<std::string> file_handler_extensions; |
| std::set<std::string> file_handler_mime_types; |
| std::set<std::string> protocol_handlers; |
| }; |
| |
| // Returns all the file and protocol handlers for the given app, keyed by |
| // profile path. |
| std::map<base::FilePath, HandlerInfo> GetHandlersForApp( |
| const std::string& app_id); |
| |
| // Helper functions for testing. |
| void SetPrefServiceAndUserDataDirForTesting( |
| PrefService* pref_service, |
| const base::FilePath& user_data_dir); |
| |
| // For logging and debug purposes. |
| base::Value::Dict AsDebugDict() const; |
| |
| protected: |
| friend class base::NoDestructor<AppShimRegistry>; |
| |
| AppShimRegistry() = default; |
| ~AppShimRegistry() = default; |
| |
| PrefService* GetPrefService() const; |
| base::FilePath GetFullProfilePath(const std::string& profile_path) const; |
| |
| // Helper function used by GetInstalledProfilesForApp and |
| // GetLastActiveProfilesForApp. |
| void GetProfilesSetForApp(const std::string& app_id, |
| const std::string& profiles_key, |
| std::set<base::FilePath>* profiles) const; |
| |
| // Update the local storage for |app_id|. Update |installed_profiles| and |
| // |last_active_profiles| only if they are non-nullptr. If |
| // |installed_profiles| is non-nullptr and empty, remove the entry for |
| // |app_id|. |
| void SetAppInfo(const std::string& app_id, |
| const std::set<base::FilePath>* installed_profiles, |
| const std::set<base::FilePath>* last_active_profiles, |
| const std::map<base::FilePath, HandlerInfo>* handlers); |
| |
| raw_ptr<PrefService> override_pref_service_ = nullptr; |
| base::FilePath override_user_data_dir_; |
| }; |
| |
| #endif // CHROME_BROWSER_WEB_APPLICATIONS_APP_SHIM_REGISTRY_MAC_H_ |