mirror of
https://github.com/electron/electron.git
synced 2026-01-08 23:18:06 -05:00
feat: support complete WebUSB device properties (#47459)
* feat: support complete WebUSB device properties * docs: correct type consistency
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user