| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifdef UNSAFE_BUFFERS_BUILD |
| // TODO(crbug.com/40285824): Remove this and convert code to safer constructs. |
| #pragma allow_unsafe_buffers |
| #endif |
| |
| #include "chrome/browser/ash/crosapi/crosapi_util.h" |
| |
| #include <sys/mman.h> |
| |
| #include <optional> |
| #include <string> |
| |
| #include "ash/components/arc/arc_util.h" |
| #include "ash/constants/ash_features.h" |
| #include "ash/constants/ash_pref_names.h" |
| #include "ash/constants/ash_switches.h" |
| #include "base/command_line.h" |
| #include "base/files/file_util.h" |
| #include "base/files/platform_file.h" |
| #include "chrome/browser/apps/app_service/extension_apps_utils.h" |
| #include "chrome/browser/ash/crosapi/browser_util.h" |
| #include "chrome/browser/ash/crosapi/browser_version_service_ash.h" |
| #include "chrome/browser/ash/crosapi/environment_provider.h" |
| #include "chrome/browser/ash/crosapi/field_trial_service_ash.h" |
| #include "chrome/browser/ash/crosapi/hosted_app_util.h" |
| #include "chrome/browser/ash/crosapi/idle_service_ash.h" |
| #include "chrome/browser/ash/crosapi/native_theme_service_ash.h" |
| #include "chrome/browser/ash/crosapi/resource_manager_ash.h" |
| #include "chrome/browser/ash/drive/file_system_util.h" |
| #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" |
| #include "chrome/browser/ash/policy/core/device_local_account_policy_broker.h" |
| #include "chrome/browser/ash/policy/core/device_local_account_policy_service.h" |
| #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h" |
| #include "chrome/browser/ash/policy/handlers/device_name_policy_handler.h" |
| #include "chrome/browser/ash/settings/device_settings_service.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/browser_process_platform_part.h" |
| #include "chrome/browser/extensions/extension_keeplist_chromeos.h" |
| #include "chrome/browser/metrics/metrics_reporting_state.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/speech/tts_crosapi_util.h" |
| #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" |
| #include "chrome/browser/web_applications/preinstalled_web_app_utils.h" |
| #include "chrome/browser/web_applications/web_app_utils.h" |
| #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h" |
| #include "chromeos/ash/components/browser_context_helper/browser_context_types.h" |
| #include "chromeos/ash/components/channel/channel_info.h" |
| #include "chromeos/ash/components/install_attributes/install_attributes.h" |
| #include "chromeos/ash/components/settings/cros_settings.h" |
| #include "chromeos/ash/components/settings/cros_settings_names.h" |
| #include "chromeos/ash/components/settings/cros_settings_provider.h" |
| #include "chromeos/ash/components/system/statistics_provider.h" |
| #include "chromeos/components/cdm_factory_daemon/mojom/browser_cdm_factory.mojom.h" |
| #include "chromeos/components/in_session_auth/mojom/in_session_auth.mojom.h" |
| #include "chromeos/components/mahi/public/cpp/mahi_manager.h" |
| #include "chromeos/components/mgs/managed_guest_session_utils.h" |
| #include "chromeos/components/payments/mojom/payment_app.mojom.h" |
| #include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h" |
| #include "chromeos/components/sensors/mojom/cros_sensor_service.mojom.h" |
| #include "chromeos/constants/chromeos_features.h" |
| #include "chromeos/constants/devicetype.h" |
| #include "chromeos/crosapi/cpp/crosapi_constants.h" |
| #include "chromeos/crosapi/mojom/app_service.mojom.h" |
| #include "chromeos/crosapi/mojom/app_window_tracker.mojom.h" |
| #include "chromeos/crosapi/mojom/arc.mojom.h" |
| #include "chromeos/crosapi/mojom/audio_service.mojom.h" |
| #include "chromeos/crosapi/mojom/authentication.mojom.h" |
| #include "chromeos/crosapi/mojom/automation.mojom.h" |
| #include "chromeos/crosapi/mojom/browser_app_instance_registry.mojom.h" |
| #include "chromeos/crosapi/mojom/browser_service.mojom.h" |
| #include "chromeos/crosapi/mojom/cec_private.mojom.h" |
| #include "chromeos/crosapi/mojom/cert_database.mojom.h" |
| #include "chromeos/crosapi/mojom/cert_provisioning.mojom.h" |
| #include "chromeos/crosapi/mojom/chaps_service.mojom.h" |
| #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h" |
| #include "chromeos/crosapi/mojom/clipboard.mojom.h" |
| #include "chromeos/crosapi/mojom/clipboard_history.mojom.h" |
| #include "chromeos/crosapi/mojom/content_protection.mojom.h" |
| #include "chromeos/crosapi/mojom/cros_display_config.mojom.h" |
| #include "chromeos/crosapi/mojom/debug_interface.mojom.h" |
| #include "chromeos/crosapi/mojom/desk.mojom.h" |
| #include "chromeos/crosapi/mojom/desk_profiles.mojom.h" |
| #include "chromeos/crosapi/mojom/desk_template.mojom.h" |
| #include "chromeos/crosapi/mojom/device_attributes.mojom.h" |
| #include "chromeos/crosapi/mojom/device_local_account_extension_service.mojom.h" |
| #include "chromeos/crosapi/mojom/device_oauth2_token_service.mojom.h" |
| #include "chromeos/crosapi/mojom/device_settings_service.mojom.h" |
| #include "chromeos/crosapi/mojom/diagnostics_service.mojom.h" |
| #include "chromeos/crosapi/mojom/digital_goods.mojom.h" |
| #include "chromeos/crosapi/mojom/dlp.mojom.h" |
| #include "chromeos/crosapi/mojom/document_scan.mojom.h" |
| #include "chromeos/crosapi/mojom/download_controller.mojom.h" |
| #include "chromeos/crosapi/mojom/download_status_updater.mojom.h" |
| #include "chromeos/crosapi/mojom/drive_integration_service.mojom.h" |
| #include "chromeos/crosapi/mojom/echo_private.mojom.h" |
| #include "chromeos/crosapi/mojom/editor_panel.mojom.h" |
| #include "chromeos/crosapi/mojom/embedded_accessibility_helper.mojom.h" |
| #include "chromeos/crosapi/mojom/emoji_picker.mojom.h" |
| #include "chromeos/crosapi/mojom/extension_info_private.mojom.h" |
| #include "chromeos/crosapi/mojom/extension_printer.mojom.h" |
| #include "chromeos/crosapi/mojom/eye_dropper.mojom.h" |
| #include "chromeos/crosapi/mojom/feedback.mojom.h" |
| #include "chromeos/crosapi/mojom/file_change_service_bridge.mojom.h" |
| #include "chromeos/crosapi/mojom/file_manager.mojom.h" |
| #include "chromeos/crosapi/mojom/file_system_access_cloud_identifier.mojom.h" |
| #include "chromeos/crosapi/mojom/file_system_provider.mojom.h" |
| #include "chromeos/crosapi/mojom/firewall_hole.mojom.h" |
| #include "chromeos/crosapi/mojom/force_installed_tracker.mojom.h" |
| #include "chromeos/crosapi/mojom/full_restore.mojom.h" |
| #include "chromeos/crosapi/mojom/fullscreen_controller.mojom.h" |
| #include "chromeos/crosapi/mojom/geolocation.mojom.h" |
| #include "chromeos/crosapi/mojom/guest_os_sk_forwarder.mojom.h" |
| #include "chromeos/crosapi/mojom/holding_space_service.mojom.h" |
| #include "chromeos/crosapi/mojom/identity_manager.mojom.h" |
| #include "chromeos/crosapi/mojom/image_writer.mojom.h" |
| #include "chromeos/crosapi/mojom/input_methods.mojom.h" |
| #include "chromeos/crosapi/mojom/kerberos_in_browser.mojom.h" |
| #include "chromeos/crosapi/mojom/keystore_service.mojom.h" |
| #include "chromeos/crosapi/mojom/kiosk_session_service.mojom.h" |
| #include "chromeos/crosapi/mojom/lacros_shelf_item_tracker.mojom.h" |
| #include "chromeos/crosapi/mojom/launcher_search.mojom.h" |
| #include "chromeos/crosapi/mojom/local_printer.mojom.h" |
| #include "chromeos/crosapi/mojom/login.mojom.h" |
| #include "chromeos/crosapi/mojom/login_screen_storage.mojom.h" |
| #include "chromeos/crosapi/mojom/login_state.mojom.h" |
| #include "chromeos/crosapi/mojom/magic_boost.mojom.h" |
| #include "chromeos/crosapi/mojom/mahi.mojom.h" |
| #include "chromeos/crosapi/mojom/media_app.mojom.h" |
| #include "chromeos/crosapi/mojom/media_ui.mojom.h" |
| #include "chromeos/crosapi/mojom/message_center.mojom.h" |
| #include "chromeos/crosapi/mojom/metrics.mojom.h" |
| #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" |
| #include "chromeos/crosapi/mojom/multi_capture_service.mojom.h" |
| #include "chromeos/crosapi/mojom/network_change.mojom.h" |
| #include "chromeos/crosapi/mojom/network_settings_service.mojom.h" |
| #include "chromeos/crosapi/mojom/networking_attributes.mojom.h" |
| #include "chromeos/crosapi/mojom/networking_private.mojom.h" |
| #include "chromeos/crosapi/mojom/nonclosable_app_toast_service.mojom.h" |
| #include "chromeos/crosapi/mojom/one_drive_integration_service.mojom.h" |
| #include "chromeos/crosapi/mojom/one_drive_notification_service.mojom.h" |
| #include "chromeos/crosapi/mojom/parent_access.mojom.h" |
| #include "chromeos/crosapi/mojom/passkeys.mojom.h" |
| #include "chromeos/crosapi/mojom/policy_service.mojom.h" |
| #include "chromeos/crosapi/mojom/power.mojom.h" |
| #include "chromeos/crosapi/mojom/prefs.mojom.h" |
| #include "chromeos/crosapi/mojom/print_preview_cros.mojom.h" |
| #include "chromeos/crosapi/mojom/printing_metrics.mojom.h" |
| #include "chromeos/crosapi/mojom/probe_service.mojom.h" |
| #include "chromeos/crosapi/mojom/remoting.mojom.h" |
| #include "chromeos/crosapi/mojom/screen_ai_downloader.mojom.h" |
| #include "chromeos/crosapi/mojom/screen_manager.mojom.h" |
| #include "chromeos/crosapi/mojom/select_file.mojom.h" |
| #include "chromeos/crosapi/mojom/sharesheet.mojom.h" |
| #include "chromeos/crosapi/mojom/smart_reader.mojom.h" |
| #include "chromeos/crosapi/mojom/speech_recognition.mojom.h" |
| #include "chromeos/crosapi/mojom/structured_metrics_service.mojom.h" |
| #include "chromeos/crosapi/mojom/suggestion_service.mojom.h" |
| #include "chromeos/crosapi/mojom/sync.mojom.h" |
| #include "chromeos/crosapi/mojom/system_display.mojom.h" |
| #include "chromeos/crosapi/mojom/task_manager.mojom.h" |
| #include "chromeos/crosapi/mojom/telemetry_diagnostic_routine_service.mojom.h" |
| #include "chromeos/crosapi/mojom/telemetry_event_service.mojom.h" |
| #include "chromeos/crosapi/mojom/telemetry_management_service.mojom.h" |
| #include "chromeos/crosapi/mojom/test_controller.mojom.h" |
| #include "chromeos/crosapi/mojom/timezone.mojom.h" |
| #include "chromeos/crosapi/mojom/trusted_vault.mojom.h" |
| #include "chromeos/crosapi/mojom/tts.mojom.h" |
| #include "chromeos/crosapi/mojom/url_handler.mojom.h" |
| #include "chromeos/crosapi/mojom/video_capture.mojom.h" |
| #include "chromeos/crosapi/mojom/video_conference.mojom.h" |
| #include "chromeos/crosapi/mojom/virtual_keyboard.mojom.h" |
| #include "chromeos/crosapi/mojom/volume_manager.mojom.h" |
| #include "chromeos/crosapi/mojom/vpn_extension_observer.mojom.h" |
| #include "chromeos/crosapi/mojom/vpn_service.mojom.h" |
| #include "chromeos/crosapi/mojom/wallpaper.mojom.h" |
| #include "chromeos/crosapi/mojom/web_app_service.mojom.h" |
| #include "chromeos/crosapi/mojom/web_kiosk_service.mojom.h" |
| #include "chromeos/crosapi/mojom/web_page_info.mojom.h" |
| #include "chromeos/services/chromebox_for_meetings/public/mojom/cfm_service_manager.mojom.h" |
| #include "chromeos/services/machine_learning/public/cpp/ml_switches.h" |
| #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h" |
| #include "chromeos/startup/startup.h" |
| #include "chromeos/version/version_loader.h" |
| #include "components/account_id/account_id.h" |
| #include "components/account_manager_core/account.h" |
| #include "components/account_manager_core/account_manager_util.h" |
| #include "components/metrics/metrics_pref_names.h" |
| #include "components/metrics/metrics_service.h" |
| #include "components/metrics_services_manager/metrics_services_manager.h" |
| #include "components/policy/core/common/cloud/cloud_policy_constants.h" |
| #include "components/policy/core/common/cloud/cloud_policy_core.h" |
| #include "components/policy/core/common/cloud/cloud_policy_manager.h" |
| #include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" |
| #include "components/policy/core/common/cloud/component_cloud_policy_service.h" |
| #include "components/policy/core/common/values_util.h" |
| #include "components/policy/policy_constants.h" |
| #include "components/policy/proto/device_management_backend.pb.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/ukm/ukm_service.h" |
| #include "components/user_manager/user.h" |
| #include "components/user_manager/user_manager.h" |
| #include "components/user_manager/user_type.h" |
| #include "components/variations/limited_entropy_mode_gate.h" |
| #include "components/variations/service/limited_entropy_synthetic_trial.h" |
| #include "components/version_info/version_info.h" |
| #include "content/public/common/content_switches.h" |
| #include "device/bluetooth/floss/floss_features.h" |
| #include "media/base/media_switches.h" |
| #include "media/capture/mojom/video_capture.mojom.h" |
| #include "media/mojo/mojom/stable/stable_video_decoder.mojom.h" |
| #include "printing/buildflags/buildflags.h" |
| #include "services/device/public/mojom/hid.mojom.h" |
| #include "services/media_session/public/mojom/audio_focus.mojom.h" |
| #include "services/media_session/public/mojom/media_controller.mojom.h" |
| #include "ui/accessibility/accessibility_features.h" |
| #include "ui/base/ui_base_features.h" |
| #include "ui/gfx/switches.h" |
| |
| using MojoOptionalBool = crosapi::mojom::DeviceSettings::OptionalBool; |
| |
| namespace crosapi { |
| namespace browser_util { |
| |
| namespace { |
| |
| constexpr std::string_view kAshCapabilities[] = { |
| // Capability to support reloading the lacros browser on receiving a |
| // notification that the browser component was successfully updated. |
| "crbug/1237235", |
| |
| // Capability to support shared_storage in prefs. |
| "b/231890240", |
| |
| // Capability to register observers for extension controlled prefs via the |
| // prefs api. |
| "crbug/1334985", |
| |
| // Capability to pass testing ash extension keeplist data via ash |
| // commandline switch. |
| "crbug/1409199", |
| |
| // Capability to accept a package ID for installation without a parsing bug. |
| // Once Ash and Lacros are both past M124, then we can remove this |
| // capability. |
| "b/304680258", |
| |
| // Bug fix to launch tabbed web app windows in new windows when requested. |
| // We can remove this capability once Ash and Lacros are both past M122. |
| "crbug/1490336", |
| |
| // Support feedback dialog ai flow. |
| // TODO(crbug.com/40941303): Remove this capability once Ash and Lacros are |
| // both |
| // past M123. |
| "crbug/1501057", |
| |
| // Support opening installed apps when requesting installation in |
| // AppInstallServiceAsh. |
| // TODO(b/326167458): Remove this capability once Ash and Lacros are both |
| // past M127. |
| "b/326167458", |
| |
| // Support showing the Ash-driven App Install Dialog when requesting |
| // installation in AppInstallServiceAsh. |
| // TODO(b/331715712): Remove this capability once Ash and Lacros are both |
| // past M128. |
| "b/331715712" |
| |
| // Support unknown package types when requesting app installation in |
| // AppInstallServiceAsh. |
| // TODO(b/339548766): Remove this capability once Ash and Lacros are both |
| // past M129. |
| "b/339106891" |
| |
| // Entries added to this list must record the current milestone + 3 with a |
| // TODO for removal. |
| }; |
| |
| policy::UserCloudPolicyManagerAsh* GetUserCloudPolicyManager( |
| const user_manager::User& user) { |
| DCHECK(user.HasGaiaAccount()); |
| Profile* profile = Profile::FromBrowserContext( |
| ash::BrowserContextHelper::Get()->GetBrowserContextByUser(&user)); |
| DCHECK(profile); |
| return profile->GetUserCloudPolicyManagerAsh(); |
| } |
| |
| policy::DeviceLocalAccountPolicyBroker* GetDeviceLocalAccountPolicyBroker( |
| const user_manager::User& user) { |
| DCHECK(user.IsDeviceLocalAccount()); |
| policy::DeviceLocalAccountPolicyService* policy_service = |
| g_browser_process->platform_part() |
| ->browser_policy_connector_ash() |
| ->GetDeviceLocalAccountPolicyService(); |
| // `policy_service` can be nullptr, e.g. in unit tests. |
| return policy_service ? policy_service->GetBrokerForUser( |
| user.GetAccountId().GetUserEmail()) |
| : nullptr; |
| } |
| |
| std::optional<std::string> GetDeviceAccountPolicyForUser( |
| const user_manager::User& user) { |
| policy::CloudPolicyCore* core = GetCloudPolicyCoreForUser(user); |
| if (!core) { |
| return std::nullopt; |
| } |
| const policy::CloudPolicyStore* store = core->store(); |
| if (!store || !store->policy_fetch_response()) { |
| return std::nullopt; |
| } |
| return store->policy_fetch_response()->SerializeAsString(); |
| } |
| |
| std::optional<policy::ComponentPolicyMap> |
| GetDeviceAccountComponentPolicyForUser(const user_manager::User& user) { |
| policy::ComponentCloudPolicyService* component_policy_service = |
| GetComponentCloudPolicyServiceForUser(user); |
| if (!component_policy_service) { |
| return std::nullopt; |
| } |
| if (component_policy_service->component_policy_map().empty()) { |
| return std::nullopt; |
| } |
| return policy::CopyComponentPolicyMap( |
| component_policy_service->component_policy_map()); |
| } |
| |
| // Returns the vector containing policy data of the device account. In case of |
| // an error, returns nullopt. |
| std::optional<std::vector<uint8_t>> GetDeviceAccountPolicy() { |
| if (!user_manager::UserManager::IsInitialized()) { |
| LOG(ERROR) << "User not initialized."; |
| return std::nullopt; |
| } |
| const auto* primary_user = user_manager::UserManager::Get()->GetPrimaryUser(); |
| if (!primary_user) { |
| LOG(ERROR) << "No primary user."; |
| return std::nullopt; |
| } |
| std::string policy_data = |
| GetDeviceAccountPolicyForUser(*primary_user).value_or(std::string()); |
| return std::vector<uint8_t>(policy_data.begin(), policy_data.end()); |
| } |
| |
| // Returns the map containing component policy for each namespace. The values |
| // represent the JSON policy for the namespace. |
| std::optional<policy::ComponentPolicyMap> GetDeviceAccountComponentPolicy() { |
| if (!user_manager::UserManager::IsInitialized()) { |
| LOG(ERROR) << "User not initialized."; |
| return std::nullopt; |
| } |
| const auto* primary_user = user_manager::UserManager::Get()->GetPrimaryUser(); |
| if (!primary_user) { |
| LOG(ERROR) << "No primary user."; |
| return std::nullopt; |
| } |
| return GetDeviceAccountComponentPolicyForUser(*primary_user); |
| } |
| |
| bool GetIsCurrentUserOwner() { |
| return user_manager::UserManager::Get()->IsCurrentUserOwner(); |
| } |
| |
| bool IsCurrentUserEphemeral() { |
| const user_manager::UserManager* const user_manager = |
| user_manager::UserManager::Get(); |
| const user_manager::User* const user = user_manager->GetPrimaryUser(); |
| return user_manager->IsEphemeralUser(user); |
| } |
| |
| bool GetUseCupsForPrinting() { |
| #if BUILDFLAG(USE_CUPS) |
| return true; |
| #else |
| return false; |
| #endif // BUILDFLAG(USE_CUPS) |
| } |
| |
| // Returns the device specific data needed for Lacros. |
| mojom::DevicePropertiesPtr GetDeviceProperties() { |
| mojom::DevicePropertiesPtr result = mojom::DeviceProperties::New(); |
| result->device_dm_token = ""; |
| |
| if (ash::DeviceSettingsService::IsInitialized()) { |
| const enterprise_management::PolicyData* policy_data = |
| ash::DeviceSettingsService::Get()->policy_data(); |
| |
| if (policy_data && policy_data->has_request_token()) { |
| result->device_dm_token = policy_data->request_token(); |
| } |
| |
| if (policy_data && !policy_data->device_affiliation_ids().empty()) { |
| const auto& ids = policy_data->device_affiliation_ids(); |
| result->device_affiliation_ids = {ids.begin(), ids.end()}; |
| } |
| } |
| |
| result->is_arc_available = arc::IsArcAvailable(); |
| result->is_tablet_form_factor = ash::switches::IsTabletFormFactor(); |
| |
| policy::BrowserPolicyConnectorAsh* policy_connector = |
| g_browser_process->platform_part()->browser_policy_connector_ash(); |
| result->directory_device_id = policy_connector->GetDirectoryApiID(); |
| result->serial_number = std::string( |
| ash::system::StatisticsProvider::GetInstance()->GetMachineID().value_or( |
| "")); |
| result->annotated_asset_id = policy_connector->GetDeviceAssetID(); |
| result->annotated_location = policy_connector->GetDeviceAnnotatedLocation(); |
| auto* device_name_policy_handler = |
| policy_connector->GetDeviceNamePolicyHandler(); |
| if (device_name_policy_handler) { |
| result->hostname = |
| device_name_policy_handler->GetHostnameChosenByAdministrator(); |
| } |
| |
| result->has_stylus_enabled_touchscreen = |
| web_app::DeviceHasStylusEnabledTouchscreen(); |
| |
| return result; |
| } |
| |
| struct InterfaceVersionEntry { |
| base::Token uuid; |
| uint32_t version; |
| }; |
| |
| template <typename T> |
| constexpr InterfaceVersionEntry MakeInterfaceVersionEntry() { |
| return {T::Uuid_, T::Version_}; |
| } |
| |
| static_assert(crosapi::mojom::Crosapi::Version_ == 144, |
| "If you add a new crosapi, please add it to " |
| "kInterfaceVersionEntries below."); |
| |
| constexpr InterfaceVersionEntry kInterfaceVersionEntries[] = { |
| MakeInterfaceVersionEntry<chromeos::cdm::mojom::BrowserCdmFactory>(), |
| MakeInterfaceVersionEntry<chromeos::payments::mojom::PaymentAppInstance>(), |
| MakeInterfaceVersionEntry< |
| chromeos::remote_apps::mojom::RemoteAppsLacrosBridge>(), |
| MakeInterfaceVersionEntry<chromeos::sensors::mojom::SensorHalClient>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Arc>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AudioService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AuthenticationDeprecated>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Automation>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AutomationFactory>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AccountManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AppPublisher>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AppServiceProxy>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AppShortcutPublisher>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::AppWindowTracker>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::BrowserAppInstanceRegistry>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::BrowserServiceHost>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::BrowserVersionService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::CecPrivate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::CertDatabase>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::CertProvisioning>(), |
| MakeInterfaceVersionEntry<chromeos::cfm::mojom::CfmServiceContext>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ChapsService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ChromeAppKioskService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Clipboard>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ClipboardHistory>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ContentProtection>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::CrosDisplayConfigController>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Crosapi>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DebugInterfaceRegisterer>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Desk>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DeskProfileObserver>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DeskTemplate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DeviceAttributes>(), |
| MakeInterfaceVersionEntry< |
| crosapi::mojom::DeviceLocalAccountExtensionService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DeviceOAuth2TokenService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DeviceSettingsService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DiagnosticsService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DigitalGoodsFactory>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Dlp>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DocumentScan>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DownloadController>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DownloadStatusUpdater>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::DriveIntegrationService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::EchoPrivate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::EditorPanelManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::EmojiPicker>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ExtensionInfoPrivate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ExtensionPrinterService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::EyeDropper>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Feedback>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FieldTrialService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FileChangeServiceBridge>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FileManager>(), |
| MakeInterfaceVersionEntry< |
| crosapi::mojom::FileSystemAccessCloudIdentifierProvider>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FileSystemProviderService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FirewallHoleServiceDeprecated>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ForceInstalledTracker>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FullRestore>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::FullscreenController>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::GeolocationService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::HoldingSpaceService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::IdentityManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::IdleService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::InputMethods>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ImageWriter>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::InputMethodTestInterface>(), |
| MakeInterfaceVersionEntry<chromeos::auth::mojom::InSessionAuth>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::KerberosInBrowser>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::KeystoreService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::KioskSessionService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::LacrosShelfItemTracker>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::LocalPrinter>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Login>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::LoginScreenStorage>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::LoginState>(), |
| MakeInterfaceVersionEntry< |
| chromeos::machine_learning::mojom::MachineLearningService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MagicBoostController>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MahiBrowserDelegate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MediaApp>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MediaUI>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MessageCenter>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Metrics>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MetricsReporting>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::MultiCaptureService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::NativeThemeService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::NetworkChange>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::NetworkingAttributes>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::NetworkingPrivate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::NetworkSettingsService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::OneDriveIntegrationService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::OneDriveNotificationService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::PasskeyAuthenticator>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::PolicyService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Power>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Prefs>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::NonclosableAppToastService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::PrintPreviewCrosDelegate>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::PrintingMetrics>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::PrintingMetricsForProfile>(), |
| MakeInterfaceVersionEntry< |
| crosapi::mojom::TelemetryDiagnosticRoutinesService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TelemetryEventService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TelemetryManagementService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TelemetryProbeService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Remoting>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ResourceManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ScreenAIDownloader>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ScreenManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SearchControllerRegistry>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SearchControllerFactory>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SelectFile>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Sharesheet>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SmartReaderClient>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SpeechRecognition>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::StructuredMetricsService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SuggestionService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SnapshotCapturer>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SyncService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::SystemDisplayDeprecated>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TaskManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TestController>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TimeZoneService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TrustedVaultBackend>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::TrustedVaultBackendService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Tts>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::UrlHandler>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::VideoCaptureDeviceFactory>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::VideoConferenceManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::VirtualKeyboard>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::VolumeManager>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::VpnExtensionObserver>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::VpnService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::Wallpaper>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::WebAppService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::WebKioskService>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::WebPageInfoFactory>(), |
| MakeInterfaceVersionEntry<device::mojom::HidConnection>(), |
| MakeInterfaceVersionEntry<device::mojom::HidManager>(), |
| MakeInterfaceVersionEntry< |
| media::stable::mojom::StableVideoDecoderFactory>(), |
| MakeInterfaceVersionEntry<media_session::mojom::MediaControllerManager>(), |
| MakeInterfaceVersionEntry<media_session::mojom::AudioFocusManager>(), |
| MakeInterfaceVersionEntry<media_session::mojom::AudioFocusManagerDebug>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::ParentAccess>(), |
| MakeInterfaceVersionEntry< |
| crosapi::mojom::EmbeddedAccessibilityHelperClient>(), |
| MakeInterfaceVersionEntry< |
| crosapi::mojom::EmbeddedAccessibilityHelperClientFactory>(), |
| MakeInterfaceVersionEntry<crosapi::mojom::GuestOsSkForwarderFactory>(), |
| }; |
| |
| constexpr bool HasDuplicatedUuid() { |
| // We assume the number of entries are small enough so that simple |
| // O(N^2) check works. |
| const size_t size = std::size(kInterfaceVersionEntries); |
| for (size_t i = 0; i < size; ++i) { |
| for (size_t j = i + 1; j < size; ++j) { |
| if (kInterfaceVersionEntries[i].uuid == |
| kInterfaceVersionEntries[j].uuid) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| static_assert(!HasDuplicatedUuid(), |
| "Each Crosapi Mojom interface should have unique UUID."); |
| |
| crosapi::mojom::BrowserInitParams::DeviceType ConvertDeviceType( |
| chromeos::DeviceType device_type) { |
| switch (device_type) { |
| case chromeos::DeviceType::kChromebook: |
| return crosapi::mojom::BrowserInitParams::DeviceType::kChromebook; |
| case chromeos::DeviceType::kChromebase: |
| return crosapi::mojom::BrowserInitParams::DeviceType::kChromebase; |
| case chromeos::DeviceType::kChromebit: |
| return crosapi::mojom::BrowserInitParams::DeviceType::kChromebit; |
| case chromeos::DeviceType::kChromebox: |
| return crosapi::mojom::BrowserInitParams::DeviceType::kChromebox; |
| case chromeos::DeviceType::kUnknown: |
| [[fallthrough]]; |
| default: |
| return crosapi::mojom::BrowserInitParams::DeviceType::kUnknown; |
| } |
| } |
| |
| crosapi::mojom::BrowserInitParams::LacrosSelection GetLacrosSelection( |
| std::optional<ash::standalone_browser::LacrosSelection> selection) { |
| if (!selection.has_value()) { |
| return crosapi::mojom::BrowserInitParams::LacrosSelection::kUnspecified; |
| } |
| |
| switch (selection.value()) { |
| case ash::standalone_browser::LacrosSelection::kRootfs: |
| return crosapi::mojom::BrowserInitParams::LacrosSelection::kRootfs; |
| case ash::standalone_browser::LacrosSelection::kStateful: |
| return crosapi::mojom::BrowserInitParams::LacrosSelection::kStateful; |
| case ash::standalone_browser::LacrosSelection::kDeployedLocally: |
| return crosapi::mojom::BrowserInitParams::LacrosSelection::kUnspecified; |
| } |
| } |
| |
| mojom::SessionType GetSessionType() { |
| const user_manager::User* const user = |
| user_manager::UserManager::Get()->GetPrimaryUser(); |
| switch (user->GetType()) { |
| case user_manager::UserType::kRegular: |
| return mojom::SessionType::kRegularSession; |
| case user_manager::UserType::kChild: |
| return mojom::SessionType::kChildSession; |
| case user_manager::UserType::kGuest: |
| return mojom::SessionType::kGuestSession; |
| case user_manager::UserType::kPublicAccount: |
| return mojom::SessionType::kPublicSession; |
| case user_manager::UserType::kKioskApp: |
| return mojom::SessionType::kAppKioskSession; |
| case user_manager::UserType::kWebKioskApp: |
| return mojom::SessionType::kWebKioskSession; |
| } |
| } |
| |
| mojom::DeviceMode GetDeviceMode() { |
| policy::DeviceMode mode = ash::InstallAttributes::Get()->GetMode(); |
| switch (mode) { |
| case policy::DEVICE_MODE_PENDING: |
| // "Pending" is an internal detail of InstallAttributes and doesn't need |
| // its own mojom value. |
| return mojom::DeviceMode::kNotSet; |
| case policy::DEVICE_MODE_NOT_SET: |
| return mojom::DeviceMode::kNotSet; |
| case policy::DEVICE_MODE_CONSUMER: |
| return mojom::DeviceMode::kConsumer; |
| case policy::DEVICE_MODE_ENTERPRISE: |
| return mojom::DeviceMode::kEnterprise; |
| case policy::DEPRECATED_DEVICE_MODE_LEGACY_RETAIL_MODE: |
| return mojom::DeviceMode::kLegacyRetailMode; |
| case policy::DEPRECATED_DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH: |
| return mojom::DeviceMode::kConsumerKioskAutolaunch; |
| case policy::DEVICE_MODE_DEMO: |
| return mojom::DeviceMode::kDemo; |
| } |
| } |
| |
| // Returns the account used to sign into the device. May be a Gaia account or a |
| // Microsoft Active Directory account. |
| // Returns a `nullopt` for Guest Sessions, Managed Guest Sessions, |
| // Demo Mode, and Kiosks. |
| std::optional<account_manager::Account> GetDeviceAccount() { |
| // Lacros doesn't support Multi-Login. Get the Primary User. |
| const user_manager::User* user = |
| user_manager::UserManager::Get()->GetPrimaryUser(); |
| if (!user) { |
| return std::nullopt; |
| } |
| |
| const AccountId& account_id = user->GetAccountId(); |
| switch (account_id.GetAccountType()) { |
| case AccountType::ACTIVE_DIRECTORY: |
| return std::make_optional(account_manager::Account{ |
| account_manager::AccountKey{ |
| account_id.GetObjGuid(), |
| account_manager::AccountType::kActiveDirectory}, |
| user->GetDisplayEmail()}); |
| case AccountType::GOOGLE: |
| return std::make_optional(account_manager::Account{ |
| account_manager::AccountKey{account_id.GetGaiaId(), |
| account_manager::AccountType::kGaia}, |
| user->GetDisplayEmail()}); |
| case AccountType::UNKNOWN: |
| return std::nullopt; |
| } |
| } |
| |
| base::Time GetLastPolicyFetchAttemptTimestamp() { |
| const user_manager::User* user = |
| user_manager::UserManager::Get()->GetPrimaryUser(); |
| if (!user) { |
| return base::Time(); |
| } |
| |
| policy::CloudPolicyCore* core = GetCloudPolicyCoreForUser(*user); |
| if (!core) { |
| return base::Time(); |
| } |
| |
| return core->refresh_scheduler() ? core->refresh_scheduler()->last_refresh() |
| : base::Time(); |
| } |
| |
| } // namespace |
| |
| const base::flat_map<base::Token, uint32_t>& GetInterfaceVersions() { |
| static base::NoDestructor<base::flat_map<base::Token, uint32_t>> versions([] { |
| base::flat_map<base::Token, uint32_t> versions; |
| for (const auto& entry : kInterfaceVersionEntries) { |
| versions.emplace(entry.uuid, entry.version); |
| } |
| return versions; |
| }()); |
| return *versions; |
| } |
| |
| InitialBrowserAction::InitialBrowserAction( |
| crosapi::mojom::InitialBrowserAction action) |
| : action(action) {} |
| |
| InitialBrowserAction::InitialBrowserAction(InitialBrowserAction&&) = default; |
| InitialBrowserAction& InitialBrowserAction::operator=(InitialBrowserAction&&) = |
| default; |
| |
| InitialBrowserAction::~InitialBrowserAction() = default; |
| |
| void InjectBrowserInitParams( |
| mojom::BrowserInitParams* params, |
| bool is_keep_alive_enabled, |
| std::optional<ash::standalone_browser::LacrosSelection> lacros_selection) { |
| params->crosapi_version = crosapi::mojom::Crosapi::Version_; |
| params->deprecated_ash_metrics_enabled_has_value = true; |
| PrefService* local_state = g_browser_process->local_state(); |
| params->ash_metrics_enabled = |
| local_state->GetBoolean(metrics::prefs::kMetricsReportingEnabled); |
| params->ash_metrics_managed = |
| IsMetricsReportingPolicyManaged() |
| ? mojom::MetricsReportingManaged::kManaged |
| : mojom::MetricsReportingManaged::kNotManaged; |
| |
| params->device_mode = GetDeviceMode(); |
| params->interface_versions = GetInterfaceVersions(); |
| |
| // TODO(crbug.com/40134922): This should be updated to a new value when |
| // the long term fix is made in ash-chrome, atomically. |
| params->exo_ime_support = |
| crosapi::mojom::ExoImeSupport::kConsumedByImeWorkaround; |
| params->idle_info = IdleServiceAsh::ReadIdleInfoFromSystem(); |
| params->native_theme_info = NativeThemeServiceAsh::GetNativeThemeInfo(); |
| |
| params->device_properties = GetDeviceProperties(); |
| params->device_settings = GetDeviceSettings(); |
| |
| // Syncing the randomization seed ensures that the group membership of the |
| // limited entropy synthetic trial will be the same between Ash Chrome and |
| // Lacros. |
| // TODO(crbug.com/40948861): Remove after completing the trial. |
| variations::LimitedEntropySyntheticTrial limited_entropy_synthetic_trial( |
| local_state, ash::GetChannel()); |
| params->limited_entropy_synthetic_trial_seed = |
| limited_entropy_synthetic_trial.GetRandomizationSeed(local_state); |
| |
| // |metrics_service| could be nullptr in tests. |
| if (auto* metrics_service = g_browser_process->metrics_service()) { |
| // Send metrics service client id to Lacros if it's present. |
| std::string client_id = metrics_service->GetClientId(); |
| if (!client_id.empty()) { |
| params->metrics_service_client_id = client_id; |
| } |
| |
| // TODO(crbug.com/352689349): Remove sync'ing of entropy values. |
| params->entropy_source = crosapi::mojom::EntropySource::New( |
| metrics_service->GetLowEntropySource(), |
| metrics_service->GetOldLowEntropySource(), |
| metrics_service->GetPseudoLowEntropySource(), |
| /*limited_entropy_randomization_source=*/std::string()); |
| } |
| |
| if (auto* metrics_services_manager = |
| g_browser_process->GetMetricsServicesManager()) { |
| if (auto* ukm_service = metrics_services_manager->GetUkmService()) { |
| params->ukm_client_id = ukm_service->client_id(); |
| } |
| } |
| |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| ::switches::kOndeviceHandwritingSwitch)) { |
| const auto handwriting_switch = |
| base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| ::switches::kOndeviceHandwritingSwitch); |
| |
| // TODO(https://crbug.com/1168978): Query mlservice instead of using |
| // hard-coded values. |
| if (handwriting_switch == "use_rootfs") { |
| params->ondevice_handwriting_support = |
| crosapi::mojom::OndeviceHandwritingSupport::kUseRootfs; |
| } else if (handwriting_switch == "use_dlc") { |
| params->ondevice_handwriting_support = |
| crosapi::mojom::OndeviceHandwritingSupport::kUseDlc; |
| } else { |
| params->ondevice_handwriting_support = |
| crosapi::mojom::OndeviceHandwritingSupport::kUnsupported; |
| } |
| } |
| |
| // Add any BUILDFLAGs we use to pass our per-platform/ build configuration to |
| // lacros for runtime handling instead. |
| std::vector<crosapi::mojom::BuildFlag> build_flags; |
| #if BUILDFLAG(ENABLE_PLATFORM_HEVC) |
| if (base::FeatureList::IsEnabled(media::kPlatformHEVCDecoderSupport)) { |
| build_flags.emplace_back(crosapi::mojom::BuildFlag::kEnablePlatformHevc); |
| } |
| #endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) |
| #if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) |
| build_flags.emplace_back( |
| crosapi::mojom::BuildFlag::kUseChromeosProtectedMedia); |
| #endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) |
| #if BUILDFLAG(USE_CHROMEOS_PROTECTED_AV1) |
| build_flags.emplace_back(crosapi::mojom::BuildFlag::kUseChromeosProtectedAv1); |
| #endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_AV1) |
| params->build_flags = std::move(build_flags); |
| |
| // Keep-alive mojom API is now used by the current ash-chrome. |
| params->initial_keep_alive = |
| is_keep_alive_enabled |
| ? crosapi::mojom::BrowserInitParams::InitialKeepAlive::kEnabled |
| : crosapi::mojom::BrowserInitParams::InitialKeepAlive::kDisabled; |
| |
| params->is_unfiltered_bluetooth_device_enabled = |
| ash::switches::IsUnfilteredBluetoothDevicesEnabled(); |
| |
| // Pass the accepted internal urls to lacros. Only accepted urls are allowed |
| // to be passed via OpenURL from Lacros to Ash. |
| params->accepted_internal_ash_urls = |
| ChromeWebUIControllerFactory::GetInstance()->GetListOfAcceptableURLs(); |
| |
| params->ash_capabilities = { |
| {std::begin(kAshCapabilities), std::end(kAshCapabilities)}}; |
| |
| params->lacros_selection = GetLacrosSelection(lacros_selection); |
| |
| params->is_device_enterprised_managed = |
| ash::InstallAttributes::Get()->IsEnterpriseManaged(); |
| |
| params->device_type = ConvertDeviceType(chromeos::GetDeviceType()); |
| |
| params->is_ondevice_speech_supported = |
| base::FeatureList::IsEnabled(ash::features::kOnDeviceSpeechRecognition); |
| |
| params->ash_chrome_version = version_info::GetVersionNumber(); |
| params->use_cups_for_printing = GetUseCupsForPrinting(); |
| params->use_floss_bluetooth = floss::features::IsFlossEnabled(); |
| params->is_floss_available = floss::features::IsFlossAvailable(); |
| params->is_floss_availability_check_needed = |
| floss::features::IsFlossAvailabilityCheckNeeded(); |
| params->is_llprivacy_available = floss::features::IsLLPrivacyAvailable(); |
| |
| params->is_cloud_gaming_device = |
| chromeos::features::IsCloudGamingDeviceEnabled(); |
| |
| params->gpu_sandbox_start_mode = |
| base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kGpuSandboxStartEarly) |
| ? crosapi::mojom::BrowserInitParams::GpuSandboxStartMode::kEarly |
| : crosapi::mojom::BrowserInitParams::GpuSandboxStartMode::kNormal; |
| |
| params->extension_keep_list = extensions::BuildExtensionKeeplistInitParam(); |
| |
| params->vc_controls_ui_enabled = ash::features::IsVideoConferenceEnabled(); |
| |
| params->standalone_browser_app_service_blocklist = |
| extensions::BuildStandaloneBrowserAppServiceBlockListInitParam(); |
| |
| params->enable_cpu_mappable_native_gpu_memory_buffers = |
| base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableNativeGpuMemoryBuffers); |
| |
| params->oop_video_decoding_enabled = base::FeatureList::IsEnabled( |
| media::kExposeOutOfProcessVideoDecodingToLacros); |
| |
| params->is_upload_office_to_cloud_enabled = |
| chromeos::features::IsUploadOfficeToCloudEnabled(); |
| |
| params->enable_clipboard_history_refresh = |
| chromeos::features::IsClipboardHistoryRefreshEnabled(); |
| |
| params->is_variable_refresh_rate_always_on = |
| ::features::IsVariableRefreshRateAlwaysOn(); |
| |
| params->is_pdf_ocr_enabled = ::features::IsPdfOcrEnabled(); |
| |
| params->is_drivefs_bulk_pinning_available = |
| drive::util::IsDriveFsBulkPinningAvailable(); |
| |
| params->is_sys_ui_downloads_integration_v2_enabled = true; |
| |
| params->is_cros_battery_saver_available = |
| ash::features::IsBatterySaverAvailable(); |
| |
| // TODO(b/346683858): Remove in M130. |
| params->is_app_install_service_uri_enabled = true; |
| |
| params->is_desk_profiles_enabled = |
| chromeos::features::IsDeskProfilesEnabled(); |
| |
| // TODO(b/352513798): Remove in M131. |
| params->is_cros_web_app_shortcut_ui_update_enabled = false; |
| |
| // TODO(b/352513798): Remove in M131. |
| params->is_cros_shortstand_enabled = false; |
| |
| params->should_disable_chrome_compose_on_chromeos = |
| chromeos::features::ShouldDisableChromeComposeOnChromeOS(); |
| |
| params->is_captive_portal_popup_window_enabled = |
| chromeos::features::IsCaptivePortalPopupWindowEnabled(); |
| |
| params->is_file_system_provider_cloud_file_system_enabled = |
| chromeos::features::IsFileSystemProviderCloudFileSystemEnabled(); |
| |
| // TODO(b/346683858): Remove in M130. |
| params->is_cros_web_app_install_dialog_enabled = true; |
| |
| params->is_orca_enabled = chromeos::features::IsOrcaEnabled(); |
| |
| params->is_orca_use_l10n_strings_enabled = |
| chromeos::features::IsOrcaUseL10nStringsEnabled(); |
| |
| params->is_orca_internationalize_enabled = |
| chromeos::features::IsOrcaInternationalizeEnabled(); |
| |
| params->is_cros_mall_web_app_enabled = |
| chromeos::features::IsCrosMallWebAppEnabled(); |
| |
| params->is_mahi_enabled = chromeos::features::IsMahiEnabled(); |
| |
| params->is_container_app_preinstall_enabled = |
| chromeos::features::IsContainerAppPreinstallEnabled(); |
| |
| params->is_file_system_provider_content_cache_enabled = |
| chromeos::features::IsFileSystemProviderContentCacheEnabled(); |
| } |
| |
| template <typename BrowserParams> |
| void InjectBrowserPostLoginParams(BrowserParams* params, |
| InitialBrowserAction initial_browser_action) { |
| static_assert(std::is_same<mojom::BrowserInitParams, BrowserParams>() || |
| std::is_same<mojom::BrowserPostLoginParams, BrowserParams>()); |
| |
| params->session_type = GetSessionType(); |
| params->default_paths = EnvironmentProvider::Get()->GetDefaultPaths(); |
| |
| const std::optional<account_manager::Account> maybe_device_account = |
| GetDeviceAccount(); |
| if (maybe_device_account) { |
| params->device_account = |
| account_manager::ToMojoAccount(maybe_device_account.value()); |
| } |
| |
| params->cros_user_id_hash = |
| ash::BrowserContextHelper::GetUserIdHashFromBrowserContext( |
| ProfileManager::GetPrimaryUserProfile()); |
| params->device_account_policy = GetDeviceAccountPolicy(); |
| params->last_policy_fetch_attempt_timestamp = |
| GetLastPolicyFetchAttemptTimestamp().ToTimeT(); |
| |
| params->initial_browser_action = initial_browser_action.action; |
| |
| params->publish_chrome_apps = browser_util::IsLacrosChromeAppsEnabled(); |
| params->publish_hosted_apps = crosapi::IsStandaloneBrowserHostedAppsEnabled(); |
| |
| params->device_account_component_policy = GetDeviceAccountComponentPolicy(); |
| |
| params->is_current_user_device_owner = GetIsCurrentUserOwner(); |
| params->is_current_user_ephemeral = IsCurrentUserEphemeral(); |
| params->enable_lacros_tts_support = |
| tts_crosapi_util::ShouldEnableLacrosTtsSupport(); |
| } |
| |
| mojom::BrowserInitParamsPtr GetBrowserInitParams( |
| InitialBrowserAction initial_browser_action, |
| bool is_keep_alive_enabled, |
| std::optional<ash::standalone_browser::LacrosSelection> lacros_selection, |
| bool include_post_login_params) { |
| mojom::BrowserInitParamsPtr params = mojom::BrowserInitParams::New(); |
| InjectBrowserInitParams(params.get(), is_keep_alive_enabled, |
| lacros_selection); |
| if (include_post_login_params) { |
| InjectBrowserPostLoginParams(params.get(), |
| std::move(initial_browser_action)); |
| } |
| return params; |
| } |
| |
| mojom::BrowserPostLoginParamsPtr GetBrowserPostLoginParams( |
| InitialBrowserAction initial_browser_action) { |
| mojom::BrowserPostLoginParamsPtr params = |
| mojom::BrowserPostLoginParams::New(); |
| InjectBrowserPostLoginParams(params.get(), std::move(initial_browser_action)); |
| return params; |
| } |
| |
| base::ScopedFD CreateStartupData( |
| InitialBrowserAction initial_browser_action, |
| bool is_keep_alive_enabled, |
| std::optional<ash::standalone_browser::LacrosSelection> lacros_selection, |
| bool include_post_login_params) { |
| const auto& data = GetBrowserInitParams( |
| std::move(initial_browser_action), is_keep_alive_enabled, |
| lacros_selection, include_post_login_params); |
| |
| return chromeos::CreateMemFDFromBrowserInitParams(data); |
| } |
| |
| bool WritePostLoginData(base::PlatformFile fd, |
| InitialBrowserAction initial_browser_action) { |
| const auto& data = |
| GetBrowserPostLoginParams(std::move(initial_browser_action)); |
| |
| std::vector<uint8_t> serialized = |
| crosapi::mojom::BrowserPostLoginParams::Serialize(&data); |
| |
| if (!base::WriteFileDescriptor(fd, serialized)) { |
| LOG(ERROR) << "Failed to dump the serialized BrowserPostLoginParams"; |
| return false; |
| } |
| |
| return true; |
| } |
| |
| bool IsSigninProfileOrBelongsToAffiliatedUser(Profile* profile) { |
| if (ash::IsSigninBrowserContext(profile)) { |
| return true; |
| } |
| |
| if (profile->IsOffTheRecord()) { |
| return false; |
| } |
| |
| const user_manager::User* user = |
| ash::BrowserContextHelper::Get()->GetUserByBrowserContext(profile); |
| if (!user) { |
| return false; |
| } |
| return user->IsAffiliated(); |
| } |
| |
| // Returns the device policy data needed for Lacros. |
| mojom::DeviceSettingsPtr GetDeviceSettings() { |
| mojom::DeviceSettingsPtr result = mojom::DeviceSettings::New(); |
| |
| result->attestation_for_content_protection_enabled = MojoOptionalBool::kUnset; |
| result->device_restricted_managed_guest_session_enabled = |
| MojoOptionalBool::kUnset; |
| result->device_extensions_system_log_enabled = MojoOptionalBool::kUnset; |
| if (ash::CrosSettings::IsInitialized()) { |
| // It's expected that the CrosSettings values are trusted. The only |
| // theoretical exception is when device ownership is taken on consumer |
| // device. Then there's no settings to be passed to Lacros anyway. |
| auto trusted_result = |
| ash::CrosSettings::Get()->PrepareTrustedValues(base::DoNothing()); |
| if (trusted_result == ash::CrosSettingsProvider::TRUSTED) { |
| const auto* cros_settings = ash::CrosSettings::Get(); |
| bool attestation_enabled = false; |
| if (cros_settings->GetBoolean( |
| ash::kAttestationForContentProtectionEnabled, |
| &attestation_enabled)) { |
| result->attestation_for_content_protection_enabled = |
| attestation_enabled ? MojoOptionalBool::kTrue |
| : MojoOptionalBool::kFalse; |
| } |
| |
| const base::Value::List* usb_detachable_allow_list; |
| if (cros_settings->GetList(ash::kUsbDetachableAllowlist, |
| &usb_detachable_allow_list)) { |
| mojom::UsbDetachableAllowlistPtr allow_list = |
| mojom::UsbDetachableAllowlist::New(); |
| for (const auto& entry : *usb_detachable_allow_list) { |
| mojom::UsbDeviceIdPtr usb_device_id = mojom::UsbDeviceId::New(); |
| std::optional<int> vid = |
| entry.GetDict().FindInt(ash::kUsbDetachableAllowlistKeyVid); |
| if (vid) { |
| usb_device_id->has_vendor_id = true; |
| usb_device_id->vendor_id = vid.value(); |
| } |
| std::optional<int> pid = |
| entry.GetDict().FindInt(ash::kUsbDetachableAllowlistKeyPid); |
| if (pid) { |
| usb_device_id->has_product_id = true; |
| usb_device_id->product_id = pid.value(); |
| } |
| allow_list->usb_device_ids.push_back(std::move(usb_device_id)); |
| } |
| result->usb_detachable_allow_list = std::move(allow_list); |
| } |
| |
| bool device_restricted_managed_guest_session_enabled = false; |
| if (cros_settings->GetBoolean( |
| ash::kDeviceRestrictedManagedGuestSessionEnabled, |
| &device_restricted_managed_guest_session_enabled)) { |
| result->device_restricted_managed_guest_session_enabled = |
| device_restricted_managed_guest_session_enabled |
| ? MojoOptionalBool::kTrue |
| : MojoOptionalBool::kFalse; |
| } |
| |
| bool report_device_network_status = true; |
| if (cros_settings->GetBoolean(ash::kReportDeviceNetworkStatus, |
| &report_device_network_status)) { |
| result->report_device_network_status = report_device_network_status |
| ? MojoOptionalBool::kTrue |
| : MojoOptionalBool::kFalse; |
| } |
| |
| int report_upload_frequency; |
| if (cros_settings->GetInteger(ash::kReportUploadFrequency, |
| &report_upload_frequency)) { |
| result->report_upload_frequency = |
| crosapi::mojom::NullableInt64::New(report_upload_frequency); |
| } |
| |
| int report_device_network_telemetry_collection_rate_ms; |
| if (cros_settings->GetInteger( |
| ash::kReportDeviceNetworkTelemetryCollectionRateMs, |
| &report_device_network_telemetry_collection_rate_ms)) { |
| result->report_device_network_telemetry_collection_rate_ms = |
| crosapi::mojom::NullableInt64::New( |
| report_device_network_telemetry_collection_rate_ms); |
| } |
| |
| std::string device_variations_restrict_parameter; |
| if (cros_settings->GetString(ash::kVariationsRestrictParameter, |
| &device_variations_restrict_parameter)) { |
| result->device_variations_restrict_parameter = |
| device_variations_restrict_parameter; |
| } |
| |
| bool device_guest_mode_enabled = false; |
| if (cros_settings->GetBoolean(ash::kAccountsPrefAllowGuest, |
| &device_guest_mode_enabled)) { |
| result->device_guest_mode_enabled = device_guest_mode_enabled |
| ? MojoOptionalBool::kTrue |
| : MojoOptionalBool::kFalse; |
| } |
| |
| bool device_extensions_system_log_enabled = false; |
| if (cros_settings->GetBoolean(ash::kDeviceExtensionsSystemLogEnabled, |
| &device_extensions_system_log_enabled)) { |
| result->device_extensions_system_log_enabled = |
| device_extensions_system_log_enabled ? MojoOptionalBool::kTrue |
| : MojoOptionalBool::kFalse; |
| } |
| } else { |
| LOG(WARNING) << "Unexpected crossettings trusted values status: " |
| << trusted_result; |
| } |
| } |
| |
| result->device_system_wide_tracing_enabled = MojoOptionalBool::kUnset; |
| auto* local_state = g_browser_process->local_state(); |
| if (local_state) { |
| auto* pref = local_state->FindPreference( |
| ash::prefs::kDeviceSystemWideTracingEnabled); |
| if (pref && pref->IsManaged()) { |
| result->device_system_wide_tracing_enabled = |
| pref->GetValue()->GetBool() ? MojoOptionalBool::kTrue |
| : MojoOptionalBool::kFalse; |
| } |
| } |
| |
| return result; |
| } |
| |
| policy::CloudPolicyCore* GetCloudPolicyCoreForUser( |
| const user_manager::User& user) { |
| switch (user.GetType()) { |
| case user_manager::UserType::kRegular: |
| case user_manager::UserType::kChild: { |
| policy::UserCloudPolicyManagerAsh* manager = |
| GetUserCloudPolicyManager(user); |
| return manager ? manager->core() : nullptr; |
| } |
| case user_manager::UserType::kKioskApp: |
| case user_manager::UserType::kPublicAccount: |
| case user_manager::UserType::kWebKioskApp: { |
| policy::DeviceLocalAccountPolicyBroker* broker = |
| GetDeviceLocalAccountPolicyBroker(user); |
| return broker ? broker->core() : nullptr; |
| } |
| case user_manager::UserType::kGuest: |
| return nullptr; |
| } |
| } |
| |
| policy::ComponentCloudPolicyService* GetComponentCloudPolicyServiceForUser( |
| const user_manager::User& user) { |
| switch (user.GetType()) { |
| case user_manager::UserType::kRegular: |
| case user_manager::UserType::kChild: { |
| policy::UserCloudPolicyManagerAsh* manager = |
| GetUserCloudPolicyManager(user); |
| return manager ? manager->component_policy_service() : nullptr; |
| } |
| case user_manager::UserType::kKioskApp: |
| case user_manager::UserType::kPublicAccount: |
| case user_manager::UserType::kWebKioskApp: { |
| policy::DeviceLocalAccountPolicyBroker* broker = |
| GetDeviceLocalAccountPolicyBroker(user); |
| return broker ? broker->component_policy_service() : nullptr; |
| } |
| case user_manager::UserType::kGuest: |
| return nullptr; |
| } |
| } |
| |
| base::span<const std::string_view> GetAshCapabilities() { |
| return kAshCapabilities; |
| } |
| |
| } // namespace browser_util |
| } // namespace crosapi |