Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(942)

Unified Diff: third_party/WebKit/Source/modules/webusb/USB.cpp

Issue 1963183003: WebUSB: Remove guid property from USBDevice. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update webexposed. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « third_party/WebKit/Source/modules/webusb/USB.h ('k') | third_party/WebKit/Source/modules/webusb/USBDevice.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698