blob: 3c7919f78671856d17a9683a6429abf2f9f0ca41 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/settings/chromeos/guest_os_handler.h"
#include <string>
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "chrome/browser/ash/guest_os/guest_os_share_path.h"
#include "chrome/browser/chromeos/file_manager/path_util.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
namespace chromeos {
namespace {
base::ListValue GetSharableUsbDevices(CrosUsbDetector* detector) {
base::ListValue usb_devices_list;
for (const auto& device : detector->GetShareableDevices()) {
base::Value device_info(base::Value::Type::DICTIONARY);
device_info.SetStringKey("guid", device.guid);
device_info.SetStringKey("label", device.label);
if (device.shared_vm_name)
device_info.SetStringKey("sharedWith", device.shared_vm_name.value());
device_info.SetBoolKey("promptBeforeSharing", device.prompt_before_sharing);
usb_devices_list.Append(std::move(device_info));
}
return usb_devices_list;
}
} // namespace
namespace settings {
GuestOsHandler::GuestOsHandler(Profile* profile) : profile_(profile) {}
GuestOsHandler::~GuestOsHandler() = default;
void GuestOsHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"getGuestOsSharedPathsDisplayText",
base::BindRepeating(
&GuestOsHandler::HandleGetGuestOsSharedPathsDisplayText,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"removeGuestOsSharedPath",
base::BindRepeating(&GuestOsHandler::HandleRemoveGuestOsSharedPath,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"notifyGuestOsSharedUsbDevicesPageReady",
base::BindRepeating(
&GuestOsHandler::HandleNotifyGuestOsSharedUsbDevicesPageReady,
weak_ptr_factory_.GetWeakPtr()));
web_ui()->RegisterMessageCallback(
"setGuestOsUsbDeviceShared",
base::BindRepeating(&GuestOsHandler::HandleSetGuestOsUsbDeviceShared,
weak_ptr_factory_.GetWeakPtr()));
}
void GuestOsHandler::OnJavascriptAllowed() {
if (auto* detector = chromeos::CrosUsbDetector::Get()) {
cros_usb_device_observation_.Observe(detector);
}
}
void GuestOsHandler::OnJavascriptDisallowed() {
cros_usb_device_observation_.Reset();
}
void GuestOsHandler::HandleGetGuestOsSharedPathsDisplayText(
const base::ListValue* args) {
AllowJavascript();
CHECK_EQ(2U, args->GetSize());
std::string callback_id = args->GetList()[0].GetString();
base::ListValue texts;
for (const auto& path : args->GetList()[1].GetList()) {
texts.AppendString(file_manager::util::GetPathDisplayTextForSettings(
profile_, path.GetString()));
}
ResolveJavascriptCallback(base::Value(callback_id), texts);
}
void GuestOsHandler::HandleRemoveGuestOsSharedPath(
const base::ListValue* args) {
CHECK_EQ(3U, args->GetList().size());
std::string callback_id = args->GetList()[0].GetString();
std::string vm_name = args->GetList()[1].GetString();
std::string path = args->GetList()[2].GetString();
guest_os::GuestOsSharePath::GetForProfile(profile_)->UnsharePath(
vm_name, base::FilePath(path),
/*unpersist=*/true,
base::BindOnce(&GuestOsHandler::OnGuestOsSharedPathRemoved,
weak_ptr_factory_.GetWeakPtr(), callback_id, path));
}
void GuestOsHandler::OnGuestOsSharedPathRemoved(
const std::string& callback_id,
const std::string& path,
bool success,
const std::string& failure_reason) {
if (!success) {
LOG(ERROR) << "Error unsharing " << path << ": " << failure_reason;
}
ResolveJavascriptCallback(base::Value(callback_id), base::Value(success));
}
void GuestOsHandler::HandleNotifyGuestOsSharedUsbDevicesPageReady(
const base::ListValue* args) {
AllowJavascript();
OnUsbDevicesChanged();
}
void GuestOsHandler::HandleSetGuestOsUsbDeviceShared(
const base::ListValue* args) {
CHECK_EQ(3U, args->GetList().size());
const auto& args_list = args->GetList();
const std::string& vm_name = args_list[0].GetString();
const std::string& guid = args_list[1].GetString();
bool shared = args_list[2].GetBool();
chromeos::CrosUsbDetector* detector = chromeos::CrosUsbDetector::Get();
if (!detector)
return;
if (shared) {
detector->AttachUsbDeviceToVm(vm_name, guid, base::DoNothing());
return;
}
detector->DetachUsbDeviceFromVm(vm_name, guid, base::DoNothing());
}
void GuestOsHandler::OnUsbDevicesChanged() {
chromeos::CrosUsbDetector* detector = chromeos::CrosUsbDetector::Get();
DCHECK(detector); // This callback is called by the detector.
FireWebUIListener("guest-os-shared-usb-devices-changed",
GetSharableUsbDevices(detector));
}
} // namespace settings
} // namespace chromeos