| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/lacros/drivefs_native_message_host_bridge_lacros.h" |
| |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chromeos/drivefs/drivefs_native_message_host.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chromeos/components/drivefs/mojom/drivefs_native_messaging.mojom.h" |
| #include "chromeos/crosapi/mojom/drive_integration_service.mojom.h" |
| #include "chromeos/lacros/lacros_service.h" |
| |
| namespace drive { |
| |
| namespace { |
| |
| void ConnectToExtensionWithProfile( |
| drivefs::mojom::ExtensionConnectionParamsPtr params, |
| mojo::PendingReceiver<drivefs::mojom::NativeMessagingPort> |
| extension_receiver, |
| mojo::PendingRemote<drivefs::mojom::NativeMessagingHost> drivefs_remote, |
| DriveFsNativeMessageHostBridge::ConnectToExtensionCallback callback, |
| Profile* profile) { |
| if (g_browser_process->IsShuttingDown() || !profile) { |
| std::move(callback).Run( |
| drivefs::mojom::ExtensionConnectionStatus::kUnknownError); |
| return; |
| } |
| |
| std::move(callback).Run(ConnectToDriveFsNativeMessageExtension( |
| profile, params->extension_id, std::move(extension_receiver), |
| std::move(drivefs_remote))); |
| } |
| |
| } // namespace |
| |
| DriveFsNativeMessageHostBridge::DriveFsNativeMessageHostBridge() |
| : receiver_(this) { |
| chromeos::LacrosService* lacros_service = chromeos::LacrosService::Get(); |
| if (!lacros_service->IsAvailable<crosapi::mojom::DriveIntegrationService>()) { |
| return; |
| } |
| |
| const int drive_service_version = |
| lacros_service |
| ->GetInterfaceVersion<crosapi::mojom::DriveIntegrationService>(); |
| constexpr int min_required_version = static_cast<int>( |
| crosapi::mojom::DriveIntegrationService::MethodMinVersions:: |
| kRegisterDriveFsNativeMessageHostBridgeMinVersion); |
| if (drive_service_version < min_required_version) { |
| LOG(WARNING) << "Could not register the DriveFS native message host bridge " |
| "as ash is too old."; |
| return; |
| } |
| |
| lacros_service->GetRemote<crosapi::mojom::DriveIntegrationService>() |
| ->RegisterDriveFsNativeMessageHostBridge( |
| receiver_.BindNewPipeAndPassRemote()); |
| } |
| |
| DriveFsNativeMessageHostBridge::~DriveFsNativeMessageHostBridge() = default; |
| |
| void DriveFsNativeMessageHostBridge::ConnectToExtension( |
| drivefs::mojom::ExtensionConnectionParamsPtr params, |
| mojo::PendingReceiver<drivefs::mojom::NativeMessagingPort> |
| extension_receiver, |
| mojo::PendingRemote<drivefs::mojom::NativeMessagingHost> drivefs_remote, |
| ConnectToExtensionCallback callback) { |
| g_browser_process->profile_manager()->LoadProfileByPath( |
| ProfileManager::GetPrimaryUserProfilePath(), |
| /*incognito=*/false, |
| base::BindOnce(ConnectToExtensionWithProfile, std::move(params), |
| std::move(extension_receiver), std::move(drivefs_remote), |
| std::move(callback))); |
| } |
| |
| } // namespace drive |