fix: WebUSB should not crash when using in-memory partitions (#42347)

This commit is contained in:
Shelley Vohr 2024-06-04 15:24:08 +02:00 committed by GitHub
parent b74d3e14b0
commit 39c984e23a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 68 additions and 14 deletions

View file

@ -174,6 +174,9 @@ std::unique_ptr<content::UsbChooser> ElectronUsbDelegate::RunChooser(
bool ElectronUsbDelegate::CanRequestDevicePermission(
content::BrowserContext* browser_context,
const url::Origin& origin) {
if (!browser_context)
return false;
base::Value::Dict details;
details.Set("securityOrigin", origin.GetURL().spec());
auto* permission_manager = static_cast<ElectronPermissionManager*>(
@ -188,32 +191,46 @@ void ElectronUsbDelegate::RevokeDevicePermissionWebInitiated(
content::BrowserContext* browser_context,
const url::Origin& origin,
const device::mojom::UsbDeviceInfo& device) {
GetChooserContext(browser_context)
->RevokeDevicePermissionWebInitiated(origin, device);
auto* chooser_context = GetChooserContext(browser_context);
if (chooser_context) {
chooser_context->RevokeDevicePermissionWebInitiated(origin, device);
}
}
const device::mojom::UsbDeviceInfo* ElectronUsbDelegate::GetDeviceInfo(
content::BrowserContext* browser_context,
const std::string& guid) {
return GetChooserContext(browser_context)->GetDeviceInfo(guid);
auto* chooser_context = GetChooserContext(browser_context);
if (!chooser_context)
return nullptr;
return chooser_context->GetDeviceInfo(guid);
}
bool ElectronUsbDelegate::HasDevicePermission(
content::BrowserContext* browser_context,
content::RenderFrameHost* frame,
const url::Origin& origin,
const device::mojom::UsbDeviceInfo& device) {
if (IsDevicePermissionAutoGranted(origin, device))
const device::mojom::UsbDeviceInfo& device_info) {
if (IsDevicePermissionAutoGranted(origin, device_info))
return true;
auto* chooser_context = GetChooserContext(browser_context);
if (!chooser_context)
return false;
return GetChooserContext(browser_context)
->HasDevicePermission(origin, device);
->HasDevicePermission(origin, device_info);
}
void ElectronUsbDelegate::GetDevices(
content::BrowserContext* browser_context,
blink::mojom::WebUsbService::GetDevicesCallback callback) {
GetChooserContext(browser_context)->GetDevices(std::move(callback));
auto* chooser_context = GetChooserContext(browser_context);
if (!chooser_context) {
std::move(callback).Run(std::vector<device::mojom::UsbDeviceInfoPtr>());
return;
}
chooser_context->GetDevices(std::move(callback));
}
void ElectronUsbDelegate::GetDevice(
@ -222,25 +239,35 @@ void ElectronUsbDelegate::GetDevice(
base::span<const uint8_t> blocked_interface_classes,
mojo::PendingReceiver<device::mojom::UsbDevice> device_receiver,
mojo::PendingRemote<device::mojom::UsbDeviceClient> device_client) {
GetChooserContext(browser_context)
->GetDevice(guid, blocked_interface_classes, std::move(device_receiver),
std::move(device_client));
auto* chooser_context = GetChooserContext(browser_context);
if (chooser_context) {
chooser_context->GetDevice(guid, blocked_interface_classes,
std::move(device_receiver),
std::move(device_client));
}
}
void ElectronUsbDelegate::AddObserver(content::BrowserContext* browser_context,
Observer* observer) {
if (!browser_context)
return;
GetContextObserver(browser_context)->AddObserver(observer);
}
void ElectronUsbDelegate::RemoveObserver(
content::BrowserContext* browser_context,
Observer* observer) {
if (!browser_context)
return;
GetContextObserver(browser_context)->RemoveObserver(observer);
}
ElectronUsbDelegate::ContextObservation*
ElectronUsbDelegate::GetContextObserver(
content::BrowserContext* browser_context) {
CHECK(browser_context);
if (!base::Contains(observations_, browser_context)) {
observations_.emplace(browser_context, std::make_unique<ContextObservation>(
this, browser_context));