diff options
Diffstat (limited to 'chromium/components/arc/session')
10 files changed, 419 insertions, 223 deletions
diff --git a/chromium/components/arc/session/arc_bridge_host_impl.cc b/chromium/components/arc/session/arc_bridge_host_impl.cc index f6ee475621d..4bd630b65f2 100644 --- a/chromium/components/arc/session/arc_bridge_host_impl.cc +++ b/chromium/components/arc/session/arc_bridge_host_impl.cc @@ -7,7 +7,8 @@ #include <algorithm> #include <utility> -#include "ash/public/cpp/arc_notifications_host_initializer.h" +#include "ash/public/cpp/external_arc/message_center/arc_notification_manager.h" +#include "ash/public/cpp/message_center/arc_notifications_host_initializer.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "components/arc/mojom/accessibility_helper.mojom.h" @@ -80,268 +81,296 @@ ArcBridgeHostImpl::~ArcBridgeHostImpl() { } void ArcBridgeHostImpl::OnAccessibilityHelperInstanceReady( - mojom::AccessibilityHelperInstancePtr accessibility_helper_ptr) { + mojo::PendingRemote<mojom::AccessibilityHelperInstance> + accessibility_helper_remote) { OnInstanceReady(arc_bridge_service_->accessibility_helper(), - std::move(accessibility_helper_ptr)); + std::move(accessibility_helper_remote)); } -void ArcBridgeHostImpl::OnAppInstanceReady(mojom::AppInstancePtr app_ptr) { - OnInstanceReady(arc_bridge_service_->app(), std::move(app_ptr)); +void ArcBridgeHostImpl::OnAppInstanceReady( + mojo::PendingRemote<mojom::AppInstance> app_remote) { + OnInstanceReady(arc_bridge_service_->app(), std::move(app_remote)); } void ArcBridgeHostImpl::OnAppPermissionsInstanceReady( - mojom::AppPermissionsInstancePtr app_permissions_ptr) { + mojo::PendingRemote<mojom::AppPermissionsInstance> app_permissions_remote) { OnInstanceReady(arc_bridge_service_->app_permissions(), - std::move(app_permissions_ptr)); + std::move(app_permissions_remote)); } void ArcBridgeHostImpl::OnAppfuseInstanceReady( - mojom::AppfuseInstancePtr appfuse_ptr) { - OnInstanceReady(arc_bridge_service_->appfuse(), std::move(appfuse_ptr)); + mojo::PendingRemote<mojom::AppfuseInstance> appfuse_remote) { + OnInstanceReady(arc_bridge_service_->appfuse(), std::move(appfuse_remote)); } void ArcBridgeHostImpl::OnAudioInstanceReady( - mojom::AudioInstancePtr audio_ptr) { - OnInstanceReady(arc_bridge_service_->audio(), std::move(audio_ptr)); + mojo::PendingRemote<mojom::AudioInstance> audio_remote) { + OnInstanceReady(arc_bridge_service_->audio(), std::move(audio_remote)); } -void ArcBridgeHostImpl::OnAuthInstanceReady(mojom::AuthInstancePtr auth_ptr) { - OnInstanceReady(arc_bridge_service_->auth(), std::move(auth_ptr)); +void ArcBridgeHostImpl::OnAuthInstanceReady( + mojo::PendingRemote<mojom::AuthInstance> auth_remote) { + OnInstanceReady(arc_bridge_service_->auth(), std::move(auth_remote)); } void ArcBridgeHostImpl::OnBackupSettingsInstanceReady( - mojom::BackupSettingsInstancePtr backup_settings_ptr) { + mojo::PendingRemote<mojom::BackupSettingsInstance> backup_settings_remote) { OnInstanceReady(arc_bridge_service_->backup_settings(), - std::move(backup_settings_ptr)); + std::move(backup_settings_remote)); } void ArcBridgeHostImpl::OnBluetoothInstanceReady( - mojom::BluetoothInstancePtr bluetooth_ptr) { - OnInstanceReady(arc_bridge_service_->bluetooth(), std::move(bluetooth_ptr)); + mojo::PendingRemote<mojom::BluetoothInstance> bluetooth_remote) { + OnInstanceReady(arc_bridge_service_->bluetooth(), + std::move(bluetooth_remote)); } void ArcBridgeHostImpl::OnBootPhaseMonitorInstanceReady( - mojom::BootPhaseMonitorInstancePtr boot_phase_monitor_ptr) { + mojo::PendingRemote<mojom::BootPhaseMonitorInstance> + boot_phase_monitor_remote) { OnInstanceReady(arc_bridge_service_->boot_phase_monitor(), - std::move(boot_phase_monitor_ptr)); + std::move(boot_phase_monitor_remote)); } void ArcBridgeHostImpl::OnCameraInstanceReady( - mojom::CameraInstancePtr camera_ptr) { - OnInstanceReady(arc_bridge_service_->camera(), std::move(camera_ptr)); + mojo::PendingRemote<mojom::CameraInstance> camera_remote) { + OnInstanceReady(arc_bridge_service_->camera(), std::move(camera_remote)); } void ArcBridgeHostImpl::OnCastReceiverInstanceReady( - mojom::CastReceiverInstancePtr cast_receiver_ptr) { + mojo::PendingRemote<mojom::CastReceiverInstance> cast_receiver_remote) { OnInstanceReady(arc_bridge_service_->cast_receiver(), - std::move(cast_receiver_ptr)); + std::move(cast_receiver_remote)); } void ArcBridgeHostImpl::OnCertStoreInstanceReady( - mojom::CertStoreInstancePtr instance_ptr) { - OnInstanceReady(arc_bridge_service_->cert_store(), std::move(instance_ptr)); + mojo::PendingRemote<mojom::CertStoreInstance> instance_remote) { + OnInstanceReady(arc_bridge_service_->cert_store(), + std::move(instance_remote)); } void ArcBridgeHostImpl::OnClipboardInstanceReady( - mojom::ClipboardInstancePtr clipboard_ptr) { - OnInstanceReady(arc_bridge_service_->clipboard(), std::move(clipboard_ptr)); + mojo::PendingRemote<mojom::ClipboardInstance> clipboard_remote) { + OnInstanceReady(arc_bridge_service_->clipboard(), + std::move(clipboard_remote)); } void ArcBridgeHostImpl::OnCrashCollectorInstanceReady( - mojom::CrashCollectorInstancePtr crash_collector_ptr) { + mojo::PendingRemote<mojom::CrashCollectorInstance> crash_collector_remote) { OnInstanceReady(arc_bridge_service_->crash_collector(), - std::move(crash_collector_ptr)); + std::move(crash_collector_remote)); } void ArcBridgeHostImpl::OnDiskQuotaInstanceReady( - mojom::DiskQuotaInstancePtr disk_quota_ptr) { - OnInstanceReady(arc_bridge_service_->disk_quota(), std::move(disk_quota_ptr)); + mojo::PendingRemote<mojom::DiskQuotaInstance> disk_quota_remote) { + OnInstanceReady(arc_bridge_service_->disk_quota(), + std::move(disk_quota_remote)); } void ArcBridgeHostImpl::OnEnterpriseReportingInstanceReady( - mojom::EnterpriseReportingInstancePtr enterprise_reporting_ptr) { + mojo::PendingRemote<mojom::EnterpriseReportingInstance> + enterprise_reporting_remote) { OnInstanceReady(arc_bridge_service_->enterprise_reporting(), - std::move(enterprise_reporting_ptr)); + std::move(enterprise_reporting_remote)); } void ArcBridgeHostImpl::OnFileSystemInstanceReady( - mojom::FileSystemInstancePtr file_system_ptr) { + mojo::PendingRemote<mojom::FileSystemInstance> file_system_remote) { OnInstanceReady(arc_bridge_service_->file_system(), - std::move(file_system_ptr)); + std::move(file_system_remote)); } -void ArcBridgeHostImpl::OnImeInstanceReady(mojom::ImeInstancePtr ime_ptr) { - OnInstanceReady(arc_bridge_service_->ime(), std::move(ime_ptr)); +void ArcBridgeHostImpl::OnImeInstanceReady( + mojo::PendingRemote<mojom::ImeInstance> ime_remote) { + OnInstanceReady(arc_bridge_service_->ime(), std::move(ime_remote)); } void ArcBridgeHostImpl::OnInputMethodManagerInstanceReady( - mojom::InputMethodManagerInstancePtr input_method_manager_ptr) { + mojo::PendingRemote<mojom::InputMethodManagerInstance> + input_method_manager_remote) { OnInstanceReady(arc_bridge_service_->input_method_manager(), - std::move(input_method_manager_ptr)); + std::move(input_method_manager_remote)); } void ArcBridgeHostImpl::OnIntentHelperInstanceReady( - mojom::IntentHelperInstancePtr intent_helper_ptr) { + mojo::PendingRemote<mojom::IntentHelperInstance> intent_helper_remote) { OnInstanceReady(arc_bridge_service_->intent_helper(), - std::move(intent_helper_ptr)); + std::move(intent_helper_remote)); } void ArcBridgeHostImpl::OnKeymasterInstanceReady( - mojom::KeymasterInstancePtr keymaster_ptr) { - OnInstanceReady(arc_bridge_service_->keymaster(), std::move(keymaster_ptr)); + mojo::PendingRemote<mojom::KeymasterInstance> keymaster_remote) { + OnInstanceReady(arc_bridge_service_->keymaster(), + std::move(keymaster_remote)); } void ArcBridgeHostImpl::OnKioskInstanceReady( - mojom::KioskInstancePtr kiosk_ptr) { - OnInstanceReady(arc_bridge_service_->kiosk(), std::move(kiosk_ptr)); + mojo::PendingRemote<mojom::KioskInstance> kiosk_remote) { + OnInstanceReady(arc_bridge_service_->kiosk(), std::move(kiosk_remote)); } void ArcBridgeHostImpl::OnLockScreenInstanceReady( - mojom::LockScreenInstancePtr lock_screen_ptr) { + mojo::PendingRemote<mojom::LockScreenInstance> lock_screen_remote) { OnInstanceReady(arc_bridge_service_->lock_screen(), - std::move(lock_screen_ptr)); + std::move(lock_screen_remote)); } void ArcBridgeHostImpl::OnMediaSessionInstanceReady( - mojom::MediaSessionInstancePtr media_session_ptr) { + mojo::PendingRemote<mojom::MediaSessionInstance> media_session_remote) { OnInstanceReady(arc_bridge_service_->media_session(), - std::move(media_session_ptr)); + std::move(media_session_remote)); } void ArcBridgeHostImpl::OnMetricsInstanceReady( - mojom::MetricsInstancePtr metrics_ptr) { - OnInstanceReady(arc_bridge_service_->metrics(), std::move(metrics_ptr)); + mojo::PendingRemote<mojom::MetricsInstance> metrics_remote) { + OnInstanceReady(arc_bridge_service_->metrics(), std::move(metrics_remote)); } void ArcBridgeHostImpl::OnMidisInstanceReady( - mojom::MidisInstancePtr midis_ptr) { - OnInstanceReady(arc_bridge_service_->midis(), std::move(midis_ptr)); + mojo::PendingRemote<mojom::MidisInstance> midis_remote) { + OnInstanceReady(arc_bridge_service_->midis(), std::move(midis_remote)); } -void ArcBridgeHostImpl::OnNetInstanceReady(mojom::NetInstancePtr net_ptr) { - OnInstanceReady(arc_bridge_service_->net(), std::move(net_ptr)); +void ArcBridgeHostImpl::OnNetInstanceReady( + mojo::PendingRemote<mojom::NetInstance> net_remote) { + OnInstanceReady(arc_bridge_service_->net(), std::move(net_remote)); } void ArcBridgeHostImpl::OnNotificationsInstanceReady( - mojom::NotificationsInstancePtr notifications_ptr) { - // Forward notification instance to ash. - ash::ArcNotificationsHostInitializer::Get()->SetArcNotificationsInstance( - notifications_ptr.PassInterface()); + mojo::PendingRemote<mojom::NotificationsInstance> notifications_remote) { + auto* host_initializer = ash::ArcNotificationsHostInitializer::Get(); + auto* manager = host_initializer->GetArcNotificationManagerInstance(); + if (manager) { + static_cast<ash::ArcNotificationManager*>(manager)->SetInstance( + std::move(notifications_remote)); + return; + } + // Forward notification instance to ash by injecting ArcNotificationManager. + auto new_manager = std::make_unique<ash::ArcNotificationManager>(); + new_manager->SetInstance(std::move(notifications_remote)); + ash::ArcNotificationsHostInitializer::Get() + ->SetArcNotificationManagerInstance(std::move(new_manager)); } void ArcBridgeHostImpl::OnObbMounterInstanceReady( - mojom::ObbMounterInstancePtr obb_mounter_ptr) { + mojo::PendingRemote<mojom::ObbMounterInstance> obb_mounter_remote) { OnInstanceReady(arc_bridge_service_->obb_mounter(), - std::move(obb_mounter_ptr)); + std::move(obb_mounter_remote)); } void ArcBridgeHostImpl::OnOemCryptoInstanceReady( - mojom::OemCryptoInstancePtr oemcrypto_ptr) { - OnInstanceReady(arc_bridge_service_->oemcrypto(), std::move(oemcrypto_ptr)); + mojo::PendingRemote<mojom::OemCryptoInstance> oemcrypto_remote) { + OnInstanceReady(arc_bridge_service_->oemcrypto(), + std::move(oemcrypto_remote)); } -void ArcBridgeHostImpl::OnPipInstanceReady(mojom::PipInstancePtr pip_ptr) { - OnInstanceReady(arc_bridge_service_->pip(), std::move(pip_ptr)); +void ArcBridgeHostImpl::OnPipInstanceReady( + mojo::PendingRemote<mojom::PipInstance> pip_remote) { + OnInstanceReady(arc_bridge_service_->pip(), std::move(pip_remote)); } void ArcBridgeHostImpl::OnPolicyInstanceReady( - mojom::PolicyInstancePtr policy_ptr) { - OnInstanceReady(arc_bridge_service_->policy(), std::move(policy_ptr)); + mojo::PendingRemote<mojom::PolicyInstance> policy_remote) { + OnInstanceReady(arc_bridge_service_->policy(), std::move(policy_remote)); } void ArcBridgeHostImpl::OnPowerInstanceReady( - mojom::PowerInstancePtr power_ptr) { - OnInstanceReady(arc_bridge_service_->power(), std::move(power_ptr)); + mojo::PendingRemote<mojom::PowerInstance> power_remote) { + OnInstanceReady(arc_bridge_service_->power(), std::move(power_remote)); } void ArcBridgeHostImpl::OnPrintSpoolerInstanceReady( - mojom::PrintSpoolerInstancePtr print_spooler_ptr) { + mojo::PendingRemote<mojom::PrintSpoolerInstance> print_spooler_remote) { OnInstanceReady(arc_bridge_service_->print_spooler(), - std::move(print_spooler_ptr)); + std::move(print_spooler_remote)); } void ArcBridgeHostImpl::OnProcessInstanceReady( - mojom::ProcessInstancePtr process_ptr) { - OnInstanceReady(arc_bridge_service_->process(), std::move(process_ptr)); + mojo::PendingRemote<mojom::ProcessInstance> process_remote) { + OnInstanceReady(arc_bridge_service_->process(), std::move(process_remote)); } void ArcBridgeHostImpl::OnPropertyInstanceReady( - mojom::PropertyInstancePtr property_ptr) { - OnInstanceReady(arc_bridge_service_->property(), std::move(property_ptr)); + mojo::PendingRemote<mojom::PropertyInstance> property_remote) { + OnInstanceReady(arc_bridge_service_->property(), std::move(property_remote)); } void ArcBridgeHostImpl::OnRotationLockInstanceReady( - mojom::RotationLockInstancePtr rotation_lock_ptr) { + mojo::PendingRemote<mojom::RotationLockInstance> rotation_lock_remote) { OnInstanceReady(arc_bridge_service_->rotation_lock(), - std::move(rotation_lock_ptr)); + std::move(rotation_lock_remote)); } void ArcBridgeHostImpl::OnScreenCaptureInstanceReady( - mojom::ScreenCaptureInstancePtr screen_capture_ptr) { + mojo::PendingRemote<mojom::ScreenCaptureInstance> screen_capture_remote) { OnInstanceReady(arc_bridge_service_->screen_capture(), - std::move(screen_capture_ptr)); + std::move(screen_capture_remote)); } void ArcBridgeHostImpl::OnSmartCardManagerInstanceReady( - mojom::SmartCardManagerInstancePtr smart_card_manager_ptr) { + mojo::PendingRemote<mojom::SmartCardManagerInstance> + smart_card_manager_remote) { OnInstanceReady(arc_bridge_service_->smart_card_manager(), - std::move(smart_card_manager_ptr)); + std::move(smart_card_manager_remote)); } void ArcBridgeHostImpl::OnStorageManagerInstanceReady( - mojom::StorageManagerInstancePtr storage_manager_ptr) { + mojo::PendingRemote<mojom::StorageManagerInstance> storage_manager_remote) { OnInstanceReady(arc_bridge_service_->storage_manager(), - std::move(storage_manager_ptr)); + std::move(storage_manager_remote)); } void ArcBridgeHostImpl::OnTimerInstanceReady( - mojom::TimerInstancePtr timer_ptr) { - OnInstanceReady(arc_bridge_service_->timer(), std::move(timer_ptr)); + mojo::PendingRemote<mojom::TimerInstance> timer_remote) { + OnInstanceReady(arc_bridge_service_->timer(), std::move(timer_remote)); } void ArcBridgeHostImpl::OnTracingInstanceReady( - mojom::TracingInstancePtr tracing_ptr) { - OnInstanceReady(arc_bridge_service_->tracing(), std::move(tracing_ptr)); + mojo::PendingRemote<mojom::TracingInstance> tracing_remote) { + OnInstanceReady(arc_bridge_service_->tracing(), std::move(tracing_remote)); } -void ArcBridgeHostImpl::OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) { - OnInstanceReady(arc_bridge_service_->tts(), std::move(tts_ptr)); +void ArcBridgeHostImpl::OnTtsInstanceReady( + mojo::PendingRemote<mojom::TtsInstance> tts_remote) { + OnInstanceReady(arc_bridge_service_->tts(), std::move(tts_remote)); } void ArcBridgeHostImpl::OnUsbHostInstanceReady( - mojom::UsbHostInstancePtr usb_host_ptr) { - OnInstanceReady(arc_bridge_service_->usb_host(), std::move(usb_host_ptr)); + mojo::PendingRemote<mojom::UsbHostInstance> usb_host_remote) { + OnInstanceReady(arc_bridge_service_->usb_host(), std::move(usb_host_remote)); } void ArcBridgeHostImpl::OnVideoInstanceReady( - mojom::VideoInstancePtr video_ptr) { - OnInstanceReady(arc_bridge_service_->video(), std::move(video_ptr)); + mojo::PendingRemote<mojom::VideoInstance> video_remote) { + OnInstanceReady(arc_bridge_service_->video(), std::move(video_remote)); } void ArcBridgeHostImpl::OnVoiceInteractionArcHomeInstanceReady( - mojom::VoiceInteractionArcHomeInstancePtr home_ptr) { + mojo::PendingRemote<mojom::VoiceInteractionArcHomeInstance> home_remote) { NOTREACHED(); } void ArcBridgeHostImpl::OnVoiceInteractionFrameworkInstanceReady( - mojom::VoiceInteractionFrameworkInstancePtr framework_ptr) { + mojo::PendingRemote<mojom::VoiceInteractionFrameworkInstance> + framework_remote) { NOTREACHED(); } void ArcBridgeHostImpl::OnVolumeMounterInstanceReady( - mojom::VolumeMounterInstancePtr volume_mounter_ptr) { + mojo::PendingRemote<mojom::VolumeMounterInstance> volume_mounter_remote) { OnInstanceReady(arc_bridge_service_->volume_mounter(), - std::move(volume_mounter_ptr)); + std::move(volume_mounter_remote)); } void ArcBridgeHostImpl::OnWakeLockInstanceReady( - mojom::WakeLockInstancePtr wakelock_ptr) { - OnInstanceReady(arc_bridge_service_->wake_lock(), std::move(wakelock_ptr)); + mojo::PendingRemote<mojom::WakeLockInstance> wakelock_remote) { + OnInstanceReady(arc_bridge_service_->wake_lock(), std::move(wakelock_remote)); } void ArcBridgeHostImpl::OnWallpaperInstanceReady( - mojom::WallpaperInstancePtr wallpaper_ptr) { - OnInstanceReady(arc_bridge_service_->wallpaper(), std::move(wallpaper_ptr)); + mojo::PendingRemote<mojom::WallpaperInstance> wallpaper_remote) { + OnInstanceReady(arc_bridge_service_->wallpaper(), + std::move(wallpaper_remote)); } void ArcBridgeHostImpl::OnClosed() { @@ -360,16 +389,16 @@ void ArcBridgeHostImpl::OnClosed() { template <typename InstanceType, typename HostType> void ArcBridgeHostImpl::OnInstanceReady( ConnectionHolder<InstanceType, HostType>* holder, - mojo::InterfacePtr<InstanceType> ptr) { + mojo::PendingRemote<InstanceType> remote) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(receiver_.is_bound()); - DCHECK(ptr.is_bound()); + DCHECK(remote.is_valid()); // Track |channel|'s lifetime via |mojo_channels_| so that it will be // closed on ArcBridgeHost/Instance closing or the ArcBridgeHostImpl's // destruction. auto* channel = - new MojoChannel<InstanceType, HostType>(holder, ptr.PassInterface()); + new MojoChannel<InstanceType, HostType>(holder, std::move(remote)); mojo_channels_.emplace_back(channel); // Since |channel| is managed by |mojo_channels_|, its lifetime is shorter diff --git a/chromium/components/arc/session/arc_bridge_host_impl.h b/chromium/components/arc/session/arc_bridge_host_impl.h index 4e4020846b5..8f9b1fa796d 100644 --- a/chromium/components/arc/session/arc_bridge_host_impl.h +++ b/chromium/components/arc/session/arc_bridge_host_impl.h @@ -40,86 +40,124 @@ class ArcBridgeHostImpl : public mojom::ArcBridgeHost { // ArcBridgeHost overrides. void OnAccessibilityHelperInstanceReady( - mojom::AccessibilityHelperInstancePtr accessibility_helper_ptr) override; - void OnAppInstanceReady(mojom::AppInstancePtr app_ptr) override; + mojo::PendingRemote<mojom::AccessibilityHelperInstance> + accessibility_helper_remote) override; + void OnAppInstanceReady( + mojo::PendingRemote<mojom::AppInstance> app_ptr) override; void OnAppPermissionsInstanceReady( - mojom::AppPermissionsInstancePtr app_permissions_ptr) override; - void OnAppfuseInstanceReady(mojom::AppfuseInstancePtr appfuse_ptr) override; - void OnAudioInstanceReady(mojom::AudioInstancePtr audio_ptr) override; - void OnAuthInstanceReady(mojom::AuthInstancePtr auth_ptr) override; + mojo::PendingRemote<mojom::AppPermissionsInstance> app_permissions_remote) + override; + void OnAppfuseInstanceReady( + mojo::PendingRemote<mojom::AppfuseInstance> appfuse_remote) override; + void OnAudioInstanceReady( + mojo::PendingRemote<mojom::AudioInstance> audio_remote) override; + void OnAuthInstanceReady( + mojo::PendingRemote<mojom::AuthInstance> auth_remote) override; void OnBackupSettingsInstanceReady( - mojom::BackupSettingsInstancePtr backup_settings_ptr) override; + mojo::PendingRemote<mojom::BackupSettingsInstance> backup_settings_remote) + override; void OnBluetoothInstanceReady( - mojom::BluetoothInstancePtr bluetooth_ptr) override; + mojo::PendingRemote<mojom::BluetoothInstance> bluetooth_remote) override; void OnBootPhaseMonitorInstanceReady( - mojom::BootPhaseMonitorInstancePtr boot_phase_monitor_ptr) override; - void OnCameraInstanceReady(mojom::CameraInstancePtr camera_ptr) override; + mojo::PendingRemote<mojom::BootPhaseMonitorInstance> + boot_phase_monitor_remote) override; + void OnCameraInstanceReady( + mojo::PendingRemote<mojom::CameraInstance> camera_remote) override; void OnCastReceiverInstanceReady( - mojom::CastReceiverInstancePtr cast_receiver_ptr) override; + mojo::PendingRemote<mojom::CastReceiverInstance> cast_receiver_remote) + override; void OnCertStoreInstanceReady( - mojom::CertStoreInstancePtr instance_ptr) override; + mojo::PendingRemote<mojom::CertStoreInstance> instance_remote) override; void OnClipboardInstanceReady( - mojom::ClipboardInstancePtr clipboard_ptr) override; + mojo::PendingRemote<mojom::ClipboardInstance> clipboard_remote) override; void OnCrashCollectorInstanceReady( - mojom::CrashCollectorInstancePtr crash_collector_ptr) override; + mojo::PendingRemote<mojom::CrashCollectorInstance> crash_collector_remote) + override; void OnDiskQuotaInstanceReady( - mojom::DiskQuotaInstancePtr disk_quota_ptr) override; + mojo::PendingRemote<mojom::DiskQuotaInstance> disk_quota_remote) override; void OnEnterpriseReportingInstanceReady( - mojom::EnterpriseReportingInstancePtr enterprise_reporting_ptr) override; - void OnFileSystemInstanceReady( - mojom::FileSystemInstancePtr file_system_ptr) override; - void OnImeInstanceReady(mojom::ImeInstancePtr ime_ptr) override; + mojo::PendingRemote<mojom::EnterpriseReportingInstance> + enterprise_reporting_remote) override; + void OnFileSystemInstanceReady(mojo::PendingRemote<mojom::FileSystemInstance> + file_system_remote) override; + void OnImeInstanceReady( + mojo::PendingRemote<mojom::ImeInstance> ime_remote) override; void OnInputMethodManagerInstanceReady( - mojom::InputMethodManagerInstancePtr input_method_manager_ptr) override; + mojo::PendingRemote<mojom::InputMethodManagerInstance> + input_method_manager_remote) override; void OnIntentHelperInstanceReady( - mojom::IntentHelperInstancePtr intent_helper_ptr) override; + mojo::PendingRemote<mojom::IntentHelperInstance> intent_helper_remote) + override; void OnKeymasterInstanceReady( - mojom::KeymasterInstancePtr keymaster_ptr) override; - void OnKioskInstanceReady(mojom::KioskInstancePtr kiosk_ptr) override; - void OnLockScreenInstanceReady( - mojom::LockScreenInstancePtr lock_screen_ptr) override; + mojo::PendingRemote<mojom::KeymasterInstance> keymaster_remote) override; + void OnKioskInstanceReady( + mojo::PendingRemote<mojom::KioskInstance> kiosk_remote) override; + void OnLockScreenInstanceReady(mojo::PendingRemote<mojom::LockScreenInstance> + lock_screen_remote) override; void OnMediaSessionInstanceReady( - mojom::MediaSessionInstancePtr media_session_ptr) override; - void OnMetricsInstanceReady(mojom::MetricsInstancePtr metrics_ptr) override; - void OnMidisInstanceReady(mojom::MidisInstancePtr midis_ptr) override; - void OnNetInstanceReady(mojom::NetInstancePtr net_ptr) override; + mojo::PendingRemote<mojom::MediaSessionInstance> media_session_remote) + override; + void OnMetricsInstanceReady( + mojo::PendingRemote<mojom::MetricsInstance> metrics_remote) override; + void OnMidisInstanceReady( + mojo::PendingRemote<mojom::MidisInstance> midis_remote) override; + void OnNetInstanceReady( + mojo::PendingRemote<mojom::NetInstance> net_remote) override; void OnNotificationsInstanceReady( - mojom::NotificationsInstancePtr notifications_ptr) override; - void OnObbMounterInstanceReady( - mojom::ObbMounterInstancePtr obb_mounter_ptr) override; + mojo::PendingRemote<mojom::NotificationsInstance> notifications_remote) + override; + void OnObbMounterInstanceReady(mojo::PendingRemote<mojom::ObbMounterInstance> + obb_mounter_remote) override; void OnOemCryptoInstanceReady( - mojom::OemCryptoInstancePtr oemcrypto_ptr) override; - void OnPipInstanceReady(mojom::PipInstancePtr policy_ptr) override; - void OnPolicyInstanceReady(mojom::PolicyInstancePtr policy_ptr) override; - void OnPowerInstanceReady(mojom::PowerInstancePtr power_ptr) override; + mojo::PendingRemote<mojom::OemCryptoInstance> oemcrypto_remote) override; + void OnPipInstanceReady( + mojo::PendingRemote<mojom::PipInstance> policy_remote) override; + void OnPolicyInstanceReady( + mojo::PendingRemote<mojom::PolicyInstance> policy_remote) override; + void OnPowerInstanceReady( + mojo::PendingRemote<mojom::PowerInstance> power_remote) override; void OnPrintSpoolerInstanceReady( - mojom::PrintSpoolerInstancePtr print_spooler_ptr) override; - void OnProcessInstanceReady(mojom::ProcessInstancePtr process_ptr) override; + mojo::PendingRemote<mojom::PrintSpoolerInstance> print_spooler_remote) + override; + void OnProcessInstanceReady( + mojo::PendingRemote<mojom::ProcessInstance> process_remote) override; void OnPropertyInstanceReady( - mojom::PropertyInstancePtr property_ptr) override; + mojo::PendingRemote<mojom::PropertyInstance> property_remote) override; void OnRotationLockInstanceReady( - mojom::RotationLockInstancePtr rotation_lock_ptr) override; + mojo::PendingRemote<mojom::RotationLockInstance> rotation_lock_remote) + override; void OnScreenCaptureInstanceReady( - mojom::ScreenCaptureInstancePtr screen_capture_ptr) override; + mojo::PendingRemote<mojom::ScreenCaptureInstance> screen_capture_remote) + override; void OnSmartCardManagerInstanceReady( - mojom::SmartCardManagerInstancePtr smart_card_manager_ptr) override; + mojo::PendingRemote<mojom::SmartCardManagerInstance> + smart_card_manager_remote) override; void OnStorageManagerInstanceReady( - mojom::StorageManagerInstancePtr storage_manager_ptr) override; - void OnTimerInstanceReady(mojom::TimerInstancePtr timer_ptr) override; - void OnTracingInstanceReady(mojom::TracingInstancePtr trace_ptr) override; - void OnTtsInstanceReady(mojom::TtsInstancePtr tts_ptr) override; - void OnUsbHostInstanceReady(mojom::UsbHostInstancePtr usb_host_ptr) override; - void OnVideoInstanceReady(mojom::VideoInstancePtr video_ptr) override; + mojo::PendingRemote<mojom::StorageManagerInstance> storage_manager_remote) + override; + void OnTimerInstanceReady( + mojo::PendingRemote<mojom::TimerInstance> timer_remote) override; + void OnTracingInstanceReady( + mojo::PendingRemote<mojom::TracingInstance> trace_remote) override; + void OnTtsInstanceReady( + mojo::PendingRemote<mojom::TtsInstance> tts_remote) override; + void OnUsbHostInstanceReady( + mojo::PendingRemote<mojom::UsbHostInstance> usb_host_remote) override; + void OnVideoInstanceReady( + mojo::PendingRemote<mojom::VideoInstance> video_remote) override; void OnVoiceInteractionArcHomeInstanceReady( - mojom::VoiceInteractionArcHomeInstancePtr home_ptr) override; + mojo::PendingRemote<mojom::VoiceInteractionArcHomeInstance> home_remote) + override; void OnVoiceInteractionFrameworkInstanceReady( - mojom::VoiceInteractionFrameworkInstancePtr framework_ptr) override; + mojo::PendingRemote<mojom::VoiceInteractionFrameworkInstance> + framework_remote) override; void OnVolumeMounterInstanceReady( - mojom::VolumeMounterInstancePtr volume_mounter_ptr) override; + mojo::PendingRemote<mojom::VolumeMounterInstance> volume_mounter_remote) + override; void OnWakeLockInstanceReady( - mojom::WakeLockInstancePtr wake_lock_ptr) override; + mojo::PendingRemote<mojom::WakeLockInstance> wake_lock_remote) override; void OnWallpaperInstanceReady( - mojom::WallpaperInstancePtr wallpaper_ptr) override; + mojo::PendingRemote<mojom::WallpaperInstance> wallpaper_remote) override; private: // Called when the bridge channel is closed. This typically only happens when @@ -130,7 +168,7 @@ class ArcBridgeHostImpl : public mojom::ArcBridgeHost { // |T| is a ARC Mojo Instance type. template <typename InstanceType, typename HostType> void OnInstanceReady(ConnectionHolder<InstanceType, HostType>* holder, - mojo::InterfacePtr<InstanceType> ptr); + mojo::PendingRemote<InstanceType> remote); // Called if one of the established channels is closed. void OnChannelClosed(MojoChannelBase* channel); diff --git a/chromium/components/arc/session/arc_property_util.cc b/chromium/components/arc/session/arc_property_util.cc index 9b6498c51fe..0a4ca1a4c66 100644 --- a/chromium/components/arc/session/arc_property_util.cc +++ b/chromium/components/arc/session/arc_property_util.cc @@ -216,7 +216,8 @@ bool ExpandPropertyContents(const std::string& content, bool ExpandPropertyFile(const base::FilePath& input, const base::FilePath& output, - CrosConfig* config) { + CrosConfig* config, + bool append) { std::string content; std::string expanded; if (!base::ReadFileToString(input, &content)) { @@ -225,10 +226,17 @@ bool ExpandPropertyFile(const base::FilePath& input, } if (!ExpandPropertyContents(content, config, &expanded)) return false; - if (base::WriteFile(output, expanded.data(), expanded.size()) != - static_cast<int>(expanded.size())) { - PLOG(ERROR) << "Failed to write to " << output; - return false; + if (append && base::PathExists(output)) { + if (!base::AppendToFile(output, expanded.data(), expanded.size())) { + PLOG(ERROR) << "Failed to append to " << output; + return false; + } + } else { + if (base::WriteFile(output, expanded.data(), expanded.size()) != + static_cast<int>(expanded.size())) { + PLOG(ERROR) << "Failed to write to " << output; + return false; + } } return true; } @@ -287,22 +295,35 @@ bool TruncateAndroidPropertyForTesting(const std::string& line, bool ExpandPropertyFileForTesting(const base::FilePath& input, const base::FilePath& output, CrosConfig* config) { - return ExpandPropertyFile(input, output, config); + return ExpandPropertyFile(input, output, config, /*append=*/false); } bool ExpandPropertyFiles(const base::FilePath& source_path, - const base::FilePath& dest_path) { + const base::FilePath& dest_path, + bool single_file) { CrosConfig config; - for (const char* file : {"default.prop", "build.prop", "vendor_build.prop"}) { - if (!ExpandPropertyFile(source_path.Append(file), dest_path.Append(file), - &config)) { + if (single_file) + base::DeleteFile(dest_path, /*recursive=*/false); + + // default.prop may not exist. Silently skip it if not found. + for (const auto& pair : {std::pair<const char*, bool>{"default.prop", true}, + {"build.prop", false}, + {"vendor_build.prop", false}}) { + const char* file = pair.first; + const bool is_optional = pair.second; + + if (is_optional && !base::PathExists(source_path.Append(file))) + continue; + + if (!ExpandPropertyFile(source_path.Append(file), + single_file ? dest_path : dest_path.Append(file), + &config, + /*append=*/single_file)) { LOG(ERROR) << "Failed to expand " << source_path.Append(file); return false; } } - // Use the same permissions as stock Android for /vendor/build.prop. - return base::SetPosixFilePermissions(dest_path.Append("vendor_build.prop"), - 0600); + return true; } } // namespace arc diff --git a/chromium/components/arc/session/arc_property_util.h b/chromium/components/arc/session/arc_property_util.h index ce780cfc787..4748e563f94 100644 --- a/chromium/components/arc/session/arc_property_util.h +++ b/chromium/components/arc/session/arc_property_util.h @@ -57,10 +57,13 @@ bool ExpandPropertyFileForTesting(const base::FilePath& input, const base::FilePath& output, CrosConfig* config); -// Calls ExpandPropertyFile for {build,default}.prop files in |source_path|. -// Expanded files are written in |dest_path|. Returns true on success. +// Calls ExpandPropertyFile for {build,default,vendor_build}.prop files in +// |source_path|. Expanded files are written in |dest_path|. Returns true on +// success. When |single_file| is true, only one file (|dest_path| itself) is +// written. All expanded properties are included in the single file. bool ExpandPropertyFiles(const base::FilePath& source_path, - const base::FilePath& dest_path); + const base::FilePath& dest_path, + bool single_file); } // namespace arc diff --git a/chromium/components/arc/session/arc_property_util_unittest.cc b/chromium/components/arc/session/arc_property_util_unittest.cc index 29e8a5e0e13..1583bc1a5da 100644 --- a/chromium/components/arc/session/arc_property_util_unittest.cc +++ b/chromium/components/arc/session/arc_property_util_unittest.cc @@ -10,6 +10,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/strings/stringprintf.h" #include "chromeos/constants/chromeos_switches.h" #include "components/arc/test/fake_cros_config.h" #include "testing/gtest/include/gtest/gtest.h" @@ -286,36 +287,37 @@ TEST_F(ArcPropertyUtilTest, ExpandPropertyFile_CannotWrite) { path, base::FilePath("/nonexistent2"), config())); } -TEST_F(ArcPropertyUtilTest, ExpandPropertyFiles_NoSource) { +TEST_F(ArcPropertyUtilTest, ExpandPropertyFiles) { // Both source and dest are not found. EXPECT_FALSE(ExpandPropertyFiles(base::FilePath("/nonexistent1"), - base::FilePath("/nonexistent2"))); + base::FilePath("/nonexistent2"), + /*single_file=*/false)); // Both source and dest exist, but the source directory is empty. base::FilePath source_dir; ASSERT_TRUE(base::CreateTemporaryDirInDir(GetTempDir(), "test", &source_dir)); base::FilePath dest_dir; ASSERT_TRUE(base::CreateTemporaryDirInDir(GetTempDir(), "test", &dest_dir)); - EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_dir)); + EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_dir, false)); // Add default.prop to the source, but not build.prop. base::FilePath default_prop = source_dir.Append("default.prop"); constexpr const char kDefaultProp[] = "ro.foo=bar\n"; base::WriteFile(default_prop, kDefaultProp, strlen(kDefaultProp)); - EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_dir)); + EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_dir, false)); // Add build.prop too. The call should not succeed still. base::FilePath build_prop = source_dir.Append("build.prop"); constexpr const char kBuildProp[] = "ro.baz=boo\n"; base::WriteFile(build_prop, kBuildProp, strlen(kBuildProp)); - EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_dir)); + EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_dir, false)); // Add vendor_build.prop too. Then the call should succeed. base::FilePath vendor_build_prop = source_dir.Append("vendor_build.prop"); constexpr const char kVendorBuildProp[] = "ro.a=b\n"; base::WriteFile(vendor_build_prop, kVendorBuildProp, strlen(kVendorBuildProp)); - EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_dir)); + EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_dir, false)); // Verify all dest files are there. EXPECT_TRUE(base::PathExists(dest_dir.Append("default.prop"))); @@ -334,8 +336,100 @@ TEST_F(ArcPropertyUtilTest, ExpandPropertyFiles_NoSource) { base::ReadFileToString(dest_dir.Append("vendor_build.prop"), &content)); EXPECT_EQ(std::string(kVendorBuildProp) + "\n", content); + // Expand it again, verify the previous result is cleared. + EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_dir, false)); + EXPECT_TRUE( + base::ReadFileToString(dest_dir.Append("default.prop"), &content)); + EXPECT_EQ(std::string(kDefaultProp) + "\n", content); + + // If default.prop does not exist in the source path, it should still process + // the other files, while also ensuring that default.prop is removed from the + // destination path. + base::DeleteFile(dest_dir.Append("default.prop"), /*recursive=*/false); + + EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_dir, false)); + + EXPECT_TRUE(base::ReadFileToString(dest_dir.Append("build.prop"), &content)); + EXPECT_EQ(std::string(kBuildProp) + "\n", content); + EXPECT_TRUE( + base::ReadFileToString(dest_dir.Append("vendor_build.prop"), &content)); + EXPECT_EQ(std::string(kVendorBuildProp) + "\n", content); + + // Finally, test the case where source is valid but the dest is not. + EXPECT_FALSE( + ExpandPropertyFiles(source_dir, base::FilePath("/nonexistent"), false)); +} + +// Do the same as the previous test, but with |single_file| == true. +TEST_F(ArcPropertyUtilTest, ExpandPropertyFiles_SingleFile) { + // Both source and dest are not found. + EXPECT_FALSE(ExpandPropertyFiles(base::FilePath("/nonexistent1"), + base::FilePath("/nonexistent2"), + /*single_file=*/true)); + + // Both source and dest exist, but the source directory is empty. + base::FilePath source_dir; + ASSERT_TRUE(base::CreateTemporaryDirInDir(GetTempDir(), "test", &source_dir)); + base::FilePath dest_prop_file; + ASSERT_TRUE( + base::CreateTemporaryDirInDir(GetTempDir(), "test", &dest_prop_file)); + dest_prop_file = dest_prop_file.Append("combined.prop"); + EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_prop_file, true)); + + // Add default.prop to the source, but not build.prop. + base::FilePath default_prop = source_dir.Append("default.prop"); + constexpr const char kDefaultProp[] = "ro.foo=bar\n"; + base::WriteFile(default_prop, kDefaultProp, strlen(kDefaultProp)); + EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_prop_file, true)); + + // Add build.prop too. The call should not succeed still. + base::FilePath build_prop = source_dir.Append("build.prop"); + constexpr const char kBuildProp[] = "ro.baz=boo\n"; + base::WriteFile(build_prop, kBuildProp, strlen(kBuildProp)); + EXPECT_FALSE(ExpandPropertyFiles(source_dir, dest_prop_file, true)); + + // Add vendor_build.prop too. Then the call should succeed. + base::FilePath vendor_build_prop = source_dir.Append("vendor_build.prop"); + constexpr const char kVendorBuildProp[] = "ro.a=b\n"; + base::WriteFile(vendor_build_prop, kVendorBuildProp, + strlen(kVendorBuildProp)); + EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_prop_file, true)); + + // Verify only one dest file exists. + EXPECT_FALSE( + base::PathExists(dest_prop_file.DirName().Append("default.prop"))); + EXPECT_FALSE(base::PathExists(dest_prop_file.DirName().Append("build.prop"))); + EXPECT_FALSE( + base::PathExists(dest_prop_file.DirName().Append("vendor_build.prop"))); + EXPECT_TRUE(base::PathExists(dest_prop_file)); + + // Verify the content. + // Note: ExpandPropertyFileForTesting() adds a trailing LF. + std::string content; + EXPECT_TRUE(base::ReadFileToString(dest_prop_file, &content)); + EXPECT_EQ(base::StringPrintf("%s\n%s\n%s\n", kDefaultProp, kBuildProp, + kVendorBuildProp), + content); + + // Expand it again, verify the previous result is cleared. + EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_prop_file, true)); + EXPECT_TRUE(base::ReadFileToString(dest_prop_file, &content)); + EXPECT_EQ(base::StringPrintf("%s\n%s\n%s\n", kDefaultProp, kBuildProp, + kVendorBuildProp), + content); + + // If default.prop does not exist in the source path, it should still process + // the other files. + base::DeleteFile(source_dir.Append("default.prop"), + /*recursive=*/false); + EXPECT_TRUE(ExpandPropertyFiles(source_dir, dest_prop_file, true)); + EXPECT_TRUE(base::ReadFileToString(dest_prop_file, &content)); + EXPECT_EQ(base::StringPrintf("%s\n%s\n", kBuildProp, kVendorBuildProp), + content); + // Finally, test the case where source is valid but the dest is not. - EXPECT_FALSE(ExpandPropertyFiles(source_dir, base::FilePath("/nonexistent"))); + EXPECT_FALSE( + ExpandPropertyFiles(source_dir, base::FilePath("/nonexistent"), true)); } } // namespace diff --git a/chromium/components/arc/session/arc_session_impl.cc b/chromium/components/arc/session/arc_session_impl.cc index 3657d1c29a6..cecccda4961 100644 --- a/chromium/components/arc/session/arc_session_impl.cc +++ b/chromium/components/arc/session/arc_session_impl.cc @@ -375,7 +375,7 @@ void ArcSessionImpl::DoStartMiniInstance(size_t num_cores_disabled) { base::FeatureList::IsEnabled(arc::kNativeBridgeToggleFeature); params.arc_file_picker_experiment = base::FeatureList::IsEnabled(arc::kFilePickerExperimentFeature); - // Enable Custom Tabs only on Dev and Cannary, and only when Mash is enabled. + // Enable Custom Tabs only on Dev and Canary. const bool is_custom_tab_enabled = base::FeatureList::IsEnabled(arc::kCustomTabsExperimentFeature) && delegate_->GetChannel() != version_info::Channel::STABLE && diff --git a/chromium/components/arc/session/arc_vm_client_adapter.cc b/chromium/components/arc/session/arc_vm_client_adapter.cc index aed435c112f..c9ffbb891b0 100644 --- a/chromium/components/arc/session/arc_vm_client_adapter.cc +++ b/chromium/components/arc/session/arc_vm_client_adapter.cc @@ -114,11 +114,12 @@ std::string MonotonicTimestamp() { ArcBinaryTranslationType IdentifyBinaryTranslationType( const StartParams& start_params) { const auto* command_line = base::CommandLine::ForCurrentProcess(); - bool is_houdini_available = + const bool is_houdini_available = command_line->HasSwitch(chromeos::switches::kEnableHoudini) || command_line->HasSwitch(chromeos::switches::kEnableHoudini64); - bool is_ndk_translation_available = - command_line->HasSwitch(chromeos::switches::kEnableNdkTranslation); + const bool is_ndk_translation_available = + command_line->HasSwitch(chromeos::switches::kEnableNdkTranslation) || + command_line->HasSwitch(chromeos::switches::kEnableNdkTranslation64); if (!is_houdini_available && !is_ndk_translation_available) return ArcBinaryTranslationType::NONE; @@ -219,14 +220,6 @@ vm_tools::concierge::StartArcVmRequest CreateStartArcVmRequest( } request.add_params("init=/init"); - // TIP: When you want to see all dmesg logs from the Android system processes - // such as init, uncomment the following line. By default, the guest kernel - // rate-limits the logging and you might not be able to see all LOGs from - // them. The logs could be silently dropped. This is useful when modifying - // init.bertha.rc, for example. - // - // request.add_params("printk.devkmsg=on"); - for (auto& entry : kernel_cmdline) request.add_params(std::move(entry)); @@ -234,27 +227,21 @@ vm_tools::concierge::StartArcVmRequest CreateStartArcVmRequest( vm->set_kernel(file_system_status.guest_kernel_path().value()); - // Add / as /dev/vda. + // Add rootfs as /dev/vda. vm->set_rootfs(file_system_status.system_image_path().value()); request.set_rootfs_writable(file_system_status.is_host_rootfs_writable() && file_system_status.is_system_image_ext_format()); - // Add /vendor as /dev/vdb. + // Add /vendor as /dev/block/vdb. The device name has to be consistent with + // the one in GenerateFirstStageFstab() in ../arc_util.cc. vm_tools::concierge::DiskImage* disk_image = request.add_disks(); disk_image->set_path(file_system_status.vendor_image_path().value()); disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO); disk_image->set_writable(false); disk_image->set_do_mount(true); - // Add /vendor as /dev/vdc. - // TODO(yusukes): Remove /dev/vdc once Android side stops using it. - disk_image = request.add_disks(); - disk_image->set_path(file_system_status.vendor_image_path().value()); - disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO); - disk_image->set_writable(false); - disk_image->set_do_mount(true); - - // Add /run/imageloader/.../android_demo_apps.squash as /dev/vdd if needed. + // Add /run/imageloader/.../android_demo_apps.squash as /dev/block/vdc if + // needed. // TODO(b/144542975): Do this on upgrade instead. if (!demo_session_apps_path.empty()) { disk_image = request.add_disks(); @@ -482,7 +469,7 @@ class ArcVmClientAdapter : public ArcClientAdapter, OnArcInstanceStopped(); } - void ConciergeServiceRestarted() override {} + void ConciergeServiceStarted() override {} private: void OnArcBugReportBackedUp(bool result) { @@ -537,8 +524,6 @@ class ArcVmClientAdapter : public ArcClientAdapter, VLOG(1) << "OnArcVmServerProxyJobStopped: job " << (result ? "stopped" : "not running?"); - should_notify_observers_ = true; - // Make sure to stop arc-keymasterd if it's already started. Always move // |callback| as is and ignore |result|. chromeos::UpstartClient::Get()->StopJob( @@ -616,6 +601,8 @@ class ArcVmClientAdapter : public ArcClientAdapter, return; } std::move(callback).Run(true); + // StartMiniArc() successful. Update the member variable here. + should_notify_observers_ = true; } void OnConciergeStarted(UpgradeParams params, diff --git a/chromium/components/arc/session/arc_vm_client_adapter_unittest.cc b/chromium/components/arc/session/arc_vm_client_adapter_unittest.cc index 2328423e97b..067862033b5 100644 --- a/chromium/components/arc/session/arc_vm_client_adapter_unittest.cc +++ b/chromium/components/arc/session/arc_vm_client_adapter_unittest.cc @@ -58,7 +58,7 @@ constexpr int64_t kCid = 123; StartParams GetPopulatedStartParams() { StartParams params; - params.native_bridge_experiment = true; + params.native_bridge_experiment = false; params.lcd_density = 240; params.arc_file_picker_experiment = true; params.play_store_auto_update = @@ -483,6 +483,10 @@ TEST_F(ArcVmClientAdapterTest, StartMiniArc) { StartMiniArc(); // Confirm that no VM is started. ARCVM doesn't support mini ARC yet. EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called()); + + // TODO(wvk): Once mini VM is supported, call StopArcInstance() and + // SendVmStoppedSignal() here, then verify arc_instance_stopped_called() + // becomes true. See StopArcInstance test for more details. } // Tests that StartMiniArc() still succeeds even when Upstart fails to stop @@ -494,6 +498,10 @@ TEST_F(ArcVmClientAdapterTest, StartMiniArc_StopArcVmServerProxyJobFail) { StartMiniArc(); // Confirm that no VM is started. ARCVM doesn't support mini ARC yet. EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called()); + + // TODO(wvk): Once mini VM is supported, call StopArcInstance() here, + // then verify arc_instance_stopped_called() never becomes true. Same + // for other StartMiniArc_...Fail tests. } // Tests that StartMiniArc() fails if Upstart fails to start arc-keymasterd. @@ -517,7 +525,7 @@ TEST_F(ArcVmClientAdapterTest, StartMiniArc_StopArcKeymasterJobFail) { } // Tests that StartMiniArc() fails when Upstart fails to start the job. -TEST_F(ArcVmClientAdapterTest, StartMiniArc_Fail) { +TEST_F(ArcVmClientAdapterTest, StartMiniArc_StartArcVmPerBoardFeaturesJobFail) { // Inject failure to FakeUpstartClient. InjectUpstartStartJobFailure(kArcVmPerBoardFeaturesJobName); @@ -1011,11 +1019,11 @@ TEST_F(ArcVmClientAdapterTest, VmStartedSignal) { run_loop()->RunUntilIdle(); } -// Tests that ConciergeServiceRestarted() doesn't crash. -TEST_F(ArcVmClientAdapterTest, TestConciergeServiceRestarted) { +// Tests that ConciergeServiceStarted() doesn't crash. +TEST_F(ArcVmClientAdapterTest, TestConciergeServiceStarted) { StartMiniArc(); for (auto& observer : GetTestConciergeClient()->observer_list()) - observer.ConciergeServiceRestarted(); + observer.ConciergeServiceStarted(); } // Tests that the kernel parameter does not include "rw" by default. @@ -1090,8 +1098,8 @@ TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNone) { "androidboot.native_bridge=0")); } -// Tests that the binary translation type is set to Houdini when only Houdini -// library is enabled by USE flags. +// Tests that the binary translation type is set to Houdini when only 32-bit +// Houdini library is enabled by USE flags. TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeHoudini) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--enable-houdini"}); @@ -1104,8 +1112,8 @@ TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeHoudini) { "androidboot.native_bridge=libhoudini.so")); } -// Tests that the binary translation type is set to Houdini when only Houdini -// 64-bit library is enabled by USE flags. +// Tests that the binary translation type is set to Houdini when only 64-bit +// Houdini library is enabled by USE flags. TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeHoudini64) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--enable-houdini64"}); @@ -1119,7 +1127,7 @@ TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeHoudini64) { } // Tests that the binary translation type is set to NDK translation when only -// NDK translation library is enabled by USE flags. +// 32-bit NDK translation library is enabled by USE flags. TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNdkTranslation) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--enable-ndk-translation"}); @@ -1132,13 +1140,28 @@ TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNdkTranslation) { "androidboot.native_bridge=libndk_translation.so")); } +// Tests that the binary translation type is set to NDK translation when only +// 64-bit NDK translation library is enabled by USE flags. +TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNdkTranslation64) { + base::CommandLine::ForCurrentProcess()->InitFromArgv( + {"", "--enable-ndk-translation64"}); + StartParams start_params(GetPopulatedStartParams()); + SetValidUserInfo(); + StartMiniArcWithParams(true, std::move(start_params)); + UpgradeArc(true); + EXPECT_TRUE( + base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(), + "androidboot.native_bridge=libndk_translation.so")); +} + // Tests that the binary translation type is set to NDK translation when both // Houdini and NDK translation libraries are enabled by USE flags, and the -// parameter start_params.native_bridge_experiment is set. +// parameter start_params.native_bridge_experiment is set to true. TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNativeBridgeExperiment) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--enable-houdini", "--enable-ndk-translation"}); StartParams start_params(GetPopulatedStartParams()); + start_params.native_bridge_experiment = true; SetValidUserInfo(); StartMiniArcWithParams(true, std::move(start_params)); UpgradeArc(true); @@ -1149,7 +1172,7 @@ TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNativeBridgeExperiment) { // Tests that the binary translation type is set to Houdini when both Houdini // and NDK translation libraries are enabled by USE flags, and the parameter -// start_params.native_bridge_experiment is not set. +// start_params.native_bridge_experiment is set to false. TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNoNativeBridgeExperiment) { base::CommandLine::ForCurrentProcess()->InitFromArgv( {"", "--enable-houdini", "--enable-ndk-translation"}); diff --git a/chromium/components/arc/session/connection_holder.h b/chromium/components/arc/session/connection_holder.h index 0d35f5ff224..6dcfb061f3f 100644 --- a/chromium/components/arc/session/connection_holder.h +++ b/chromium/components/arc/session/connection_holder.h @@ -11,6 +11,7 @@ #include <utility> #include "base/bind.h" +#include "base/logging.h" #include "base/macros.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" @@ -133,8 +134,8 @@ class ConnectionHolderImpl { // When both the instance and host are ready, start connection. // TODO(crbug.com/750563): Fix the race issue. auto receiver = std::make_unique<mojo::Receiver<HostType>>(host_); - mojo::InterfacePtr<HostType> host_proxy; - receiver->Bind(mojo::MakeRequest(&host_proxy)); + mojo::PendingRemote<HostType> host_proxy; + receiver->Bind(host_proxy.InitWithNewPipeAndPassReceiver()); instance_->Init( std::move(host_proxy), base::BindOnce(&ConnectionHolderImpl::OnConnectionReady, diff --git a/chromium/components/arc/session/file_system_status.cc b/chromium/components/arc/session/file_system_status.cc index 3d0eb8f00f4..d4cccb9fcba 100644 --- a/chromium/components/arc/session/file_system_status.cc +++ b/chromium/components/arc/session/file_system_status.cc @@ -22,7 +22,7 @@ namespace { constexpr const char kArcVmConfigJsonPath[] = "/usr/share/arcvm/config.json"; constexpr const char kBuiltinPath[] = "/opt/google/vms/android"; -constexpr const char kFstab[] = "fstab"; +constexpr const char kFstabPath[] = "/run/arcvm/host_generated/fstab"; constexpr const char kKernel[] = "vmlinux"; constexpr const char kRootFs[] = "system.raw.img"; constexpr const char kVendorImage[] = "vendor.raw.img"; @@ -41,7 +41,7 @@ FileSystemStatus::FileSystemStatus() system_image_path_(base::FilePath(kBuiltinPath).Append(kRootFs)), vendor_image_path_(base::FilePath(kBuiltinPath).Append(kVendorImage)), guest_kernel_path_(base::FilePath(kBuiltinPath).Append(kKernel)), - fstab_path_(base::FilePath(kBuiltinPath).Append(kFstab)), + fstab_path_(kFstabPath), is_system_image_ext_format_(IsSystemImageExtFormat(system_image_path_)) {} // static |