| 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" |
| 11 #include "core/dom/DOMArrayBufferView.h" | 11 #include "core/dom/DOMArrayBufferView.h" |
| 12 #include "core/dom/DOMException.h" | 12 #include "core/dom/DOMException.h" |
| 13 #include "core/dom/ExceptionCode.h" | 13 #include "core/dom/ExceptionCode.h" |
| 14 #include "core/frame/UseCounter.h" |
| 14 #include "modules/webusb/USBConfiguration.h" | 15 #include "modules/webusb/USBConfiguration.h" |
| 15 #include "modules/webusb/USBControlTransferParameters.h" | 16 #include "modules/webusb/USBControlTransferParameters.h" |
| 16 #include "modules/webusb/USBInTransferResult.h" | 17 #include "modules/webusb/USBInTransferResult.h" |
| 17 #include "modules/webusb/USBIsochronousInTransferResult.h" | 18 #include "modules/webusb/USBIsochronousInTransferResult.h" |
| 18 #include "modules/webusb/USBIsochronousOutTransferResult.h" | 19 #include "modules/webusb/USBIsochronousOutTransferResult.h" |
| 19 #include "modules/webusb/USBOutTransferResult.h" | 20 #include "modules/webusb/USBOutTransferResult.h" |
| 20 #include "platform/mojo/MojoHelper.h" | 21 #include "platform/mojo/MojoHelper.h" |
| 21 #include "wtf/Assertions.h" | 22 #include "wtf/Assertions.h" |
| 22 | 23 |
| 23 namespace usb = device::usb::blink; | 24 namespace usb = device::usb::blink; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 { | 129 { |
| 129 size_t numConfigurations = info().configurations.size(); | 130 size_t numConfigurations = info().configurations.size(); |
| 130 HeapVector<Member<USBConfiguration>> configurations(numConfigurations); | 131 HeapVector<Member<USBConfiguration>> configurations(numConfigurations); |
| 131 for (size_t i = 0; i < numConfigurations; ++i) | 132 for (size_t i = 0; i < numConfigurations; ++i) |
| 132 configurations[i] = USBConfiguration::create(this, i); | 133 configurations[i] = USBConfiguration::create(this, i); |
| 133 return configurations; | 134 return configurations; |
| 134 } | 135 } |
| 135 | 136 |
| 136 ScriptPromise USBDevice::open(ScriptState* scriptState) | 137 ScriptPromise USBDevice::open(ScriptState* scriptState) |
| 137 { | 138 { |
| 139 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceO
pen); |
| 140 |
| 138 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 141 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 139 ScriptPromise promise = resolver->promise(); | 142 ScriptPromise promise = resolver->promise(); |
| 140 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 143 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 141 if (m_opened) { | 144 if (m_opened) { |
| 142 resolver->resolve(); | 145 resolver->resolve(); |
| 143 } else { | 146 } else { |
| 144 m_deviceStateChangeInProgress = true; | 147 m_deviceStateChangeInProgress = true; |
| 145 m_deviceRequests.add(resolver); | 148 m_deviceRequests.add(resolver); |
| 146 m_device->Open(convertToBaseCallback(WTF::bind(&USBDevice::asyncOpen
, wrapPersistent(this), wrapPersistent(resolver)))); | 149 m_device->Open(convertToBaseCallback(WTF::bind(&USBDevice::asyncOpen
, wrapPersistent(this), wrapPersistent(resolver)))); |
| 147 } | 150 } |
| 148 } | 151 } |
| 149 return promise; | 152 return promise; |
| 150 } | 153 } |
| 151 | 154 |
| 152 ScriptPromise USBDevice::close(ScriptState* scriptState) | 155 ScriptPromise USBDevice::close(ScriptState* scriptState) |
| 153 { | 156 { |
| 157 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceC
lose); |
| 158 |
| 154 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 159 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 155 ScriptPromise promise = resolver->promise(); | 160 ScriptPromise promise = resolver->promise(); |
| 156 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 161 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 157 if (!m_opened) { | 162 if (!m_opened) { |
| 158 resolver->resolve(); | 163 resolver->resolve(); |
| 159 } else { | 164 } else { |
| 160 m_deviceStateChangeInProgress = true; | 165 m_deviceStateChangeInProgress = true; |
| 161 m_deviceRequests.add(resolver); | 166 m_deviceRequests.add(resolver); |
| 162 m_device->Close(convertToBaseCallback(WTF::bind(&USBDevice::asyncClo
se, wrapPersistent(this), wrapPersistent(resolver)))); | 167 m_device->Close(convertToBaseCallback(WTF::bind(&USBDevice::asyncClo
se, wrapPersistent(this), wrapPersistent(resolver)))); |
| 163 } | 168 } |
| 164 } | 169 } |
| 165 return promise; | 170 return promise; |
| 166 } | 171 } |
| 167 | 172 |
| 168 ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c
onfigurationValue) | 173 ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c
onfigurationValue) |
| 169 { | 174 { |
| 175 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceS
electConfiguration); |
| 176 |
| 170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 177 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 171 ScriptPromise promise = resolver->promise(); | 178 ScriptPromise promise = resolver->promise(); |
| 172 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 179 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 173 if (!m_opened) { | 180 if (!m_opened) { |
| 174 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); | 181 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); |
| 175 } else { | 182 } else { |
| 176 int configurationIndex = findConfigurationIndex(configurationValue); | 183 int configurationIndex = findConfigurationIndex(configurationValue); |
| 177 if (configurationIndex == -1) { | 184 if (configurationIndex == -1) { |
| 178 resolver->reject(DOMException::create(NotFoundError, "The config
uration value provided is not supported by the device.")); | 185 resolver->reject(DOMException::create(NotFoundError, "The config
uration value provided is not supported by the device.")); |
| 179 } else if (m_configurationIndex == configurationIndex) { | 186 } else if (m_configurationIndex == configurationIndex) { |
| 180 resolver->resolve(); | 187 resolver->resolve(); |
| 181 } else { | 188 } else { |
| 182 m_deviceStateChangeInProgress = true; | 189 m_deviceStateChangeInProgress = true; |
| 183 m_deviceRequests.add(resolver); | 190 m_deviceRequests.add(resolver); |
| 184 m_device->SetConfiguration(configurationValue, convertToBaseCall
back(WTF::bind(&USBDevice::asyncSelectConfiguration, wrapPersistent(this), confi
gurationIndex, wrapPersistent(resolver)))); | 191 m_device->SetConfiguration(configurationValue, convertToBaseCall
back(WTF::bind(&USBDevice::asyncSelectConfiguration, wrapPersistent(this), confi
gurationIndex, wrapPersistent(resolver)))); |
| 185 } | 192 } |
| 186 } | 193 } |
| 187 } | 194 } |
| 188 return promise; | 195 return promise; |
| 189 } | 196 } |
| 190 | 197 |
| 191 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) | 198 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) |
| 192 { | 199 { |
| 200 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceC
laimInterface); |
| 201 |
| 193 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 202 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 194 ScriptPromise promise = resolver->promise(); | 203 ScriptPromise promise = resolver->promise(); |
| 195 if (ensureDeviceConfigured(resolver)) { | 204 if (ensureDeviceConfigured(resolver)) { |
| 196 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 205 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 197 if (interfaceIndex == -1) { | 206 if (interfaceIndex == -1) { |
| 198 resolver->reject(DOMException::create(NotFoundError, kInterfaceNotFo
und)); | 207 resolver->reject(DOMException::create(NotFoundError, kInterfaceNotFo
und)); |
| 199 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { | 208 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
| 200 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); | 209 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); |
| 201 } else if (m_claimedInterfaces.get(interfaceIndex)) { | 210 } else if (m_claimedInterfaces.get(interfaceIndex)) { |
| 202 resolver->resolve(); | 211 resolver->resolve(); |
| 203 } else { | 212 } else { |
| 204 m_interfaceStateChangeInProgress.set(interfaceIndex); | 213 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 205 m_deviceRequests.add(resolver); | 214 m_deviceRequests.add(resolver); |
| 206 m_device->ClaimInterface(interfaceNumber, convertToBaseCallback(WTF:
:bind(&USBDevice::asyncClaimInterface, wrapPersistent(this), interfaceIndex, wra
pPersistent(resolver)))); | 215 m_device->ClaimInterface(interfaceNumber, convertToBaseCallback(WTF:
:bind(&USBDevice::asyncClaimInterface, wrapPersistent(this), interfaceIndex, wra
pPersistent(resolver)))); |
| 207 } | 216 } |
| 208 } | 217 } |
| 209 return promise; | 218 return promise; |
| 210 } | 219 } |
| 211 | 220 |
| 212 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) | 221 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) |
| 213 { | 222 { |
| 223 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceR
eleaseInterface); |
| 224 |
| 214 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 225 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 215 ScriptPromise promise = resolver->promise(); | 226 ScriptPromise promise = resolver->promise(); |
| 216 if (ensureDeviceConfigured(resolver)) { | 227 if (ensureDeviceConfigured(resolver)) { |
| 217 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 228 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 218 if (interfaceIndex == -1) { | 229 if (interfaceIndex == -1) { |
| 219 resolver->reject(DOMException::create(NotFoundError, "The interface
number provided is not supported by the device in its current configuration.")); | 230 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)) { | 231 } else if (m_interfaceStateChangeInProgress.get(interfaceIndex)) { |
| 221 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); | 232 resolver->reject(DOMException::create(InvalidStateError, kInterfaceS
tateChangeInProgress)); |
| 222 } else if (!m_claimedInterfaces.get(interfaceIndex)) { | 233 } else if (!m_claimedInterfaces.get(interfaceIndex)) { |
| 223 resolver->resolve(); | 234 resolver->resolve(); |
| 224 } else { | 235 } else { |
| 225 // Mark this interface's endpoints unavailable while its state is | 236 // Mark this interface's endpoints unavailable while its state is |
| 226 // changing. | 237 // changing. |
| 227 setEndpointsForInterface(interfaceIndex, false); | 238 setEndpointsForInterface(interfaceIndex, false); |
| 228 m_interfaceStateChangeInProgress.set(interfaceIndex); | 239 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 229 m_deviceRequests.add(resolver); | 240 m_deviceRequests.add(resolver); |
| 230 m_device->ReleaseInterface(interfaceNumber, convertToBaseCallback(WT
F::bind(&USBDevice::asyncReleaseInterface, wrapPersistent(this), interfaceIndex,
wrapPersistent(resolver)))); | 241 m_device->ReleaseInterface(interfaceNumber, convertToBaseCallback(WT
F::bind(&USBDevice::asyncReleaseInterface, wrapPersistent(this), interfaceIndex,
wrapPersistent(resolver)))); |
| 231 } | 242 } |
| 232 } | 243 } |
| 233 return promise; | 244 return promise; |
| 234 } | 245 } |
| 235 | 246 |
| 236 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint
8_t interfaceNumber, uint8_t alternateSetting) | 247 ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint
8_t interfaceNumber, uint8_t alternateSetting) |
| 237 { | 248 { |
| 249 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceS
electAlternateInterface); |
| 250 |
| 238 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 251 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 239 ScriptPromise promise = resolver->promise(); | 252 ScriptPromise promise = resolver->promise(); |
| 240 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { | 253 if (ensureInterfaceClaimed(interfaceNumber, resolver)) { |
| 241 // TODO(reillyg): This is duplicated work. | 254 // TODO(reillyg): This is duplicated work. |
| 242 int interfaceIndex = findInterfaceIndex(interfaceNumber); | 255 int interfaceIndex = findInterfaceIndex(interfaceNumber); |
| 243 ASSERT(interfaceIndex != -1); | 256 ASSERT(interfaceIndex != -1); |
| 244 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting
); | 257 int alternateIndex = findAlternateIndex(interfaceIndex, alternateSetting
); |
| 245 if (alternateIndex == -1) { | 258 if (alternateIndex == -1) { |
| 246 resolver->reject(DOMException::create(NotFoundError, "The alternate
setting provided is not supported by the device in its current configuration."))
; | 259 resolver->reject(DOMException::create(NotFoundError, "The alternate
setting provided is not supported by the device in its current configuration."))
; |
| 247 } else { | 260 } else { |
| 248 // Mark this old alternate interface's endpoints unavailable while | 261 // Mark this old alternate interface's endpoints unavailable while |
| 249 // the change is in progress. | 262 // the change is in progress. |
| 250 setEndpointsForInterface(interfaceIndex, false); | 263 setEndpointsForInterface(interfaceIndex, false); |
| 251 m_interfaceStateChangeInProgress.set(interfaceIndex); | 264 m_interfaceStateChangeInProgress.set(interfaceIndex); |
| 252 m_deviceRequests.add(resolver); | 265 m_deviceRequests.add(resolver); |
| 253 m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSet
ting, convertToBaseCallback(WTF::bind(&USBDevice::asyncSelectAlternateInterface,
wrapPersistent(this), interfaceNumber, alternateSetting, wrapPersistent(resolve
r)))); | 266 m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSet
ting, convertToBaseCallback(WTF::bind(&USBDevice::asyncSelectAlternateInterface,
wrapPersistent(this), interfaceNumber, alternateSetting, wrapPersistent(resolve
r)))); |
| 254 } | 267 } |
| 255 } | 268 } |
| 256 return promise; | 269 return promise; |
| 257 } | 270 } |
| 258 | 271 |
| 259 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) | 272 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) |
| 260 { | 273 { |
| 274 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceC
ontrolTransferIn); |
| 275 |
| 261 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 276 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 262 ScriptPromise promise = resolver->promise(); | 277 ScriptPromise promise = resolver->promise(); |
| 263 if (ensureDeviceConfigured(resolver)) { | 278 if (ensureDeviceConfigured(resolver)) { |
| 264 auto parameters = convertControlTransferParameters(setup, resolver); | 279 auto parameters = convertControlTransferParameters(setup, resolver); |
| 265 if (parameters) { | 280 if (parameters) { |
| 266 m_deviceRequests.add(resolver); | 281 m_deviceRequests.add(resolver); |
| 267 m_device->ControlTransferIn(std::move(parameters), length, 0, conver
tToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferIn, wrapPersistent(thi
s), wrapPersistent(resolver)))); | 282 m_device->ControlTransferIn(std::move(parameters), length, 0, conver
tToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferIn, wrapPersistent(thi
s), wrapPersistent(resolver)))); |
| 268 } | 283 } |
| 269 } | 284 } |
| 270 return promise; | 285 return promise; |
| 271 } | 286 } |
| 272 | 287 |
| 273 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) | 288 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) |
| 274 { | 289 { |
| 290 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceC
ontrolTransferOut); |
| 291 |
| 275 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 292 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 276 ScriptPromise promise = resolver->promise(); | 293 ScriptPromise promise = resolver->promise(); |
| 277 if (ensureDeviceConfigured(resolver)) { | 294 if (ensureDeviceConfigured(resolver)) { |
| 278 auto parameters = convertControlTransferParameters(setup, resolver); | 295 auto parameters = convertControlTransferParameters(setup, resolver); |
| 279 if (parameters) { | 296 if (parameters) { |
| 280 m_deviceRequests.add(resolver); | 297 m_deviceRequests.add(resolver); |
| 281 m_device->ControlTransferOut(std::move(parameters), Vector<uint8_t>(
), 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapP
ersistent(this), 0, wrapPersistent(resolver)))); | 298 m_device->ControlTransferOut(std::move(parameters), Vector<uint8_t>(
), 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapP
ersistent(this), 0, wrapPersistent(resolver)))); |
| 282 } | 299 } |
| 283 } | 300 } |
| 284 return promise; | 301 return promise; |
| 285 } | 302 } |
| 286 | 303 |
| 287 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | 304 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) |
| 288 { | 305 { |
| 306 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceC
ontrolTransferOut); |
| 307 |
| 289 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 308 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 290 ScriptPromise promise = resolver->promise(); | 309 ScriptPromise promise = resolver->promise(); |
| 291 if (ensureDeviceConfigured(resolver)) { | 310 if (ensureDeviceConfigured(resolver)) { |
| 292 auto parameters = convertControlTransferParameters(setup, resolver); | 311 auto parameters = convertControlTransferParameters(setup, resolver); |
| 293 if (parameters) { | 312 if (parameters) { |
| 294 Vector<uint8_t> buffer = convertBufferSource(data); | 313 Vector<uint8_t> buffer = convertBufferSource(data); |
| 295 unsigned transferLength = buffer.size(); | 314 unsigned transferLength = buffer.size(); |
| 296 m_deviceRequests.add(resolver); | 315 m_deviceRequests.add(resolver); |
| 297 m_device->ControlTransferOut(std::move(parameters), buffer, 0, conve
rtToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapPersistent(t
his), transferLength, wrapPersistent(resolver)))); | 316 m_device->ControlTransferOut(std::move(parameters), buffer, 0, conve
rtToBaseCallback(WTF::bind(&USBDevice::asyncControlTransferOut, wrapPersistent(t
his), transferLength, wrapPersistent(resolver)))); |
| 298 } | 317 } |
| 299 } | 318 } |
| 300 return promise; | 319 return promise; |
| 301 } | 320 } |
| 302 | 321 |
| 303 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) | 322 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u
int8_t endpointNumber) |
| 304 { | 323 { |
| 324 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceC
learHalt); |
| 325 |
| 305 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 326 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 306 ScriptPromise promise = resolver->promise(); | 327 ScriptPromise promise = resolver->promise(); |
| 307 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { | 328 if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { |
| 308 m_deviceRequests.add(resolver); | 329 m_deviceRequests.add(resolver); |
| 309 m_device->ClearHalt(endpointNumber, convertToBaseCallback(WTF::bind(&USB
Device::asyncClearHalt, wrapPersistent(this), wrapPersistent(resolver)))); | 330 m_device->ClearHalt(endpointNumber, convertToBaseCallback(WTF::bind(&USB
Device::asyncClearHalt, wrapPersistent(this), wrapPersistent(resolver)))); |
| 310 } | 331 } |
| 311 return promise; | 332 return promise; |
| 312 } | 333 } |
| 313 | 334 |
| 314 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) | 335 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) |
| 315 { | 336 { |
| 337 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceT
ransferIn); |
| 338 |
| 316 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 339 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 317 ScriptPromise promise = resolver->promise(); | 340 ScriptPromise promise = resolver->promise(); |
| 318 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 341 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
| 319 m_deviceRequests.add(resolver); | 342 m_deviceRequests.add(resolver); |
| 320 m_device->GenericTransferIn(endpointNumber, length, 0, convertToBaseCall
back(WTF::bind(&USBDevice::asyncTransferIn, wrapPersistent(this), wrapPersistent
(resolver)))); | 343 m_device->GenericTransferIn(endpointNumber, length, 0, convertToBaseCall
back(WTF::bind(&USBDevice::asyncTransferIn, wrapPersistent(this), wrapPersistent
(resolver)))); |
| 321 } | 344 } |
| 322 return promise; | 345 return promise; |
| 323 } | 346 } |
| 324 | 347 |
| 325 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) | 348 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) |
| 326 { | 349 { |
| 350 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceT
ransferOut); |
| 351 |
| 327 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 352 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 328 ScriptPromise promise = resolver->promise(); | 353 ScriptPromise promise = resolver->promise(); |
| 329 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 354 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
| 330 Vector<uint8_t> buffer = convertBufferSource(data); | 355 Vector<uint8_t> buffer = convertBufferSource(data); |
| 331 unsigned transferLength = buffer.size(); | 356 unsigned transferLength = buffer.size(); |
| 332 m_deviceRequests.add(resolver); | 357 m_deviceRequests.add(resolver); |
| 333 m_device->GenericTransferOut(endpointNumber, buffer, 0, convertToBaseCal
lback(WTF::bind(&USBDevice::asyncTransferOut, wrapPersistent(this), transferLeng
th, wrapPersistent(resolver)))); | 358 m_device->GenericTransferOut(endpointNumber, buffer, 0, convertToBaseCal
lback(WTF::bind(&USBDevice::asyncTransferOut, wrapPersistent(this), transferLeng
th, wrapPersistent(resolver)))); |
| 334 } | 359 } |
| 335 return promise; | 360 return promise; |
| 336 } | 361 } |
| 337 | 362 |
| 338 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) | 363 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) |
| 339 { | 364 { |
| 365 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceI
sochronousTransferIn); |
| 366 |
| 340 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 367 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 341 ScriptPromise promise = resolver->promise(); | 368 ScriptPromise promise = resolver->promise(); |
| 342 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { | 369 if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
| 343 m_deviceRequests.add(resolver); | 370 m_deviceRequests.add(resolver); |
| 344 m_device->IsochronousTransferIn(endpointNumber, packetLengths, 0, conver
tToBaseCallback(WTF::bind(&USBDevice::asyncIsochronousTransferIn, wrapPersistent
(this), wrapPersistent(resolver)))); | 371 m_device->IsochronousTransferIn(endpointNumber, packetLengths, 0, conver
tToBaseCallback(WTF::bind(&USBDevice::asyncIsochronousTransferIn, wrapPersistent
(this), wrapPersistent(resolver)))); |
| 345 } | 372 } |
| 346 return promise; | 373 return promise; |
| 347 } | 374 } |
| 348 | 375 |
| 349 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) | 376 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) |
| 350 { | 377 { |
| 378 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceI
sochronousTransferOut); |
| 379 |
| 351 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 380 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 352 ScriptPromise promise = resolver->promise(); | 381 ScriptPromise promise = resolver->promise(); |
| 353 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { | 382 if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
| 354 m_deviceRequests.add(resolver); | 383 m_deviceRequests.add(resolver); |
| 355 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), packetLengths, 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncIsochrono
usTransferOut, wrapPersistent(this), wrapPersistent(resolver)))); | 384 m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(dat
a), packetLengths, 0, convertToBaseCallback(WTF::bind(&USBDevice::asyncIsochrono
usTransferOut, wrapPersistent(this), wrapPersistent(resolver)))); |
| 356 } | 385 } |
| 357 return promise; | 386 return promise; |
| 358 } | 387 } |
| 359 | 388 |
| 360 ScriptPromise USBDevice::reset(ScriptState* scriptState) | 389 ScriptPromise USBDevice::reset(ScriptState* scriptState) |
| 361 { | 390 { |
| 391 UseCounter::count(scriptState->getExecutionContext(), UseCounter::UsbDeviceR
eset); |
| 392 |
| 362 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 393 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 363 ScriptPromise promise = resolver->promise(); | 394 ScriptPromise promise = resolver->promise(); |
| 364 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { | 395 if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
| 365 if (!m_opened) { | 396 if (!m_opened) { |
| 366 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); | 397 resolver->reject(DOMException::create(InvalidStateError, kOpenRequir
ed)); |
| 367 } else { | 398 } else { |
| 368 m_deviceRequests.add(resolver); | 399 m_deviceRequests.add(resolver); |
| 369 m_device->Reset(convertToBaseCallback(WTF::bind(&USBDevice::asyncRes
et, wrapPersistent(this), wrapPersistent(resolver)))); | 400 m_device->Reset(convertToBaseCallback(WTF::bind(&USBDevice::asyncRes
et, wrapPersistent(this), wrapPersistent(resolver)))); |
| 370 } | 401 } |
| 371 } | 402 } |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 bool USBDevice::markRequestComplete(ScriptPromiseResolver* resolver) | 813 bool USBDevice::markRequestComplete(ScriptPromiseResolver* resolver) |
| 783 { | 814 { |
| 784 auto requestEntry = m_deviceRequests.find(resolver); | 815 auto requestEntry = m_deviceRequests.find(resolver); |
| 785 if (requestEntry == m_deviceRequests.end()) | 816 if (requestEntry == m_deviceRequests.end()) |
| 786 return false; | 817 return false; |
| 787 m_deviceRequests.remove(requestEntry); | 818 m_deviceRequests.remove(requestEntry); |
| 788 return true; | 819 return true; |
| 789 } | 820 } |
| 790 | 821 |
| 791 } // namespace blink | 822 } // namespace blink |
| OLD | NEW |