[BrowserManager](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) is a key class for Lacros. It manages the lifetime of lacros-chrome and its loading status, checks the versions and observes the component updater for future updates etc.. There are many responsibilities for [BrowserManager](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) class. Let's list up its roles. ## Overview [BrowserManager](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) is a singleton living in Ash. It's held as `g_instance` in browser_manager.cc and we can obtain its instance from [BrowserManager::Get](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=568;drc=6b569de26935ca8c8af6e78206f675beca37c27d). ## Lacros startup/shutdown [Start](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1012;drc=6b569de26935ca8c8af6e78206f675beca37c27d) triggers the lacros-chrome loading. It will [WaitForDeviceOwnerFetchedAndThen](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1681;drc=6b569de26935ca8c8af6e78206f675beca37c27d) runs lacros-chrome with creating a log file from [StartWithLogFile](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1052;drc=6b569de26935ca8c8af6e78206f675beca37c27d). Here, BrowserLoader creates a process for Lacros with [command line](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1138;drc=6b569de26935ca8c8af6e78206f675beca37c27d). It [CreateStartupData](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1138;drc=6b569de26935ca8c8af6e78206f675beca37c27d) to get start upda data. Before launching Lacros process, BrowserLoader sends an invitation for mojo connection from [CrosapiManager::SendInvitation](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1276;drc=6b569de26935ca8c8af6e78206f675beca37c27d) and then create lacros subprocess is launched [here](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1301;drc=6b569de26935ca8c8af6e78206f675beca37c27d). Lacros termination will be catched by the mojo disconnection. [OnMojoDisconnected](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1398;drc=6b569de26935ca8c8af6e78206f675beca37c27d) will call [HandleLacrosChromeTermination](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1404;drc=6b569de26935ca8c8af6e78206f675beca37c27d). Or we can [Shutdown](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=930;drc=6b569de26935ca8c8af6e78206f675beca37c27d) lacros from BrowserManager. First disable keep alive and then `lacros_process_.Terminate`. [HandleLacrosChromeTermination](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1404;drc=6b569de26935ca8c8af6e78206f675beca37c27d) will be called after this. ### States Here' are the lanching status for lacros: [State](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;l=416-452;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) has: * NOT_INITIALIZED * RELOADING * MOUNTING * UNAVAILABLE * STOPPED * CREATING_LOG_FILE * PRE_LAUNCHED * STARTING * RUNNING * TERMINATING ## Open Window There are many APIs in BrowserManager to create a window such as: * [NewWindow](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;l=156;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) * [OpenForFullRestore](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;l=161;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) * [OpenUrl](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.h;l=206;drc=6b569de26935ca8c8af6e78206f675beca37c27d) These APIs are for opening specified url or about://blank page in a new window. Also it handles tabs such as: * [NewTab](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_manager.h;l=196;drc=fe503e7168a2752a0dcf97c580b347a2fac094fb) * [SwitchToTab](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.h;l=217;drc=6b569de26935ca8c8af6e78206f675beca37c27d) * [HandleTabScrubbing](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.h;l=226;drc=6b569de26935ca8c8af6e78206f675beca37c27d) These APIs create [BrowserAction](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_action.h) and [PerformOrEnqueue](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=1937;drc=6b569de26935ca8c8af6e78206f675beca37c27d) it. If `state_` is ready, Perform the action. If it's starting or such, it pushes `action` to `pending_actions_` (enqueue). If not, it writes a log accordingly to why it can not do such action. ## Version Control [BrowserVersionServiceDelegate](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.cc;l=485;drc=6b569de26935ca8c8af6e78206f675beca37c27d) keeps track of the most recent lacros-chrome binary version loaded by [BrowserLoader](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/browser_loader.h). BrowserManager stores the version value in [`browser_version_`](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.h;l=745;drc=6b569de26935ca8c8af6e78206f675beca37c27d) and which of rootfs or stateful was picked in [`lacros_selection_`](https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:chrome/browser/ash/crosapi/browser_manager.h;l=739;drc=6b569de26935ca8c8af6e78206f675beca37c27d).