| 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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 ScriptPromise USBDevice::open(ScriptState* scriptState) | 142 ScriptPromise USBDevice::open(ScriptState* scriptState) |
| 143 { | 143 { |
| 144 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 144 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 145 ScriptPromise promise = resolver->promise(); | 145 ScriptPromise promise = resolver->promise(); |
| 146 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 146 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 147 if (m_opened) { | 147 if (m_opened) { |
| 148 resolver->resolve(); | 148 resolver->resolve(); |
| 149 } else { | 149 } else { |
| 150 m_deviceStateChangeInProgress = true; | 150 m_deviceStateChangeInProgress = true; |
| 151 m_deviceRequests.add(resolver); | 151 m_deviceRequests.add(resolver); |
| 152 m_device->Open(createBaseCallback(bind<usb::OpenDeviceError>(&USBDev
ice::asyncOpen, this, resolver))); | 152 m_device->Open(createBaseCallback(bind<usb::OpenDeviceError>(&USBDev
ice::asyncOpen, retainedRef(this), retainedRef(resolver)))); |
| 153 } | 153 } |
| 154 } | 154 } |
| 155 return promise; | 155 return promise; |
| 156 } | 156 } |
| 157 | 157 |
| 158 ScriptPromise USBDevice::close(ScriptState* scriptState) | 158 ScriptPromise USBDevice::close(ScriptState* scriptState) |
| 159 { | 159 { |
| 160 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 160 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 161 ScriptPromise promise = resolver->promise(); | 161 ScriptPromise promise = resolver->promise(); |
| 162 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 162 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 163 if (!m_opened) { | 163 if (!m_opened) { |
| 164 resolver->resolve(); | 164 resolver->resolve(); |
| 165 } else { | 165 } else { |
| 166 m_deviceStateChangeInProgress = true; | 166 m_deviceStateChangeInProgress = true; |
| 167 m_deviceRequests.add(resolver); | 167 m_deviceRequests.add(resolver); |
| 168 m_device->Close(createBaseCallback(bind(&USBDevice::asyncClose, this
, resolver))); | 168 m_device->Close(createBaseCallback(bind(&USBDevice::asyncClose, reta
inedRef(this), retainedRef(resolver)))); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 return promise; | 171 return promise; |
| 172 } | 172 } |
| 173 | 173 |
| 174 ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c
onfigurationValue) | 174 ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c
onfigurationValue) |
| 175 { | 175 { |
| 176 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 176 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 177 ScriptPromise promise = resolver->promise(); | 177 ScriptPromise promise = resolver->promise(); |
| 178 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 178 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 179 if (!m_opened) { | 179 if (!m_opened) { |
| 180 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); | 180 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); |
| 181 } else { | 181 } else { |
| 182 int configurationIndex = findConfigurationIndex(configurationValue); | 182 int configurationIndex = findConfigurationIndex(configurationValue); |
| 183 if (configurationIndex == -1) { | 183 if (configurationIndex == -1) { |
| 184 resolver->reject(DOMException::create(NotFoundError, "The config
uration value provided is not supported by the device.")); | 184 resolver->reject(DOMException::create(NotFoundError, "The config
uration value provided is not supported by the device.")); |
| 185 } else if (m_configurationIndex == configurationIndex) { | 185 } else if (m_configurationIndex == configurationIndex) { |
| 186 resolver->resolve(); | 186 resolver->resolve(); |
| 187 } else { | 187 } else { |
| 188 m_deviceStateChangeInProgress = true; | 188 m_deviceStateChangeInProgress = true; |
| 189 m_deviceRequests.add(resolver); | 189 m_deviceRequests.add(resolver); |
| 190 m_device->SetConfiguration(configurationValue, createBaseCallbac
k(bind<bool>(&USBDevice::asyncSelectConfiguration, this, configurationIndex, res
olver))); | 190 m_device->SetConfiguration(configurationValue, createBaseCallbac
k(bind<bool>(&USBDevice::asyncSelectConfiguration, retainedRef(this), configurat
ionIndex, retainedRef(resolver)))); |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 return promise; | 194 return promise; |
| 195 } | 195 } |
| 196 | 196 |
| 197 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) | 197 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) |
| 198 { | 198 { |
| 199 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 199 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 200 ScriptPromise promise = resolver->promise(); | 200 ScriptPromise promise = resolver->promise(); |
| 201 if (ensureDeviceConfigured(resolver)) { | 201 if (ensureDeviceConfigured(resolver)) { |
| 202 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 202 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 203 if (interfaceIndex == -1) { | 203 if (interfaceIndex == -1) { |
| 204 resolver->reject(DOMException::create(NotFoundError, kInterfaceNotFo
und)); | 204 resolver->reject(DOMException::create(NotFoundError, kInterfaceNotFo
und)); |
| 205 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { | 205 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
| 206 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); | 206 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); |
| 207 } else if (m_claimedInterfaces.get(interfaceIndex)) { | 207 } else if (m_claimedInterfaces.get(interfaceIndex)) { |
| 208 resolver->resolve(); | 208 resolver->resolve(); |
| 209 } else { | 209 } else { |
| 210 m_interfaceStateChangeInProgress.set(interfaceIndex); | 210 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 211 m_deviceRequests.add(resolver); | 211 m_deviceRequests.add(resolver); |
| 212 m_device->ClaimInterface(interfaceNumber, createBaseCallback(bind<bo
ol>(&USBDevice::asyncClaimInterface, this, interfaceIndex, resolver))); | 212 m_device->ClaimInterface(interfaceNumber, createBaseCallback(bind<bo
ol>(&USBDevice::asyncClaimInterface, retainedRef(this), interfaceIndex, retained
Ref(resolver)))); |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 return promise; | 215 return promise; |
| 216 } | 216 } |
| 217 | 217 |
| 218 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) | 218 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) |
| 219 { | 219 { |
| 220 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 220 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 221 ScriptPromise promise = resolver->promise(); | 221 ScriptPromise promise = resolver->promise(); |
| 222 if (ensureDeviceConfigured(resolver)) { | 222 if (ensureDeviceConfigured(resolver)) { |
| 223 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 223 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 224 if (interfaceIndex == -1) { | 224 if (interfaceIndex == -1) { |
| 225 resolver->reject(DOMException::create(NotFoundError, "The interface
number provided is not supported by the device in its current configuration.")); | 225 resolver->reject(DOMException::create(NotFoundError, "The interface
number provided is not supported by the device in its current configuration.")); |
| 226 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { | 226 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
| 227 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); | 227 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); |
| 228 } else if (!m_claimedInterfaces.get(interfaceIndex)) { | 228 } else if (!m_claimedInterfaces.get(interfaceIndex)) { |
| 229 resolver->resolve(); | 229 resolver->resolve(); |
| 230 } else { | 230 } else { |
| 231 // Mark this interface's endpoints unavailable while its state is | 231 // Mark this interface's endpoints unavailable while its state is |
| 232 // changing. | 232 // changing. |
| 233 setEndpointsForInterface(interfaceIndex, false); | 233 setEndpointsForInterface(interfaceIndex, false); |
| 234 m_interfaceStateChangeInProgress.set(interfaceIndex); | 234 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 235 m_deviceRequests.add(resolver); | 235 m_deviceRequests.add(resolver); |
| 236 m_device->ReleaseInterface(interfaceNumber, createBaseCallback(bind<
bool>(&USBDevice::asyncReleaseInterface, this, interfaceIndex, resolver))); | 236 m_device->ReleaseInterface(interfaceNumber, createBaseCallback(bind<
bool>(&USBDevice::asyncReleaseInterface, retainedRef(this), interfaceIndex, reta
inedRef(resolver)))); |
| 237 } | 237 } |
| 238 } | 238 } |
| 239 return promise; | 239 return promise; |
| 240 } | 240 } |
| 241 | 241 |
| 242 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint
8_t interfaceNumber, uint8_t alternateSetting) | 242 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint
8_t interfaceNumber, uint8_t alternateSetting) |
| 243 { | 243 { |
| 244 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 244 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 245 ScriptPromise promise = resolver->promise(); | 245 ScriptPromise promise = resolver->promise(); |
| 246 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { | 246 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { |
| 247 // TODO(reillyg): This is duplicated work. | 247 // TODO(reillyg): This is duplicated work. |
| 248 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 248 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 249 ASSERT(interfaceIndex != -1); | 249 ASSERT(interfaceIndex != -1); |
| 250 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting
); | 250 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting
); |
| 251 if (alternateIndex == -1) { | 251 if (alternateIndex == -1) { |
| 252 resolver->reject(DOMException::create(NotFoundError, "The alternate
setting provided is not supported by the device in its current configuration."))
; | 252 resolver->reject(DOMException::create(NotFoundError, "The alternate
setting provided is not supported by the device in its current configuration."))
; |
| 253 } else { | 253 } else { |
| 254 // Mark this old alternate interface's endpoints unavailable while | 254 // Mark this old alternate interface's endpoints unavailable while |
| 255 // the change is in progress. | 255 // the change is in progress. |
| 256 setEndpointsForInterface(interfaceIndex, false); | 256 setEndpointsForInterface(interfaceIndex, false); |
| 257 m_interfaceStateChangeInProgress.set(interfaceIndex); | 257 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 258 m_deviceRequests.add(resolver); | 258 m_deviceRequests.add(resolver); |
| 259 m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSet
ting, createBaseCallback(bind<bool>(&USBDevice::asyncSelectAlternateInterface, t
his, interfaceNumber, alternateSetting, resolver))); | 259 m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSet
ting, createBaseCallback(bind<bool>(&USBDevice::asyncSelectAlternateInterface, r
etainedRef(this), interfaceNumber, alternateSetting, retainedRef(resolver)))); |
| 260 } | 260 } |
| 261 } | 261 } |
| 262 return promise; | 262 return promise; |
| 263 } | 263 } |
| 264 | 264 |
| 265 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) | 265 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) |
| 266 { | 266 { |
| 267 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 267 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 268 ScriptPromise promise = resolver->promise(); | 268 ScriptPromise promise = resolver->promise(); |
| 269 if (ensureDeviceConfigured(resolver)) { | 269 if (ensureDeviceConfigured(resolver)) { |
| 270 auto parameters = convertControlTransferParameters(setup, resolver); | 270 auto parameters = convertControlTransferParameters(setup, resolver); |
| 271 if (parameters) { | 271 if (parameters) { |
| 272 m_deviceRequests.add(resolver); | 272 m_deviceRequests.add(resolver); |
| 273 m_device->ControlTransferIn(std::move(parameters), length, 0, create
BaseCallback(bind<usb::TransferStatus, mojo::WTFArray<uint8_t>>(&USBDevice::asyn
cControlTransferIn, this, resolver))); | 273 m_device->ControlTransferIn(std::move(parameters), length, 0, create
BaseCallback(bind<usb::TransferStatus, mojo::WTFArray<uint8_t>>(&USBDevice::asyn
cControlTransferIn, retainedRef(this), retainedRef(resolver)))); |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 return promise; | 276 return promise; |
| 277 } | 277 } |
| 278 | 278 |
| 279 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) | 279 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) |
| 280 { | 280 { |
| 281 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 281 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 282 ScriptPromise promise = resolver->promise(); | 282 ScriptPromise promise = resolver->promise(); |
| 283 if (ensureDeviceConfigured(resolver)) { | 283 if (ensureDeviceConfigured(resolver)) { |
| 284 auto parameters = convertControlTransferParameters(setup, resolver); | 284 auto parameters = convertControlTransferParameters(setup, resolver); |
| 285 if (parameters) { | 285 if (parameters) { |
| 286 m_deviceRequests.add(resolver); | 286 m_deviceRequests.add(resolver); |
| 287 m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<u
int8_t>(), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncCont
rolTransferOut, this, 0, resolver))); | 287 m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<u
int8_t>(), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncCont
rolTransferOut, retainedRef(this), 0, retainedRef(resolver)))); |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 return promise; | 290 return promise; |
| 291 } | 291 } |
| 292 | 292 |
| 293 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | 293 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) |
| 294 { | 294 { |
| 295 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 295 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 296 ScriptPromise promise = resolver->promise(); | 296 ScriptPromise promise = resolver->promise(); |
| 297 if (ensureDeviceConfigured(resolver)) { | 297 if (ensureDeviceConfigured(resolver)) { |
| 298 auto parameters = convertControlTransferParameters(setup, resolver); | 298 auto parameters = convertControlTransferParameters(setup, resolver); |
| 299 if (parameters) { | 299 if (parameters) { |
| 300 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); | 300 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); |
| 301 unsigned transferLength = buffer.size(); | 301 unsigned transferLength = buffer.size(); |
| 302 m_deviceRequests.add(resolver); | 302 m_deviceRequests.add(resolver); |
| 303 m_device->ControlTransferOut(std::move(parameters), std::move(buffer
), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncControlTrans
ferOut, this, transferLength, resolver))); | 303 m_device->ControlTransferOut(std::move(parameters), std::move(buffer
), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncControlTrans
ferOut, retainedRef(this), transferLength, retainedRef(resolver)))); |
| 304 } | 304 } |
| 305 } | 305 } |
| 306 return promise; | 306 return promise; |
| 307 } | 307 } |
| 308 | 308 |
| 309 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) | 309 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) |
| 310 { | 310 { |
| 311 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 311 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 312 ScriptPromise promise = resolver->promise(); | 312 ScriptPromise promise = resolver->promise(); |
| 313 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { | 313 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { |
| 314 m_deviceRequests.add(resolver); | 314 m_deviceRequests.add(resolver); |
| 315 m_device->ClearHalt(endpointNumber, createBaseCallback(bind<bool>(&USBDe
vice::asyncClearHalt, this, resolver))); | 315 m_device->ClearHalt(endpointNumber, createBaseCallback(bind<bool>(&USBDe
vice::asyncClearHalt, retainedRef(this), retainedRef(resolver)))); |
| 316 } | 316 } |
| 317 return promise; | 317 return promise; |
| 318 } | 318 } |
| 319 | 319 |
| 320 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) | 320 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) |
| 321 { | 321 { |
| 322 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 322 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 323 ScriptPromise promise = resolver->promise(); | 323 ScriptPromise promise = resolver->promise(); |
| 324 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 324 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
| 325 m_deviceRequests.add(resolver); | 325 m_deviceRequests.add(resolver); |
| 326 m_device->GenericTransferIn(endpointNumber, length, 0, createBaseCallbac
k(bind<usb::TransferStatus, mojo::WTFArray<uint8_t>>(&USBDevice::asyncTransferIn
, this, resolver))); | 326 m_device->GenericTransferIn(endpointNumber, length, 0, createBaseCallbac
k(bind<usb::TransferStatus, mojo::WTFArray<uint8_t>>(&USBDevice::asyncTransferIn
, retainedRef(this), retainedRef(resolver)))); |
| 327 } | 327 } |
| 328 return promise; | 328 return promise; |
| 329 } | 329 } |
| 330 | 330 |
| 331 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) | 331 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) |
| 332 { | 332 { |
| 333 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 333 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 334 ScriptPromise promise = resolver->promise(); | 334 ScriptPromise promise = resolver->promise(); |
| 335 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 335 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
| 336 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); | 336 mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); |
| 337 unsigned transferLength = buffer.size(); | 337 unsigned transferLength = buffer.size(); |
| 338 m_deviceRequests.add(resolver); | 338 m_deviceRequests.add(resolver); |
| 339 m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, creat
eBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncTransferOut, this, tran
sferLength, resolver))); | 339 m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, creat
eBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncTransferOut, retainedRe
f(this), transferLength, retainedRef(resolver)))); |
| 340 } | 340 } |
| 341 return promise; | 341 return promise; |
| 342 } | 342 } |
| 343 | 343 |
| 344 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) | 344 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) |
| 345 { | 345 { |
| 346 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 346 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 347 ScriptPromise promise = resolver->promise(); | 347 ScriptPromise promise = resolver->promise(); |
| 348 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 348 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
| 349 m_deviceRequests.add(resolver); | 349 m_deviceRequests.add(resolver); |
| 350 m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>
(std::move(packetLengths)), 0, createBaseCallback(bind<mojo::WTFArray<uint8_t>,
mojo::WTFArray<usb::IsochronousPacketPtr>>(&USBDevice::asyncIsochronousTransferI
n, this, resolver))); | 350 m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>
(std::move(packetLengths)), 0, createBaseCallback(bind<mojo::WTFArray<uint8_t>,
mojo::WTFArray<usb::IsochronousPacketPtr>>(&USBDevice::asyncIsochronousTransferI
n, retainedRef(this), retainedRef(resolver)))); |
| 351 } | 351 } |
| 352 return promise; | 352 return promise; |
| 353 } | 353 } |
| 354 | 354 |
| 355 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) | 355 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) |
| 356 { | 356 { |
| 357 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 357 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 358 ScriptPromise promise = resolver->promise(); | 358 ScriptPromise promise = resolver->promise(); |
| 359 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 359 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
| 360 m_deviceRequests.add(resolver); | 360 m_deviceRequests.add(resolver); |
| 361 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, createBaseCallback(bi
nd<mojo::WTFArray<usb::IsochronousPacketPtr>>(&USBDevice::asyncIsochronousTransf
erOut, this, resolver))); | 361 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, createBaseCallback(bi
nd<mojo::WTFArray<usb::IsochronousPacketPtr>>(&USBDevice::asyncIsochronousTransf
erOut, retainedRef(this), retainedRef(resolver)))); |
| 362 } | 362 } |
| 363 return promise; | 363 return promise; |
| 364 } | 364 } |
| 365 | 365 |
| 366 ScriptPromise USBDevice::reset(ScriptState* scriptState) | 366 ScriptPromise USBDevice::reset(ScriptState* scriptState) |
| 367 { | 367 { |
| 368 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 368 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 369 ScriptPromise promise = resolver->promise(); | 369 ScriptPromise promise = resolver->promise(); |
| 370 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 370 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 371 if (!m_opened) { | 371 if (!m_opened) { |
| 372 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); | 372 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); |
| 373 } else { | 373 } else { |
| 374 m_deviceRequests.add(resolver); | 374 m_deviceRequests.add(resolver); |
| 375 m_device->Reset(createBaseCallback(bind<bool>(&USBDevice::asyncReset
, this, resolver))); | 375 m_device->Reset(createBaseCallback(bind<bool>(&USBDevice::asyncReset
, retainedRef(this), retainedRef(resolver)))); |
| 376 } | 376 } |
| 377 } | 377 } |
| 378 return promise; | 378 return promise; |
| 379 } | 379 } |
| 380 | 380 |
| 381 void USBDevice::contextDestroyed() | 381 void USBDevice::contextDestroyed() |
| 382 { | 382 { |
| 383 m_device.reset(); | 383 m_device.reset(); |
| 384 m_deviceRequests.clear(); | 384 m_deviceRequests.clear(); |
| 385 } | 385 } |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 m_device.reset(); | 795 m_device.reset(); |
| 796 m_opened = false; | 796 m_opened = false; |
| 797 for (ScriptPromiseResolver* resolver : m_deviceRequests) { | 797 for (ScriptPromiseResolver* resolver : m_deviceRequests) { |
| 798 if (isActive(resolver)) | 798 if (isActive(resolver)) |
| 799 resolver->reject(DOMException::create(NotFoundError, kDeviceUnavaila
ble)); | 799 resolver->reject(DOMException::create(NotFoundError, kDeviceUnavaila
ble)); |
| 800 } | 800 } |
| 801 m_deviceRequests.clear(); | 801 m_deviceRequests.clear(); |
| 802 } | 802 } |
| 803 | 803 |
| 804 } // namespace blink | 804 } // namespace blink |
| OLD | NEW |