summaryrefslogtreecommitdiff
path: root/chromium/components/arc/session
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/arc/session')
-rw-r--r--chromium/components/arc/session/arc_bridge_host_impl.cc237
-rw-r--r--chromium/components/arc/session/arc_bridge_host_impl.h146
-rw-r--r--chromium/components/arc/session/arc_property_util.cc47
-rw-r--r--chromium/components/arc/session/arc_property_util.h9
-rw-r--r--chromium/components/arc/session/arc_property_util_unittest.cc108
-rw-r--r--chromium/components/arc/session/arc_session_impl.cc2
-rw-r--r--chromium/components/arc/session/arc_vm_client_adapter.cc37
-rw-r--r--chromium/components/arc/session/arc_vm_client_adapter_unittest.cc47
-rw-r--r--chromium/components/arc/session/connection_holder.h5
-rw-r--r--chromium/components/arc/session/file_system_status.cc4
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