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 |