Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: third_party/WebKit/Source/modules/webusb/USBDevice.cpp

Issue 1781533002: Track USBDevice open state in Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/CallbackPromiseAdapter.h" 7 #include "bindings/core/v8/CallbackPromiseAdapter.h"
8 #include "bindings/core/v8/ScriptPromise.h" 8 #include "bindings/core/v8/ScriptPromise.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "bindings/core/v8/ToV8.h" 10 #include "bindings/core/v8/ToV8.h"
11 #include "core/dom/DOMArrayBuffer.h" 11 #include "core/dom/DOMArrayBuffer.h"
12 #include "core/dom/DOMArrayBufferView.h" 12 #include "core/dom/DOMArrayBufferView.h"
13 #include "core/dom/DOMException.h" 13 #include "core/dom/DOMException.h"
14 #include "core/dom/ExceptionCode.h" 14 #include "core/dom/ExceptionCode.h"
15 #include "modules/webusb/USBConfiguration.h" 15 #include "modules/webusb/USBConfiguration.h"
16 #include "modules/webusb/USBControlTransferParameters.h" 16 #include "modules/webusb/USBControlTransferParameters.h"
17 #include "modules/webusb/USBError.h" 17 #include "modules/webusb/USBError.h"
18 #include "modules/webusb/USBInTransferResult.h" 18 #include "modules/webusb/USBInTransferResult.h"
19 #include "modules/webusb/USBIsochronousInTransferResult.h" 19 #include "modules/webusb/USBIsochronousInTransferResult.h"
20 #include "modules/webusb/USBIsochronousOutTransferResult.h" 20 #include "modules/webusb/USBIsochronousOutTransferResult.h"
21 #include "modules/webusb/USBOutTransferResult.h" 21 #include "modules/webusb/USBOutTransferResult.h"
22 #include "public/platform/modules/webusb/WebUSBTransferInfo.h" 22 #include "public/platform/modules/webusb/WebUSBTransferInfo.h"
23 #include "wtf/Assertions.h" 23 #include "wtf/Assertions.h"
24 24
25 namespace blink { 25 namespace blink {
26 26
27 namespace { 27 namespace {
28 28
29 const char kOpenCloseInProgress[] = "An open() or close() task is in progress.";
30 const char kOpenRequired[] = "The device must be open()ed first.";
31
29 DOMException* convertControlTransferParameters( 32 DOMException* convertControlTransferParameters(
30 WebUSBDevice::TransferDirection direction, 33 WebUSBDevice::TransferDirection direction,
31 const USBControlTransferParameters& parameters, 34 const USBControlTransferParameters& parameters,
32 WebUSBDevice::ControlTransferParameters* webParameters) 35 WebUSBDevice::ControlTransferParameters* webParameters)
33 { 36 {
34 webParameters->direction = direction; 37 webParameters->direction = direction;
35 38
36 if (parameters.requestType() == "standard") 39 if (parameters.requestType() == "standard")
37 webParameters->type = WebUSBDevice::RequestType::Standard; 40 webParameters->type = WebUSBDevice::RequestType::Standard;
38 else if (parameters.requestType() == "class") 41 else if (parameters.requestType() == "class")
(...skipping 28 matching lines...) Expand all
67 case WebUSBTransferInfo::Status::Stall: 70 case WebUSBTransferInfo::Status::Stall:
68 return "stall"; 71 return "stall";
69 case WebUSBTransferInfo::Status::Babble: 72 case WebUSBTransferInfo::Status::Babble:
70 return "babble"; 73 return "babble";
71 default: 74 default:
72 ASSERT_NOT_REACHED(); 75 ASSERT_NOT_REACHED();
73 return ""; 76 return "";
74 } 77 }
75 } 78 }
76 79
80 class OpenClosePromiseAdapter : public WebCallbacks<void, const WebUSBError&> {
81 public:
82 OpenClosePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, bool desiredState)
83 : m_device(device)
84 , m_resolver(resolver)
85 , m_desiredState(desiredState)
86 {
87 }
88
89 void onSuccess() override
90 {
91 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
92 return;
93 if (m_device)
94 m_device->onDeviceOpenedOrClosed(m_desiredState);
95 m_resolver->resolve();
96 }
97
98 void onError(const WebUSBError& e) override
99 {
100 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
101 return;
102 if (m_device)
103 m_device->onDeviceOpenedOrClosed(!m_desiredState);
104 m_resolver->reject(USBError::take(m_resolver, e));
105 }
106
107 private:
108 WeakPersistent<USBDevice> m_device;
109 Persistent<ScriptPromiseResolver> m_resolver;
110 bool m_desiredState; // true: open, false: closed
111 };
112
77 class GetConfigurationPromiseAdapter : public WebCallbacks<uint8_t, const WebUSB Error&> { 113 class GetConfigurationPromiseAdapter : public WebCallbacks<uint8_t, const WebUSB Error&> {
78 public: 114 public:
79 GetConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* res olver) : m_device(device), m_resolver(resolver) {} 115 GetConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* res olver) : m_device(device), m_resolver(resolver) {}
80 116
81 void onSuccess(uint8_t value) override 117 void onSuccess(uint8_t value) override
82 { 118 {
83 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped()) 119 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
84 return; 120 return;
85 m_resolver->resolve(USBConfiguration::createFromValue(m_device, value)); 121 m_resolver->resolve(USBConfiguration::createFromValue(m_device, value));
86 } 122 }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 return m_buffer.getAsArrayBuffer()->byteLength(); 221 return m_buffer.getAsArrayBuffer()->byteLength();
186 return m_buffer.getAsArrayBufferView()->byteLength(); 222 return m_buffer.getAsArrayBufferView()->byteLength();
187 } 223 }
188 224
189 private: 225 private:
190 const ArrayBufferOrArrayBufferView& m_buffer; 226 const ArrayBufferOrArrayBufferView& m_buffer;
191 }; 227 };
192 228
193 } // namespace 229 } // namespace
194 230
231 // static
232 USBDevice* USBDevice::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebUSBDev ice> device)
233 {
234 return USBDevice::create(device, resolver->getExecutionContext());
235 }
236
237 void USBDevice::onDeviceOpenedOrClosed(bool opened)
238 {
239 m_opened = opened;
240 m_deviceStateChangeInProgress = false;
241 }
242
195 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const 243 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const
196 { 244 {
197 HeapVector<Member<USBConfiguration>> configurations; 245 HeapVector<Member<USBConfiguration>> configurations;
198 for (size_t i = 0; i < info().configurations.size(); ++i) 246 for (size_t i = 0; i < info().configurations.size(); ++i)
199 configurations.append(USBConfiguration::create(this, i)); 247 configurations.append(USBConfiguration::create(this, i));
200 return configurations; 248 return configurations;
201 } 249 }
202 250
203 ScriptPromise USBDevice::open(ScriptState* scriptState) 251 ScriptPromise USBDevice::open(ScriptState* scriptState)
204 { 252 {
205 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 253 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
206 ScriptPromise promise = resolver->promise(); 254 ScriptPromise promise = resolver->promise();
207 m_device->open(new CallbackPromiseAdapter<void, USBError>(resolver)); 255 if (m_deviceStateChangeInProgress) {
208 setContext(scriptState->getExecutionContext()); 256 resolver->reject(DOMException::create(InvalidStateError, kOpenCloseInPro gress));
257 } else if (m_opened) {
258 resolver->resolve();
259 } else {
260 m_deviceStateChangeInProgress = true;
261 m_device->open(new OpenClosePromiseAdapter(this, resolver, true /* open */));
262 }
209 return promise; 263 return promise;
210 } 264 }
211 265
212 ScriptPromise USBDevice::close(ScriptState* scriptState) 266 ScriptPromise USBDevice::close(ScriptState* scriptState)
213 { 267 {
214 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 268 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
215 ScriptPromise promise = resolver->promise(); 269 ScriptPromise promise = resolver->promise();
216 m_device->close(new CallbackPromiseAdapter<void, USBError>(resolver)); 270 if (m_deviceStateChangeInProgress) {
217 setContext(nullptr); 271 resolver->reject(DOMException::create(InvalidStateError, kOpenCloseInPro gress));
272 } else if (!m_opened) {
273 resolver->resolve();
274 } else {
275 m_deviceStateChangeInProgress = true;
276 m_device->close(new OpenClosePromiseAdapter(this, resolver, false /* clo sed */));
277 }
218 return promise; 278 return promise;
219 } 279 }
220 280
221 ScriptPromise USBDevice::getConfiguration(ScriptState* scriptState) 281 ScriptPromise USBDevice::getConfiguration(ScriptState* scriptState)
222 { 282 {
223 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 283 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
224 ScriptPromise promise = resolver->promise(); 284 ScriptPromise promise = resolver->promise();
225 m_device->getConfiguration(new GetConfigurationPromiseAdapter(this, resolver )); 285 m_device->getConfiguration(new GetConfigurationPromiseAdapter(this, resolver ));
226 return promise; 286 return promise;
227 } 287 }
228 288
229 ScriptPromise USBDevice::setConfiguration(ScriptState* scriptState, uint8_t conf igurationValue) 289 ScriptPromise USBDevice::setConfiguration(ScriptState* scriptState, uint8_t conf igurationValue)
230 { 290 {
231 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 291 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
232 ScriptPromise promise = resolver->promise(); 292 ScriptPromise promise = resolver->promise();
233 m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<vo id, USBError>(resolver)); 293 if (!m_opened)
294 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
295 else
296 m_device->setConfiguration(configurationValue, new CallbackPromiseAdapte r<void, USBError>(resolver));
234 return promise; 297 return promise;
235 } 298 }
236 299
237 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf aceNumber) 300 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf aceNumber)
238 { 301 {
239 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 302 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
240 ScriptPromise promise = resolver->promise(); 303 ScriptPromise promise = resolver->promise();
241 m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, U SBError>(resolver)); 304 if (!m_opened)
305 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
306 else
307 m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<voi d, USBError>(resolver));
242 return promise; 308 return promise;
243 } 309 }
244 310
245 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte rfaceNumber) 311 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte rfaceNumber)
246 { 312 {
247 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 313 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
248 ScriptPromise promise = resolver->promise(); 314 ScriptPromise promise = resolver->promise();
249 m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); 315 if (!m_opened)
316 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
317 else
318 m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<v oid, USBError>(resolver));
250 return promise; 319 return promise;
251 } 320 }
252 321
253 ScriptPromise USBDevice::setInterface(ScriptState* scriptState, uint8_t interfac eNumber, uint8_t alternateSetting) 322 ScriptPromise USBDevice::setInterface(ScriptState* scriptState, uint8_t interfac eNumber, uint8_t alternateSetting)
254 { 323 {
255 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 324 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
256 ScriptPromise promise = resolver->promise(); 325 ScriptPromise promise = resolver->promise();
257 m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromis eAdapter<void, USBError>(resolver)); 326 if (!m_opened)
327 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
328 else
329 m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPr omiseAdapter<void, USBError>(resolver));
258 return promise; 330 return promise;
259 } 331 }
260 332
261 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length) 333 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length)
262 { 334 {
263 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 335 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
264 ScriptPromise promise = resolver->promise(); 336 ScriptPromise promise = resolver->promise();
337 if (!m_opened) {
338 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
339 return promise;
340 }
341
265 WebUSBDevice::ControlTransferParameters parameters; 342 WebUSBDevice::ControlTransferParameters parameters;
266 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::In, setup, &parameters); 343 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::In, setup, &parameters);
267 if (error) 344 if (error) {
268 resolver->reject(error); 345 resolver->reject(error);
269 else 346 return promise;
270 m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPr omiseAdapter<InputTransferResult, USBError>(resolver)); 347 }
348
349 m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromis eAdapter<InputTransferResult, USBError>(resolver));
271 return promise; 350 return promise;
272 } 351 }
273 352
274 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup) 353 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup)
275 { 354 {
276 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 355 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
277 ScriptPromise promise = resolver->promise(); 356 ScriptPromise promise = resolver->promise();
357 if (!m_opened) {
358 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
359 return promise;
360 }
361
278 WebUSBDevice::ControlTransferParameters parameters; 362 WebUSBDevice::ControlTransferParameters parameters;
279 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, &parameters); 363 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, &parameters);
280 if (error) 364 if (error) {
281 resolver->reject(error); 365 resolver->reject(error);
282 else 366 return promise;
283 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromise Adapter<OutputTransferResult, USBError>(resolver)); 367 }
368
369 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdap ter<OutputTransferResult, USBError>(resolver));
284 return promise; 370 return promise;
285 } 371 }
286 372
287 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) 373 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data)
288 { 374 {
289 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 375 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
290 ScriptPromise promise = resolver->promise(); 376 ScriptPromise promise = resolver->promise();
377 if (!m_opened) {
378 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
379 return promise;
380 }
381
291 WebUSBDevice::ControlTransferParameters parameters; 382 WebUSBDevice::ControlTransferParameters parameters;
292 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, &parameters); 383 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, &parameters);
293 if (error) { 384 if (error) {
294 resolver->reject(error); 385 resolver->reject(error);
295 } else { 386 return promise;
296 BufferSource buffer(data);
297 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, n ew CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver));
298 } 387 }
388
389 BufferSource buffer(data);
390 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new C allbackPromiseAdapter<OutputTransferResult, USBError>(resolver));
299 return promise; 391 return promise;
300 } 392 }
301 393
302 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, uint8_t endpointNum ber) 394 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, uint8_t endpointNum ber)
303 { 395 {
304 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 396 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
305 ScriptPromise promise = resolver->promise(); 397 ScriptPromise promise = resolver->promise();
306 m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBErro r>(resolver)); 398 if (!m_opened)
399 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
400 else
401 m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USB Error>(resolver));
307 return promise; 402 return promise;
308 } 403 }
309 404
310 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu mber, unsigned length) 405 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu mber, unsigned length)
311 { 406 {
312 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 407 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
313 ScriptPromise promise = resolver->promise(); 408 ScriptPromise promise = resolver->promise();
314 m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, null ptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolv er)); 409 if (!m_opened)
410 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
411 else
412 m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(re solver));
315 return promise; 413 return promise;
316 } 414 }
317 415
318 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN umber, const ArrayBufferOrArrayBufferView& data) 416 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN umber, const ArrayBufferOrArrayBufferView& data)
319 { 417 {
320 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 418 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
321 ScriptPromise promise = resolver->promise(); 419 ScriptPromise promise = resolver->promise();
322 BufferSource buffer(data); 420 if (!m_opened) {
323 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buf fer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, U SBError>(resolver)); 421 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
422 } else {
423 BufferSource buffer(data);
424 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResul t, USBError>(resolver));
425 }
324 return promise; 426 return promise;
325 } 427 }
326 428
327 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t endpointNumber, Vector<unsigned> packetLengths) 429 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t endpointNumber, Vector<unsigned> packetLengths)
328 { 430 {
329 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 431 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
330 ScriptPromise promise = resolver->promise(); 432 ScriptPromise promise = resolver->promise();
331 m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointN umber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInput TransferResult, USBError>(resolver)); 433 if (!m_opened)
434 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
435 else
436 m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpo intNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousI nputTransferResult, USBError>(resolver));
332 return promise; 437 return promise;
333 } 438 }
334 439
335 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_ t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac ketLengths) 440 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_ t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac ketLengths)
336 { 441 {
337 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 442 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
338 ScriptPromise promise = resolver->promise(); 443 ScriptPromise promise = resolver->promise();
339 BufferSource buffer(data); 444 if (!m_opened) {
340 m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpoint Number, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapt er<IsochronousOutputTransferResult, USBError>(resolver)); 445 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
446 } else {
447 BufferSource buffer(data);
448 m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endp ointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseA dapter<IsochronousOutputTransferResult, USBError>(resolver));
449 }
341 return promise; 450 return promise;
342 } 451 }
343 452
344 ScriptPromise USBDevice::reset(ScriptState* scriptState) 453 ScriptPromise USBDevice::reset(ScriptState* scriptState)
345 { 454 {
346 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 455 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
347 ScriptPromise promise = resolver->promise(); 456 ScriptPromise promise = resolver->promise();
348 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); 457 if (!m_opened)
458 resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)) ;
459 else
460 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver));
349 return promise; 461 return promise;
350 } 462 }
351 463
352 void USBDevice::contextDestroyed() 464 void USBDevice::contextDestroyed()
353 { 465 {
354 m_device->close(new WebUSBDeviceCloseCallbacks()); 466 if (m_opened)
467 m_device->close(new WebUSBDeviceCloseCallbacks());
355 } 468 }
356 469
357 DEFINE_TRACE(USBDevice) 470 DEFINE_TRACE(USBDevice)
358 { 471 {
359 ContextLifecycleObserver::trace(visitor); 472 ContextLifecycleObserver::trace(visitor);
360 } 473 }
361 474
362 } // namespace blink 475 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/webusb/USBDevice.h ('k') | third_party/WebKit/Source/modules/webusb/USBDevice.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698