| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/webusb/USB.h" | 5 #include "modules/webusb/USB.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ScriptPromise.h" | 7 #include "bindings/core/v8/ScriptPromise.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "core/dom/DOMException.h" | 9 #include "core/dom/DOMException.h" |
| 10 #include "core/dom/Document.h" | 10 #include "core/dom/Document.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 } | 138 } |
| 139 | 139 |
| 140 void USB::contextDestroyed() | 140 void USB::contextDestroyed() |
| 141 { | 141 { |
| 142 m_deviceManager.reset(); | 142 m_deviceManager.reset(); |
| 143 m_deviceManagerRequests.clear(); | 143 m_deviceManagerRequests.clear(); |
| 144 m_chooserService.reset(); | 144 m_chooserService.reset(); |
| 145 m_chooserServiceRequests.clear(); | 145 m_chooserServiceRequests.clear(); |
| 146 } | 146 } |
| 147 | 147 |
| 148 USBDevice* USB::getOrCreateDevice(usb::DeviceInfoPtr deviceInfo) |
| 149 { |
| 150 USBDevice* device = m_deviceCache.get(deviceInfo->guid); |
| 151 if (!device) { |
| 152 String guid = deviceInfo->guid; |
| 153 usb::DevicePtr pipe; |
| 154 m_deviceManager->GetDevice(guid, mojo::GetProxy(&pipe)); |
| 155 device = USBDevice::create(std::move(deviceInfo), std::move(pipe), getEx
ecutionContext()); |
| 156 m_deviceCache.add(guid, device); |
| 157 } |
| 158 return device; |
| 159 } |
| 160 |
| 148 void USB::onGetDevices(ScriptPromiseResolver* resolver, mojo::WTFArray<usb::Devi
ceInfoPtr> deviceInfos) | 161 void USB::onGetDevices(ScriptPromiseResolver* resolver, mojo::WTFArray<usb::Devi
ceInfoPtr> deviceInfos) |
| 149 { | 162 { |
| 150 auto requestEntry = m_deviceManagerRequests.find(resolver); | 163 auto requestEntry = m_deviceManagerRequests.find(resolver); |
| 151 if (requestEntry == m_deviceManagerRequests.end()) | 164 if (requestEntry == m_deviceManagerRequests.end()) |
| 152 return; | 165 return; |
| 153 m_deviceManagerRequests.remove(requestEntry); | 166 m_deviceManagerRequests.remove(requestEntry); |
| 154 | 167 |
| 155 HeapVector<Member<USBDevice>> devices; | 168 HeapVector<Member<USBDevice>> devices; |
| 156 for (auto& deviceInfo : deviceInfos.PassStorage()) { | 169 for (auto& deviceInfo : deviceInfos.PassStorage()) |
| 157 usb::DevicePtr device; | 170 devices.append(getOrCreateDevice(std::move(deviceInfo))); |
| 158 m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); | |
| 159 devices.append(USBDevice::create(std::move(deviceInfo), std::move(device
), resolver->getExecutionContext())); | |
| 160 } | |
| 161 resolver->resolve(devices); | 171 resolver->resolve(devices); |
| 162 m_deviceManagerRequests.remove(resolver); | 172 m_deviceManagerRequests.remove(resolver); |
| 163 } | 173 } |
| 164 | 174 |
| 165 void USB::onGetPermission(ScriptPromiseResolver* resolver, usb::DeviceInfoPtr de
viceInfo) | 175 void USB::onGetPermission(ScriptPromiseResolver* resolver, usb::DeviceInfoPtr de
viceInfo) |
| 166 { | 176 { |
| 167 auto requestEntry = m_chooserServiceRequests.find(resolver); | 177 auto requestEntry = m_chooserServiceRequests.find(resolver); |
| 168 if (requestEntry == m_chooserServiceRequests.end()) | 178 if (requestEntry == m_chooserServiceRequests.end()) |
| 169 return; | 179 return; |
| 170 m_chooserServiceRequests.remove(requestEntry); | 180 m_chooserServiceRequests.remove(requestEntry); |
| 171 | 181 |
| 172 if (!m_deviceManager) { | 182 if (!m_deviceManager) { |
| 173 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 183 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
| 174 return; | 184 return; |
| 175 } | 185 } |
| 176 | 186 |
| 177 if (deviceInfo) { | 187 if (deviceInfo) |
| 178 usb::DevicePtr device; | 188 resolver->resolve(getOrCreateDevice(std::move(deviceInfo))); |
| 179 m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); | 189 else |
| 180 resolver->resolve(USBDevice::create(std::move(deviceInfo), std::move(dev
ice), resolver->getExecutionContext())); | |
| 181 } else { | |
| 182 resolver->reject(DOMException::create(NotFoundError, "No device selected
.")); | 190 resolver->reject(DOMException::create(NotFoundError, "No device selected
.")); |
| 183 } | |
| 184 } | 191 } |
| 185 | 192 |
| 186 void USB::OnDeviceAdded(usb::DeviceInfoPtr deviceInfo) | 193 void USB::OnDeviceAdded(usb::DeviceInfoPtr deviceInfo) |
| 187 { | 194 { |
| 188 if (!m_deviceManager) | 195 if (!m_deviceManager) |
| 189 return; | 196 return; |
| 190 | 197 |
| 191 usb::DevicePtr device; | 198 dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, getOrCreat
eDevice(std::move(deviceInfo)))); |
| 192 m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); | |
| 193 dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, USBDevice:
:create(std::move(deviceInfo), std::move(device), getExecutionContext()))); | |
| 194 } | 199 } |
| 195 | 200 |
| 196 void USB::OnDeviceRemoved(usb::DeviceInfoPtr deviceInfo) | 201 void USB::OnDeviceRemoved(usb::DeviceInfoPtr deviceInfo) |
| 197 { | 202 { |
| 198 dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, USBDevi
ce::create(std::move(deviceInfo), nullptr, getExecutionContext()))); | 203 String guid = deviceInfo->guid; |
| 204 USBDevice* device = m_deviceCache.get(guid); |
| 205 if (!device) |
| 206 device = USBDevice::create(std::move(deviceInfo), nullptr, getExecutionC
ontext()); |
| 207 dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, device)
); |
| 208 m_deviceCache.remove(guid); |
| 199 } | 209 } |
| 200 | 210 |
| 201 void USB::onDeviceManagerConnectionError() | 211 void USB::onDeviceManagerConnectionError() |
| 202 { | 212 { |
| 203 m_deviceManager.reset(); | 213 m_deviceManager.reset(); |
| 204 for (ScriptPromiseResolver* resolver : m_deviceManagerRequests) | 214 for (ScriptPromiseResolver* resolver : m_deviceManagerRequests) |
| 205 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 215 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
| 206 m_deviceManagerRequests.clear(); | 216 m_deviceManagerRequests.clear(); |
| 207 } | 217 } |
| 208 | 218 |
| 209 void USB::onChooserServiceConnectionError() | 219 void USB::onChooserServiceConnectionError() |
| 210 { | 220 { |
| 211 m_chooserService.reset(); | 221 m_chooserService.reset(); |
| 212 for (ScriptPromiseResolver* resolver : m_chooserServiceRequests) | 222 for (ScriptPromiseResolver* resolver : m_chooserServiceRequests) |
| 213 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 223 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
| 214 m_chooserServiceRequests.clear(); | 224 m_chooserServiceRequests.clear(); |
| 215 } | 225 } |
| 216 | 226 |
| 217 DEFINE_TRACE(USB) | 227 DEFINE_TRACE(USB) |
| 218 { | 228 { |
| 219 EventTargetWithInlineData::trace(visitor); | 229 EventTargetWithInlineData::trace(visitor); |
| 220 ContextLifecycleObserver::trace(visitor); | 230 ContextLifecycleObserver::trace(visitor); |
| 221 visitor->trace(m_deviceManagerRequests); | 231 visitor->trace(m_deviceManagerRequests); |
| 222 visitor->trace(m_chooserServiceRequests); | 232 visitor->trace(m_chooserServiceRequests); |
| 233 visitor->trace(m_deviceCache); |
| 223 } | 234 } |
| 224 | 235 |
| 225 } // namespace blink | 236 } // namespace blink |
| OLD | NEW |