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 |