feat: support complete WebUSB device properties (#47459)

* feat: support complete WebUSB device properties

* docs: correct type consistency
This commit is contained in:
Shelley Vohr
2025-06-30 10:28:21 +02:00
committed by GitHub
parent c2302960a8
commit e299a1d098
2 changed files with 121 additions and 11 deletions

View File

@@ -98,6 +98,98 @@ base::Value UsbChooserContext::DeviceInfoToValue(
device_value.Set("deviceVersionMinor", device_info.device_version_minor);
device_value.Set("deviceVersionSubminor",
device_info.device_version_subminor);
bool has_active_configuration = false;
base::Value::List configuration_list;
for (const auto& configuration : device_info.configurations) {
base::Value::Dict configuration_value;
configuration_value.Set("configurationValue",
configuration->configuration_value);
configuration_value.Set("configurationName",
configuration->configuration_name
? *configuration->configuration_name
: std::u16string_view());
for (const auto& interface : configuration->interfaces) {
base::Value::Dict interface_value;
interface_value.Set("interfaceNumber", interface->interface_number);
base::Value::List alternate_list;
for (const auto& alternate : interface->alternates) {
base::Value::Dict alternate_value;
alternate_value.Set("alternateSetting", alternate->alternate_setting);
alternate_value.Set("interfaceClass", alternate->class_code);
alternate_value.Set("interfaceSubclass", alternate->subclass_code);
alternate_value.Set("interfaceProtocol", alternate->protocol_code);
alternate_value.Set("interfaceName", alternate->interface_name
? *alternate->interface_name
: std::u16string_view());
base::Value::List endpoint_list;
for (const auto& endpoint : alternate->endpoints) {
base::Value::Dict endpoint_value;
endpoint_value.Set("endpointNumber", endpoint->endpoint_number);
bool inbound = endpoint->direction ==
device::mojom::UsbTransferDirection::INBOUND;
endpoint_value.Set("direction", inbound ? "in" : "out");
std::string type;
switch (endpoint->type) {
case device::mojom::UsbTransferType::ISOCHRONOUS:
type = "isochronous";
break;
case device::mojom::UsbTransferType::BULK:
type = "bulk";
break;
case device::mojom::UsbTransferType::INTERRUPT:
type = "interrupt";
break;
default:
NOTREACHED() << "Unknown USB transfer type: "
<< static_cast<int>(endpoint->type);
}
endpoint_value.Set("type", type);
endpoint_value.Set("packetSize",
static_cast<int>(endpoint->packet_size));
endpoint_list.Append(std::move(endpoint_value));
}
alternate_value.Set("endpoints", base::Value(std::move(endpoint_list)));
if (alternate->alternate_setting == 0) {
auto active_alternate_value = alternate_value.Clone();
interface_value.Set("alternate", std::move(active_alternate_value));
}
alternate_list.Append(std::move(alternate_value));
}
interface_value.Set("alternates", std::move(alternate_list));
configuration_value.Set("interfaces",
base::Value(std::move(interface_value)));
}
if (device_info.active_configuration &&
device_info.active_configuration ==
configuration->configuration_value) {
auto active_configuration_value = configuration_value.Clone();
has_active_configuration = true;
configuration_value.Set("configuration",
std::move(active_configuration_value));
}
configuration_list.Append(std::move(configuration_value));
}
device_value.Set("configurations", std::move(configuration_list));
// Set value for "configuration" to null if no active configuration.
if (!has_active_configuration) {
device_value.Set("configuration", base::Value());
}
return base::Value(std::move(device_value));
}