Index: third_party/WebKit/Source/modules/webusb/USB.cpp |
diff --git a/third_party/WebKit/Source/modules/webusb/USB.cpp b/third_party/WebKit/Source/modules/webusb/USB.cpp |
index 4d5c36a448839089e42b79539c54c1a30e64ca6a..66cc0630b2b87fd96888d039087df5ea219bd12e 100644 |
--- a/third_party/WebKit/Source/modules/webusb/USB.cpp |
+++ b/third_party/WebKit/Source/modules/webusb/USB.cpp |
@@ -145,6 +145,19 @@ void USB::contextDestroyed() |
m_chooserServiceRequests.clear(); |
} |
+USBDevice* USB::getOrCreateDevice(usb::DeviceInfoPtr deviceInfo) |
+{ |
+ USBDevice* device = m_deviceCache.get(deviceInfo->guid); |
+ if (!device) { |
+ String guid = deviceInfo->guid; |
+ usb::DevicePtr pipe; |
+ m_deviceManager->GetDevice(guid, mojo::GetProxy(&pipe)); |
+ device = USBDevice::create(std::move(deviceInfo), std::move(pipe), getExecutionContext()); |
+ m_deviceCache.add(guid, device); |
+ } |
+ return device; |
+} |
+ |
void USB::onGetDevices(ScriptPromiseResolver* resolver, mojo::WTFArray<usb::DeviceInfoPtr> deviceInfos) |
{ |
auto requestEntry = m_deviceManagerRequests.find(resolver); |
@@ -153,11 +166,8 @@ void USB::onGetDevices(ScriptPromiseResolver* resolver, mojo::WTFArray<usb::Devi |
m_deviceManagerRequests.remove(requestEntry); |
HeapVector<Member<USBDevice>> devices; |
- for (auto& deviceInfo : deviceInfos.PassStorage()) { |
- usb::DevicePtr device; |
- m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); |
- devices.append(USBDevice::create(std::move(deviceInfo), std::move(device), resolver->getExecutionContext())); |
- } |
+ for (auto& deviceInfo : deviceInfos.PassStorage()) |
+ devices.append(getOrCreateDevice(std::move(deviceInfo))); |
resolver->resolve(devices); |
m_deviceManagerRequests.remove(resolver); |
} |
@@ -174,13 +184,10 @@ void USB::onGetPermission(ScriptPromiseResolver* resolver, usb::DeviceInfoPtr de |
return; |
} |
- if (deviceInfo) { |
- usb::DevicePtr device; |
- m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); |
- resolver->resolve(USBDevice::create(std::move(deviceInfo), std::move(device), resolver->getExecutionContext())); |
- } else { |
+ if (deviceInfo) |
+ resolver->resolve(getOrCreateDevice(std::move(deviceInfo))); |
+ else |
resolver->reject(DOMException::create(NotFoundError, "No device selected.")); |
- } |
} |
void USB::OnDeviceAdded(usb::DeviceInfoPtr deviceInfo) |
@@ -188,14 +195,17 @@ void USB::OnDeviceAdded(usb::DeviceInfoPtr deviceInfo) |
if (!m_deviceManager) |
return; |
- usb::DevicePtr device; |
- m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); |
- dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, USBDevice::create(std::move(deviceInfo), std::move(device), getExecutionContext()))); |
+ dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, getOrCreateDevice(std::move(deviceInfo)))); |
} |
void USB::OnDeviceRemoved(usb::DeviceInfoPtr deviceInfo) |
{ |
- dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, USBDevice::create(std::move(deviceInfo), nullptr, getExecutionContext()))); |
+ String guid = deviceInfo->guid; |
+ USBDevice* device = m_deviceCache.get(guid); |
+ if (!device) |
+ device = USBDevice::create(std::move(deviceInfo), nullptr, getExecutionContext()); |
+ dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, device)); |
+ m_deviceCache.remove(guid); |
} |
void USB::onDeviceManagerConnectionError() |
@@ -220,6 +230,7 @@ DEFINE_TRACE(USB) |
ContextLifecycleObserver::trace(visitor); |
visitor->trace(m_deviceManagerRequests); |
visitor->trace(m_chooserServiceRequests); |
+ visitor->trace(m_deviceCache); |
} |
} // namespace blink |