| // Copyright 2020 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_ASH_CROSAPI_BROWSER_UTIL_H_ |
| #define CHROME_BROWSER_ASH_CROSAPI_BROWSER_UTIL_H_ |
| |
| #include <string> |
| |
| #include "base/auto_reset.h" |
| #include "base/feature_list.h" |
| #include "base/strings/string_piece.h" |
| #include "base/time/time.h" |
| #include "chromeos/ash/components/standalone_browser/lacros_availability.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| class PrefRegistrySimple; |
| class PrefService; |
| |
| namespace aura { |
| class Window; |
| } // namespace aura |
| |
| namespace base { |
| class FilePath; |
| class Value; |
| class Version; |
| } // namespace base |
| |
| namespace component_updater { |
| class ComponentUpdateService; |
| } // namespace component_updater |
| |
| namespace version_info { |
| enum class Channel; |
| } // namespace version_info |
| |
| namespace policy { |
| class PolicyMap; |
| } // namespace policy |
| |
| namespace user_manager { |
| class User; |
| } // namespace user_manager |
| |
| // These methods are used by ash-chrome. |
| namespace crosapi { |
| namespace browser_util { |
| |
| // Indicates how the decision for the usage of Lacros has been made. |
| enum class LacrosLaunchSwitchSource { |
| // It is unknown yet if and how Lacros will be used. |
| kUnknown = 0, |
| // Either there were no policies, or the system had a special condition in |
| // which the policy got ignored and the user could have set the mode. |
| kPossiblySetByUser = 1, |
| // The Lacros usage was enforced by the user via #lacros-availability-ignore |
| // flag override. |
| kForcedByUser = 2, |
| // The Lacros usage was enforced using the policy. Note that in this case |
| // the policy might still not be used, but it is programmatically overridden |
| // and not by the user (e.g. special Googler user case). |
| kForcedByPolicy = 3 |
| }; |
| |
| // Represents the policy indicating which Lacros browser to launch, named |
| // LacrosSelection. The values shall be consistent with the controlling |
| // policy. Unlike `LacrosSelection` representing which lacros to select, |
| // `LacrosSelectionPolicy` represents how to decide which lacros to select. |
| // Stateful option from `LacrosSelection` is omitted due to a breakage risks in |
| // case of version skew (e.g. when the latest stateful Lacros available in omaha |
| // is older than the rootfs Lacros on the device). |
| enum class LacrosSelectionPolicy { |
| // Indicates that the user decides which Lacros browser to launch: rootfs or |
| // stateful. |
| kUserChoice = 0, |
| // Indicates that rootfs Lacros will always be launched. |
| kRootfs = 1, |
| }; |
| |
| // Represents the different options available for lacros selection. |
| enum class LacrosSelection { |
| kRootfs = 0, |
| kStateful = 1, |
| kDeployedLocally = 2, |
| kMaxValue = kDeployedLocally, |
| }; |
| |
| // Represents the values of the LacrosDataBackwardMigrationMode string enum |
| // policy. It controls what happens when we switch from Lacros back to Ash. |
| // The values shall be consistent with the policy description. |
| enum class LacrosDataBackwardMigrationMode { |
| // Indicates data backward migration is not performed. The Lacros folder is |
| // removed and Ash uses its existing state. |
| kNone, |
| // Not yet implemented. |
| kKeepNone, |
| // Not yet implemented. |
| kKeepSafeData, |
| // All data is migrated back from Lacros to Ash. |
| kKeepAll, |
| }; |
| |
| struct ComponentInfo { |
| // The client-side component name. |
| const char* const name; |
| // The CRX "extension" ID for component updater. |
| // Must match the Omaha console. |
| const char* const crx_id; |
| }; |
| |
| // Specifies the mode of migration. The values correspond to `MigratorDelegate` |
| // either being `CopyMigrator` or `MoveMigrator`. |
| enum class MigrationMode { |
| kCopy = 0, // Migrate using `CopyMigrator`. |
| kMove = 1, // Migrate using `MoveMigrator`. |
| }; |
| |
| // Specifies the mode Lacros is currently running. |
| // This enum is different from LacrosAvailability in the way that |
| // it describes the mode Lacros is running at a given point in time |
| // which can be influenced by multiple factors such as flags, |
| // while LacrosAvailability describes the policy that dictates how |
| // Lacros is supposed to be launched. |
| enum class LacrosMode { |
| // Indicates that Lacros is disabled. Ash is the only browser. |
| kDisabled = 0, |
| // Indicates that Lacros is enabled but Ash browser is the |
| // primary browser. |
| kSideBySide = 1, |
| // Indicates that Lacros is the primary browser. Ash is also available. |
| kPrimary = 2, |
| // Indicates that Lacros is the only available browser. |
| kOnly = 3, |
| }; |
| |
| extern const ComponentInfo kLacrosDogfoodCanaryInfo; |
| extern const ComponentInfo kLacrosDogfoodDevInfo; |
| extern const ComponentInfo kLacrosDogfoodBetaInfo; |
| extern const ComponentInfo kLacrosDogfoodStableInfo; |
| |
| BASE_DECLARE_FEATURE(kLacrosForSupervisedUsers); |
| |
| // The default update channel to leverage for Lacros when the channel is |
| // unknown. |
| extern const version_info::Channel kLacrosDefaultChannel; |
| |
| // A command-line switch that can also be set from chrome://flags for selecting |
| // the channel for Lacros updates. |
| extern const char kLacrosStabilitySwitch[]; |
| extern const char kLacrosStabilityChannelCanary[]; |
| extern const char kLacrosStabilityChannelDev[]; |
| extern const char kLacrosStabilityChannelBeta[]; |
| extern const char kLacrosStabilityChannelStable[]; |
| |
| // A command-line switch that can also be set from chrome://flags that chooses |
| // which selection of Lacros to use. |
| extern const char kLacrosSelectionSwitch[]; |
| extern const char kLacrosSelectionRootfs[]; |
| extern const char kLacrosSelectionStateful[]; |
| |
| // A command-line switch that is converted and set via the feature flag. |
| extern const char kLacrosAvailabilityPolicyInternalName[]; |
| extern const char kLacrosAvailabilityPolicySwitch[]; |
| extern const char kLacrosAvailabilityPolicyUserChoice[]; |
| extern const char kLacrosAvailabilityPolicyLacrosDisabled[]; |
| extern const char kLacrosAvailabilityPolicySideBySide[]; |
| extern const char kLacrosAvailabilityPolicyLacrosPrimary[]; |
| extern const char kLacrosAvailabilityPolicyLacrosOnly[]; |
| |
| // The internal name in about_flags.cc for the `LacrosDataBackwardMigrationMode` |
| // policy. |
| inline constexpr const char |
| kLacrosDataBackwardMigrationModePolicyInternalName[] = |
| "lacros-data-backward-migration-policy"; |
| |
| // The commandline flag name of `LacrosDataBackwardMigrationMode` policy. |
| // The value should be the policy value as defined just below. |
| inline constexpr const char kLacrosDataBackwardMigrationModePolicySwitch[] = |
| "lacros-data-backward-migration-policy"; |
| |
| // The values for LacrosDataBackwardMigrationMode, they must match the ones |
| // from LacrosDataBackwardMigrationMode.yaml. |
| inline constexpr const char kLacrosDataBackwardMigrationModePolicyNone[] = |
| "none"; |
| inline constexpr const char kLacrosDataBackwardMigrationModePolicyKeepNone[] = |
| "keep_none"; |
| inline constexpr const char |
| kLacrosDataBackwardMigrationModePolicyKeepSafeData[] = "keep_safe_data"; |
| inline constexpr const char kLacrosDataBackwardMigrationModePolicyKeepAll[] = |
| "keep_all"; |
| |
| // Boolean preference. Whether to launch lacros-chrome on login. |
| extern const char kLaunchOnLoginPref[]; |
| |
| // A boolean preference that records whether the user data dir has been cleared. |
| // We intentionally number this as we anticipate we might need to clear the user |
| // data dir multiple times. This preference tracks the breaking change |
| // introduced by account_manager in M91/M92 timeframe. |
| extern const char kClearUserDataDir1Pref[]; |
| |
| // A dictionary local state pref that records the last data version of |
| // lacros-chrome. |
| extern const char kDataVerPref[]; |
| |
| // Lacros' user data is backward compatible up until this version. |
| extern const char kRequiredDataVersion[]; |
| |
| // Registers user profile preferences related to the lacros-chrome binary. |
| void RegisterProfilePrefs(PrefRegistrySimple* registry); |
| |
| // Registers prefs used via local state PrefService. |
| void RegisterLocalStatePrefs(PrefRegistrySimple* registry); |
| |
| // Returns the user directory for lacros-chrome. |
| base::FilePath GetUserDataDir(); |
| |
| // Returns true if the Lacros feature is allowed to be enabled for primary user. |
| // This checks user type, chrome channel and enterprise policy. |
| bool IsLacrosAllowedToBeEnabled(); |
| |
| // Returns true if the Lacros feature is enabled for the primary user. |
| bool IsLacrosEnabled(); |
| |
| // Represents whether the function is being called before the Policy is |
| // initialized or not. |
| enum class PolicyInitState { |
| kBeforeInit, |
| kAfterInit, |
| }; |
| |
| // Similar to `IsLacrosEnabled()` but does not check if profile migration has |
| // been completed. This is to be used inside `BrowserDataMigrator`. Unlike |
| // `IsLacrosEnabled()` it can be called before the primary user profile is |
| // created. |
| // TODO(crbug.com/1265800): Refactor `IsLacrosEnabled()` and |
| // `IsLacrosEnabledForMigration()` to reduce duplicated code. |
| bool IsLacrosEnabledForMigration(const user_manager::User* user, |
| PolicyInitState policy_init_state); |
| |
| // Returns true if `ash::features::kLacrosSupport` flag is allowed. |
| bool IsLacrosSupportFlagAllowed(); |
| |
| // Returns true if Ash browser is enabled. Returns false iff Lacros is |
| // enabled and is the only browser. |
| bool IsAshWebBrowserEnabled(); |
| |
| // Similar to `IsAshWebBrowserEnabled()` but it is calleable even before primary |
| // profile and policy are initialized. |
| // TODO(crbug.com/1265800): Refactor to reduce code duplication with |
| // `IsAshWebBrowserEnabled()`. |
| bool IsAshWebBrowserEnabledForMigration(const user_manager::User* user, |
| PolicyInitState policy_init_state); |
| |
| // Returns true if the lacros should be used as a primary browser. |
| bool IsLacrosPrimaryBrowser(); |
| |
| // Similar to `IsLacrosPrimaryBrowser()` but is calleable even before primary |
| // profile and policy are initialized. |
| // TODO(crbug.com/1265800): Refactor to reduce code duplication with |
| // `IsLacrosPrimaryBrowser()`. |
| bool IsLacrosPrimaryBrowserForMigration(const user_manager::User* user, |
| PolicyInitState policy_init_state); |
| |
| // Returns the current mode Lacros is running. |
| // See LacrosMode definition for a full list of modes. |
| LacrosMode GetLacrosMode(); |
| |
| // Returns true if the lacros can be used as a primary browser |
| // for the current session. |
| // Note that IsLacrosPrimaryBrowser may return false, even if this returns |
| // true, specifically, the feature is disabled by user/policy. |
| bool IsLacrosPrimaryBrowserAllowed(); |
| |
| // Similar to `IsLacrosPrimaryBrowserAllowed()` but is calleable even before |
| // primary profile and policy are initialized. |
| // TODO(crbug.com/1265800): Refactor to reduce code duplication with |
| // `IsLacrosPrimaryBrowserAllowed()`. |
| bool IsLacrosPrimaryBrowserAllowedForMigration( |
| const user_manager::User* user, |
| ash::standalone_browser::LacrosAvailability lacros_availability); |
| |
| // Returns true if `ash::features::kLacrosPrimary` flag is allowed. |
| bool IsLacrosPrimaryFlagAllowed(); |
| |
| // Returns true if the lacros can be used as a only browser |
| // for the current session. |
| bool IsLacrosOnlyBrowserAllowed(); |
| |
| // Returns true if `ash::features::kLacrosOnly` flag is allowed. |
| bool IsLacrosOnlyFlagAllowed(); |
| |
| // Returns true if Lacros is allowed to launch and show a window. This can |
| // return false if the user is using multi-signin, which is mutually exclusive |
| // with Lacros. |
| bool IsLacrosAllowedToLaunch(); |
| |
| // Returns true if chrome apps should be routed through Lacros instead of ash. |
| bool IsLacrosChromeAppsEnabled(); |
| |
| // Returns true if Lacros is used in the web Kiosk session. |
| bool IsLacrosEnabledInWebKioskSession(); |
| |
| // Returns true if Lacros is used in the Chrome App Kiosk session. |
| bool IsLacrosEnabledInChromeKioskSession(); |
| |
| // Returns true if |window| is an exo ShellSurface window representing a Lacros |
| // browser. |
| bool IsLacrosWindow(const aura::Window* window); |
| |
| // Returns true if |metadata| is appropriately formatted, contains a lacros |
| // version, and that lacros versions supports the new backwards-incompatible |
| // account_manager logic. |
| bool DoesMetadataSupportNewAccountManager(base::Value* metadata); |
| |
| // Reads `kDataVerPref` and gets corresponding data version for `user_id_hash`. |
| // If no such version is registered yet, returns `Version` that is invalid. |
| // Should only be called on UI thread since it reads from `LocalState`. |
| base::Version GetDataVer(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Records data version for `user_id_hash` in `LocalState`. Should only be |
| // called on UI thread since it reads from `LocalState`. |
| void RecordDataVer(PrefService* local_state, |
| const std::string& user_id_hash, |
| const base::Version& version); |
| |
| // Checks if lacros' data directory needs to be wiped for backward incompatible |
| // data. |
| bool IsDataWipeRequired(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Exposed for testing. The arguments are passed to |
| // `IsDataWipeRequiredInternal()`. |
| bool IsDataWipeRequiredForTesting(base::Version data_version, |
| const base::Version& current_version, |
| const base::Version& required_version); |
| |
| // Gets the version of the rootfs lacros-chrome. By reading the metadata json |
| // file in the correct format. |
| base::Version GetRootfsLacrosVersionMayBlock( |
| const base::FilePath& version_file_path); |
| |
| // To be called at primary user login, to cache the policy value for lacros |
| // availability. |
| void CacheLacrosAvailability(const policy::PolicyMap& map); |
| |
| // To be called at primary user login, to cache the policy value for the |
| // LacrosDataBackwardMigrationMode policy. |
| void CacheLacrosDataBackwardMigrationMode(const policy::PolicyMap& map); |
| |
| // To be called at primary user login, to cache the policy value for |
| // LacrosSelection policy. The effective value of the policy does not |
| // change for the duration of the user session, so cached value shall be |
| // checked. |
| void CacheLacrosSelection(const policy::PolicyMap& map); |
| |
| // Returns cached value of LacrosSelection policy. See `CacheLacrosSelection` |
| // for details. |
| LacrosSelectionPolicy GetCachedLacrosSelectionPolicy(); |
| |
| // Returns lacros selection option according to LarcrosSelectionPolicy and |
| // lacros-selection flag. Returns nullopt if there is no preference. |
| absl::optional<LacrosSelection> DetermineLacrosSelection(); |
| |
| // Returns the lacros ComponentInfo for a given channel. |
| ComponentInfo GetLacrosComponentInfoForChannel(version_info::Channel channel); |
| |
| // Returns the ComponentInfo associated with the stateful lacros instance. |
| ComponentInfo GetLacrosComponentInfo(); |
| |
| // Returns the update channel associated with the given loaded lacros selection. |
| version_info::Channel GetLacrosSelectionUpdateChannel( |
| LacrosSelection selection); |
| |
| // Returns the currently installed version of lacros-chrome managed by the |
| // component updater. Will return an empty / invalid version if no lacros |
| // component is found. |
| base::Version GetInstalledLacrosComponentVersion( |
| const component_updater::ComponentUpdateService* component_update_service); |
| |
| // Exposed for testing. Sets lacros-availability cache for testing. |
| void SetCachedLacrosAvailabilityForTesting( |
| ash::standalone_browser::LacrosAvailability lacros_availability); |
| |
| // Exposed for testing. Returns the lacros integration suggested by the policy |
| // lacros-availability, modified by Finch flags and user flags as appropriate. |
| ash::standalone_browser::LacrosAvailability |
| GetCachedLacrosAvailabilityForTesting(); |
| |
| // GetCachedLacrosDataBackwardMigrationMode returns the cached value of the |
| // LacrosDataBackwardMigrationMode policy. |
| LacrosDataBackwardMigrationMode GetCachedLacrosDataBackwardMigrationMode(); |
| |
| // Clears the cached values for lacros availability policy. |
| void ClearLacrosAvailabilityCacheForTest(); |
| |
| // Clears the cached value for LacrosDataBackwardMigrationMode. |
| void ClearLacrosDataBackwardMigrationModeCacheForTest(); |
| |
| // Clears the cached value for LacrosSelection policy. |
| void ClearLacrosSelectionCacheForTest(); |
| |
| // Returns true if profile migraiton is enabled. If profile migration is |
| // enabled, the completion of it is required to enable Lacros. |
| bool IsProfileMigrationEnabled(); |
| |
| bool IsProfileMigrationEnabledWithUserAndPolicyInitState( |
| const user_manager::User* user, |
| PolicyInitState policy_init_state); |
| |
| // Returns true if the profile migration is enabled, but not yet completed. |
| bool IsProfileMigrationAvailable(); |
| |
| // Returns `MigrationMode::kMove` if LacrosOnly or `kLacrosMoveProfileMigration` |
| // is enabled and `MigrationMode::kCopy` otherwise. |
| MigrationMode GetMigrationMode(const user_manager::User* user, |
| PolicyInitState policy_init_state); |
| |
| // Returns true if either copy or move migration is completed. Used as a wrapper |
| // over `IsProfileMigrationCompletedForUser()`. |
| // TODO(crbug.com/1340438): This function is introduced to prevent running |
| // profile move migration for users who have already completed copy migration. |
| bool IsCopyOrMoveProfileMigrationCompletedForUser( |
| PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Checks if profile migration has been completed. This is reset if profile |
| // migration is initiated for example due to lacros data directory being wiped. |
| bool IsProfileMigrationCompletedForUser(PrefService* local_state, |
| const std::string& user_id_hash, |
| MigrationMode mode); |
| |
| // Sets the value of `kProfileMigrationCompletedForUserPref` or |
| // `kProfileMoveMigrationCompletedForUserPref` to be true for the user |
| // identified by `user_id_hash`, depending on `mode`. |
| void SetProfileMigrationCompletedForUser(PrefService* local_state, |
| const std::string& user_id_hash, |
| MigrationMode mode); |
| |
| // Clears the values of `kProfileMigrationCompletedForUserPref` and |
| // `kProfileMoveMigrationCompletedForUserPref` prefs for user identified by |
| // `user_id_hash`: |
| void ClearProfileMigrationCompletedForUser(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Sets the value of `kProfileMigrationCompletionTimeForUserPref` for the user |
| // identified by `user_id_hash` to the current time. |
| void SetProfileMigrationCompletionTimeForUser(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Gets the value of `kProfileMigrationCompletionTimeForUserPref` for the user |
| // identified by `user_id_hash`. |
| absl::optional<base::Time> GetProfileMigrationCompletionTimeForUser( |
| PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Clears the value of `kProfileMigrationCompletionTimeForUserPref` for the user |
| // identified by `user_id_hash`. |
| void ClearProfileMigrationCompletionTimeForUser( |
| PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Sets the value of `kProfileDataBackwardMigrationCompletedForUserPref` for the |
| // user identified by `user_id_hash`. |
| void SetProfileDataBackwardMigrationCompletedForUser( |
| PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Clears the value of `kProfileDataBackwardMigrationCompletedForUserPref` for |
| // the user identified by `user_id_hash`. |
| void ClearProfileDataBackwardMigrationCompletedForUser( |
| PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Makes `IsProfileMigrationCompletedForUser()` return true without actually |
| // updating Local State. It allows tests to avoid marking profile migration as |
| // completed by getting user_id_hash of the logged in user and updating |
| // g_browser_process->local_state() etc. |
| void SetProfileMigrationCompletedForTest(bool is_completed); |
| |
| // Indicate whether sync on Ash should be enabled for browser data. Sync should |
| // stop syncing browser items from Ash if Lacros is enabled and once browser |
| // data is migrated to Lacros making it safe to turn off web browser on |
| // Ash and sync for browser data. Only use after the primary user profile is set |
| // on UserManager since it calls `IsLacrosEnabled()`. |
| bool IsAshBrowserSyncEnabled(); |
| |
| // Returns who decided how Lacros should be used - or not: The User, the policy |
| // or another edge case. |
| LacrosLaunchSwitchSource GetLacrosLaunchSwitchSource(); |
| |
| // Allow unit tests to simulate that the readout of policies has taken place |
| // so that later DCHECKs do not fail. |
| void SetLacrosLaunchSwitchSourceForTest( |
| ash::standalone_browser::LacrosAvailability test_value); |
| |
| // Parses the string representation of LacrosSelection policy value into the |
| // enum value. Returns nullopt on unknown value. |
| absl::optional<LacrosSelectionPolicy> ParseLacrosSelectionPolicy( |
| base::StringPiece value); |
| |
| // Parses the string representation of LacrosDataBackwardMigrationMode policy |
| // value into the enum value. Returns nullopt on unknown value. |
| absl::optional<LacrosDataBackwardMigrationMode> |
| ParseLacrosDataBackwardMigrationMode(base::StringPiece value); |
| |
| // Returns the policy string representation from the given enum value. |
| base::StringPiece GetLacrosDataBackwardMigrationModeName( |
| LacrosDataBackwardMigrationMode value); |
| |
| // Returns the LacrosSelection policy value name from the given value. Returned |
| // StringPiece is guaranteed to never be invalidated. |
| base::StringPiece GetLacrosSelectionPolicyName(LacrosSelectionPolicy value); |
| |
| // Stores that "Go to files button" on the migration error screen is clicked. |
| void SetGotoFilesClicked(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Forgets that "Go to files button" on the migration error screen was clicked. |
| void ClearGotoFilesClicked(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Returns true if "Go to files button" on the migration error screen was |
| // clicked. |
| bool WasGotoFilesClicked(PrefService* local_state, |
| const std::string& user_id_hash); |
| |
| // Returns true if ash 1st party extension keep list should be enforced. |
| bool ShouldEnforceAshExtensionKeepList(); |
| |
| // Forces IsLacrosPrimaryBrowser() to return true or false for testing. |
| // Reset upon destruction of returned |base::AutoReset| object. |
| base::AutoReset<absl::optional<bool>> SetLacrosPrimaryBrowserForTest( |
| absl::optional<bool> value); |
| |
| } // namespace browser_util |
| } // namespace crosapi |
| |
| #endif // CHROME_BROWSER_ASH_CROSAPI_BROWSER_UTIL_H_ |