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/USBDevice.h" | 5 #include "modules/webusb/USBDevice.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 "bindings/core/v8/ToV8.h" | 9 #include "bindings/core/v8/ToV8.h" |
10 #include "core/dom/DOMArrayBuffer.h" | 10 #include "core/dom/DOMArrayBuffer.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 | 87 |
88 USBDevice::USBDevice(usb::DeviceInfoPtr deviceInfo, usb::DevicePtr device, Execu
tionContext* context) | 88 USBDevice::USBDevice(usb::DeviceInfoPtr deviceInfo, usb::DevicePtr device, Execu
tionContext* context) |
89 : ContextLifecycleObserver(context) | 89 : ContextLifecycleObserver(context) |
90 , m_deviceInfo(std::move(deviceInfo)) | 90 , m_deviceInfo(std::move(deviceInfo)) |
91 , m_device(std::move(device)) | 91 , m_device(std::move(device)) |
92 , m_opened(false) | 92 , m_opened(false) |
93 , m_deviceStateChangeInProgress(false) | 93 , m_deviceStateChangeInProgress(false) |
94 , m_configurationIndex(-1) | 94 , m_configurationIndex(-1) |
95 { | 95 { |
96 if (m_device) | 96 if (m_device) |
97 m_device.set_connection_error_handler(createBaseCallback(bind(&USBDevice
::onConnectionError, wrapWeakPersistent(this)))); | 97 m_device.set_connection_error_handler(createBaseCallback(WTF::bind(&USBD
evice::onConnectionError, wrapWeakPersistent(this)))); |
98 int configurationIndex = findConfigurationIndex(info().active_configuration)
; | 98 int configurationIndex = findConfigurationIndex(info().active_configuration)
; |
99 if (configurationIndex != -1) | 99 if (configurationIndex != -1) |
100 onConfigurationSelected(true /* success */, configurationIndex); | 100 onConfigurationSelected(true /* success */, configurationIndex); |
101 } | 101 } |
102 | 102 |
103 USBDevice::~USBDevice() | 103 USBDevice::~USBDevice() |
104 { | 104 { |
105 // |m_device| may still be valid but there should be no more outstanding | 105 // |m_device| may still be valid but there should be no more outstanding |
106 // requests because each holds a persistent handle to this object. | 106 // requests because each holds a persistent handle to this object. |
107 DCHECK(m_deviceRequests.isEmpty()); | 107 DCHECK(m_deviceRequests.isEmpty()); |
(...skipping 28 matching lines...) Expand all Loading... |
136 ScriptPromise USBDevice::open(ScriptState* scriptState) | 136 ScriptPromise USBDevice::open(ScriptState* scriptState) |
137 { | 137 { |
138 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 138 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
139 ScriptPromise promise = resolver->promise(); | 139 ScriptPromise promise = resolver->promise(); |
140 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 140 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
141 if (m_opened) { | 141 if (m_opened) { |
142 resolver->resolve(); | 142 resolver->resolve(); |
143 } else { | 143 } else { |
144 m_deviceStateChangeInProgress = true; | 144 m_deviceStateChangeInProgress = true; |
145 m_deviceRequests.add(resolver); | 145 m_deviceRequests.add(resolver); |
146 m_device->Open(createBaseCallback(bind(&USBDevice::asyncOpen, wrapPe
rsistent(this), wrapPersistent(resolver)))); | 146 m_device->Open(createBaseCallback(WTF::bind(&USBDevice::asyncOpen, w
rapPersistent(this), wrapPersistent(resolver)))); |
147 } | 147 } |
148 } | 148 } |
149 return promise; | 149 return promise; |
150 } | 150 } |
151 | 151 |
152 ScriptPromise USBDevice::close(ScriptState* scriptState) | 152 ScriptPromise USBDevice::close(ScriptState* scriptState) |
153 { | 153 { |
154 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 154 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
155 ScriptPromise promise = resolver->promise(); | 155 ScriptPromise promise = resolver->promise(); |
156 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 156 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
157 if (!m_opened) { | 157 if (!m_opened) { |
158 resolver->resolve(); | 158 resolver->resolve(); |
159 } else { | 159 } else { |
160 m_deviceStateChangeInProgress = true; | 160 m_deviceStateChangeInProgress = true; |
161 m_deviceRequests.add(resolver); | 161 m_deviceRequests.add(resolver); |
162 m_device->Close(createBaseCallback(bind(&USBDevice::asyncClose, wrap
Persistent(this), wrapPersistent(resolver)))); | 162 m_device->Close(createBaseCallback(WTF::bind(&USBDevice::asyncClose,
wrapPersistent(this), wrapPersistent(resolver)))); |
163 } | 163 } |
164 } | 164 } |
165 return promise; | 165 return promise; |
166 } | 166 } |
167 | 167 |
168 ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c
onfigurationValue) | 168 ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c
onfigurationValue) |
169 { | 169 { |
170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
171 ScriptPromise promise = resolver->promise(); | 171 ScriptPromise promise = resolver->promise(); |
172 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 172 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
173 if (!m_opened) { | 173 if (!m_opened) { |
174 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); | 174 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); |
175 } else { | 175 } else { |
176 int configurationIndex = findConfigurationIndex(configurationValue); | 176 int configurationIndex = findConfigurationIndex(configurationValue); |
177 if (configurationIndex == -1) { | 177 if (configurationIndex == -1) { |
178 resolver->reject(DOMException::create(NotFoundError, "The config
uration value provided is not supported by the device.")); | 178 resolver->reject(DOMException::create(NotFoundError, "The config
uration value provided is not supported by the device.")); |
179 } else if (m_configurationIndex == configurationIndex) { | 179 } else if (m_configurationIndex == configurationIndex) { |
180 resolver->resolve(); | 180 resolver->resolve(); |
181 } else { | 181 } else { |
182 m_deviceStateChangeInProgress = true; | 182 m_deviceStateChangeInProgress = true; |
183 m_deviceRequests.add(resolver); | 183 m_deviceRequests.add(resolver); |
184 m_device->SetConfiguration(configurationValue, createBaseCallbac
k(bind(&USBDevice::asyncSelectConfiguration, wrapPersistent(this), configuration
Index, wrapPersistent(resolver)))); | 184 m_device->SetConfiguration(configurationValue, createBaseCallbac
k(WTF::bind(&USBDevice::asyncSelectConfiguration, wrapPersistent(this), configur
ationIndex, wrapPersistent(resolver)))); |
185 } | 185 } |
186 } | 186 } |
187 } | 187 } |
188 return promise; | 188 return promise; |
189 } | 189 } |
190 | 190 |
191 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) | 191 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) |
192 { | 192 { |
193 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 193 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
194 ScriptPromise promise = resolver->promise(); | 194 ScriptPromise promise = resolver->promise(); |
195 if (ensureDeviceConfigured(resolver)) { | 195 if (ensureDeviceConfigured(resolver)) { |
196 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 196 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
197 if (interfaceIndex == -1) { | 197 if (interfaceIndex == -1) { |
198 resolver->reject(DOMException::create(NotFoundError, kInterfaceNotFo
und)); | 198 resolver->reject(DOMException::create(NotFoundError, kInterfaceNotFo
und)); |
199 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { | 199 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
200 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); | 200 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); |
201 } else if (m_claimedInterfaces.get(interfaceIndex)) { | 201 } else if (m_claimedInterfaces.get(interfaceIndex)) { |
202 resolver->resolve(); | 202 resolver->resolve(); |
203 } else { | 203 } else { |
204 m_interfaceStateChangeInProgress.set(interfaceIndex); | 204 m_interfaceStateChangeInProgress.set(interfaceIndex); |
205 m_deviceRequests.add(resolver); | 205 m_deviceRequests.add(resolver); |
206 m_device->ClaimInterface(interfaceNumber, createBaseCallback(bind(&U
SBDevice::asyncClaimInterface, wrapPersistent(this), interfaceIndex, wrapPersist
ent(resolver)))); | 206 m_device->ClaimInterface(interfaceNumber, createBaseCallback(WTF::bi
nd(&USBDevice::asyncClaimInterface, wrapPersistent(this), interfaceIndex, wrapPe
rsistent(resolver)))); |
207 } | 207 } |
208 } | 208 } |
209 return promise; | 209 return promise; |
210 } | 210 } |
211 | 211 |
212 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) | 212 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) |
213 { | 213 { |
214 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 214 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
215 ScriptPromise promise = resolver->promise(); | 215 ScriptPromise promise = resolver->promise(); |
216 if (ensureDeviceConfigured(resolver)) { | 216 if (ensureDeviceConfigured(resolver)) { |
217 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 217 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
218 if (interfaceIndex == -1) { | 218 if (interfaceIndex == -1) { |
219 resolver->reject(DOMException::create(NotFoundError, "The interface
number provided is not supported by the device in its current configuration.")); | 219 resolver->reject(DOMException::create(NotFoundError, "The interface
number provided is not supported by the device in its current configuration.")); |
220 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { | 220 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
221 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); | 221 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); |
222 } else if (!m_claimedInterfaces.get(interfaceIndex)) { | 222 } else if (!m_claimedInterfaces.get(interfaceIndex)) { |
223 resolver->resolve(); | 223 resolver->resolve(); |
224 } else { | 224 } else { |
225 // Mark this interface's endpoints unavailable while its state is | 225 // Mark this interface's endpoints unavailable while its state is |
226 // changing. | 226 // changing. |
227 setEndpointsForInterface(interfaceIndex, false); | 227 setEndpointsForInterface(interfaceIndex, false); |
228 m_interfaceStateChangeInProgress.set(interfaceIndex); | 228 m_interfaceStateChangeInProgress.set(interfaceIndex); |
229 m_deviceRequests.add(resolver); | 229 m_deviceRequests.add(resolver); |
230 m_device->ReleaseInterface(interfaceNumber, createBaseCallback(bind(
&USBDevice::asyncReleaseInterface, wrapPersistent(this), interfaceIndex, wrapPer
sistent(resolver)))); | 230 m_device->ReleaseInterface(interfaceNumber, createBaseCallback(WTF::
bind(&USBDevice::asyncReleaseInterface, wrapPersistent(this), interfaceIndex, wr
apPersistent(resolver)))); |
231 } | 231 } |
232 } | 232 } |
233 return promise; | 233 return promise; |
234 } | 234 } |
235 | 235 |
236 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint
8_t interfaceNumber, uint8_t alternateSetting) | 236 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint
8_t interfaceNumber, uint8_t alternateSetting) |
237 { | 237 { |
238 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 238 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
239 ScriptPromise promise = resolver->promise(); | 239 ScriptPromise promise = resolver->promise(); |
240 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { | 240 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { |
241 // TODO(reillyg): This is duplicated work. | 241 // TODO(reillyg): This is duplicated work. |
242 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 242 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
243 ASSERT(interfaceIndex != -1); | 243 ASSERT(interfaceIndex != -1); |
244 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting
); | 244 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting
); |
245 if (alternateIndex == -1) { | 245 if (alternateIndex == -1) { |
246 resolver->reject(DOMException::create(NotFoundError, "The alternate
setting provided is not supported by the device in its current configuration."))
; | 246 resolver->reject(DOMException::create(NotFoundError, "The alternate
setting provided is not supported by the device in its current configuration."))
; |
247 } else { | 247 } else { |
248 // Mark this old alternate interface's endpoints unavailable while | 248 // Mark this old alternate interface's endpoints unavailable while |
249 // the change is in progress. | 249 // the change is in progress. |
250 setEndpointsForInterface(interfaceIndex, false); | 250 setEndpointsForInterface(interfaceIndex, false); |
251 m_interfaceStateChangeInProgress.set(interfaceIndex); | 251 m_interfaceStateChangeInProgress.set(interfaceIndex); |
252 m_deviceRequests.add(resolver); | 252 m_deviceRequests.add(resolver); |
253 m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSet
ting, createBaseCallback(bind(&USBDevice::asyncSelectAlternateInterface, wrapPer
sistent(this), interfaceNumber, alternateSetting, wrapPersistent(resolver)))); | 253 m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSet
ting, createBaseCallback(WTF::bind(&USBDevice::asyncSelectAlternateInterface, wr
apPersistent(this), interfaceNumber, alternateSetting, wrapPersistent(resolver))
)); |
254 } | 254 } |
255 } | 255 } |
256 return promise; | 256 return promise; |
257 } | 257 } |
258 | 258 |
259 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) | 259 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) |
260 { | 260 { |
261 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 261 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
262 ScriptPromise promise = resolver->promise(); | 262 ScriptPromise promise = resolver->promise(); |
263 if (ensureDeviceConfigured(resolver)) { | 263 if (ensureDeviceConfigured(resolver)) { |
264 auto parameters = convertControlTransferParameters(setup, resolver); | 264 auto parameters = convertControlTransferParameters(setup, resolver); |
265 if (parameters) { | 265 if (parameters) { |
266 m_deviceRequests.add(resolver); | 266 m_deviceRequests.add(resolver); |
267 m_device->ControlTransferIn(std::move(parameters), length, 0, create
BaseCallback(bind(&USBDevice::asyncControlTransferIn, wrapPersistent(this), wrap
Persistent(resolver)))); | 267 m_device->ControlTransferIn(std::move(parameters), length, 0, create
BaseCallback(WTF::bind(&USBDevice::asyncControlTransferIn, wrapPersistent(this),
wrapPersistent(resolver)))); |
268 } | 268 } |
269 } | 269 } |
270 return promise; | 270 return promise; |
271 } | 271 } |
272 | 272 |
273 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) | 273 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) |
274 { | 274 { |
275 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 275 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
276 ScriptPromise promise = resolver->promise(); | 276 ScriptPromise promise = resolver->promise(); |
277 if (ensureDeviceConfigured(resolver)) { | 277 if (ensureDeviceConfigured(resolver)) { |
278 auto parameters = convertControlTransferParameters(setup, resolver); | 278 auto parameters = convertControlTransferParameters(setup, resolver); |
279 if (parameters) { | 279 if (parameters) { |
280 m_deviceRequests.add(resolver); | 280 m_deviceRequests.add(resolver); |
281 m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<u
int8_t>(), 0, createBaseCallback(bind(&USBDevice::asyncControlTransferOut, wrapP
ersistent(this), 0, wrapPersistent(resolver)))); | 281 m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<u
int8_t>(), 0, createBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut,
wrapPersistent(this), 0, wrapPersistent(resolver)))); |
282 } | 282 } |
283 } | 283 } |
284 return promise; | 284 return promise; |
285 } | 285 } |
286 | 286 |
287 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | 287 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) |
288 { | 288 { |
289 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 289 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
290 ScriptPromise promise = resolver->promise(); | 290 ScriptPromise promise = resolver->promise(); |
291 if (ensureDeviceConfigured(resolver)) { | 291 if (ensureDeviceConfigured(resolver)) { |
292 auto parameters = convertControlTransferParameters(setup, resolver); | 292 auto parameters = convertControlTransferParameters(setup, resolver); |
293 if (parameters) { | 293 if (parameters) { |
294 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); | 294 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); |
295 unsigned transferLength = buffer.size(); | 295 unsigned transferLength = buffer.size(); |
296 m_deviceRequests.add(resolver); | 296 m_deviceRequests.add(resolver); |
297 m_device->ControlTransferOut(std::move(parameters), std::move(buffer
), 0, createBaseCallback(bind(&USBDevice::asyncControlTransferOut, wrapPersisten
t(this), transferLength, wrapPersistent(resolver)))); | 297 m_device->ControlTransferOut(std::move(parameters), std::move(buffer
), 0, createBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapPers
istent(this), transferLength, wrapPersistent(resolver)))); |
298 } | 298 } |
299 } | 299 } |
300 return promise; | 300 return promise; |
301 } | 301 } |
302 | 302 |
303 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) | 303 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) |
304 { | 304 { |
305 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 305 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
306 ScriptPromise promise = resolver->promise(); | 306 ScriptPromise promise = resolver->promise(); |
307 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { | 307 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { |
308 m_deviceRequests.add(resolver); | 308 m_deviceRequests.add(resolver); |
309 m_device->ClearHalt(endpointNumber, createBaseCallback(bind(&USBDevice::
asyncClearHalt, wrapPersistent(this), wrapPersistent(resolver)))); | 309 m_device->ClearHalt(endpointNumber, createBaseCallback(WTF::bind(&USBDev
ice::asyncClearHalt, wrapPersistent(this), wrapPersistent(resolver)))); |
310 } | 310 } |
311 return promise; | 311 return promise; |
312 } | 312 } |
313 | 313 |
314 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) | 314 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) |
315 { | 315 { |
316 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 316 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
317 ScriptPromise promise = resolver->promise(); | 317 ScriptPromise promise = resolver->promise(); |
318 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 318 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
319 m_deviceRequests.add(resolver); | 319 m_deviceRequests.add(resolver); |
320 m_device->GenericTransferIn(endpointNumber, length, 0, createBaseCallbac
k(bind(&USBDevice::asyncTransferIn, wrapPersistent(this), wrapPersistent(resolve
r)))); | 320 m_device->GenericTransferIn(endpointNumber, length, 0, createBaseCallbac
k(WTF::bind(&USBDevice::asyncTransferIn, wrapPersistent(this), wrapPersistent(re
solver)))); |
321 } | 321 } |
322 return promise; | 322 return promise; |
323 } | 323 } |
324 | 324 |
325 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) | 325 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) |
326 { | 326 { |
327 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 327 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
328 ScriptPromise promise = resolver->promise(); | 328 ScriptPromise promise = resolver->promise(); |
329 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 329 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
330 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); | 330 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); |
331 unsigned transferLength = buffer.size(); | 331 unsigned transferLength = buffer.size(); |
332 m_deviceRequests.add(resolver); | 332 m_deviceRequests.add(resolver); |
333 m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, creat
eBaseCallback(bind(&USBDevice::asyncTransferOut, wrapPersistent(this), transferL
ength, wrapPersistent(resolver)))); | 333 m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, creat
eBaseCallback(WTF::bind(&USBDevice::asyncTransferOut, wrapPersistent(this), tran
sferLength, wrapPersistent(resolver)))); |
334 } | 334 } |
335 return promise; | 335 return promise; |
336 } | 336 } |
337 | 337 |
338 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) | 338 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) |
339 { | 339 { |
340 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 340 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
341 ScriptPromise promise = resolver->promise(); | 341 ScriptPromise promise = resolver->promise(); |
342 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 342 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
343 m_deviceRequests.add(resolver); | 343 m_deviceRequests.add(resolver); |
344 m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>
(std::move(packetLengths)), 0, createBaseCallback(bind(&USBDevice::asyncIsochron
ousTransferIn, wrapPersistent(this), wrapPersistent(resolver)))); | 344 m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>
(std::move(packetLengths)), 0, createBaseCallback(WTF::bind(&USBDevice::asyncIso
chronousTransferIn, wrapPersistent(this), wrapPersistent(resolver)))); |
345 } | 345 } |
346 return promise; | 346 return promise; |
347 } | 347 } |
348 | 348 |
349 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) | 349 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) |
350 { | 350 { |
351 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 351 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
352 ScriptPromise promise = resolver->promise(); | 352 ScriptPromise promise = resolver->promise(); |
353 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 353 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
354 m_deviceRequests.add(resolver); | 354 m_deviceRequests.add(resolver); |
355 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, createBaseCallback(bi
nd(&USBDevice::asyncIsochronousTransferOut, wrapPersistent(this), wrapPersistent
(resolver)))); | 355 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, createBaseCallback(WT
F::bind(&USBDevice::asyncIsochronousTransferOut, wrapPersistent(this), wrapPersi
stent(resolver)))); |
356 } | 356 } |
357 return promise; | 357 return promise; |
358 } | 358 } |
359 | 359 |
360 ScriptPromise USBDevice::reset(ScriptState* scriptState) | 360 ScriptPromise USBDevice::reset(ScriptState* scriptState) |
361 { | 361 { |
362 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 362 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
363 ScriptPromise promise = resolver->promise(); | 363 ScriptPromise promise = resolver->promise(); |
364 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 364 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
365 if (!m_opened) { | 365 if (!m_opened) { |
366 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); | 366 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); |
367 } else { | 367 } else { |
368 m_deviceRequests.add(resolver); | 368 m_deviceRequests.add(resolver); |
369 m_device->Reset(createBaseCallback(bind(&USBDevice::asyncReset, wrap
Persistent(this), wrapPersistent(resolver)))); | 369 m_device->Reset(createBaseCallback(WTF::bind(&USBDevice::asyncReset,
wrapPersistent(this), wrapPersistent(resolver)))); |
370 } | 370 } |
371 } | 371 } |
372 return promise; | 372 return promise; |
373 } | 373 } |
374 | 374 |
375 void USBDevice::contextDestroyed() | 375 void USBDevice::contextDestroyed() |
376 { | 376 { |
377 m_device.reset(); | 377 m_device.reset(); |
378 m_deviceRequests.clear(); | 378 m_deviceRequests.clear(); |
379 } | 379 } |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 bool USBDevice::markRequestComplete(ScriptPromiseResolver* resolver) | 782 bool USBDevice::markRequestComplete(ScriptPromiseResolver* resolver) |
783 { | 783 { |
784 auto requestEntry = m_deviceRequests.find(resolver); | 784 auto requestEntry = m_deviceRequests.find(resolver); |
785 if (requestEntry == m_deviceRequests.end()) | 785 if (requestEntry == m_deviceRequests.end()) |
786 return false; | 786 return false; |
787 m_deviceRequests.remove(requestEntry); | 787 m_deviceRequests.remove(requestEntry); |
788 return true; | 788 return true; |
789 } | 789 } |
790 | 790 |
791 } // namespace blink | 791 } // namespace blink |
OLD | NEW |