Chromium Code Reviews| 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 "config.h" | 5 #include "config.h" |
| 6 #include "modules/webusb/USBDevice.h" | 6 #include "modules/webusb/USBDevice.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/CallbackPromiseAdapter.h" | |
| 9 #include "bindings/core/v8/ScriptPromise.h" | |
| 10 #include "bindings/core/v8/ScriptPromiseResolver.h" | |
| 11 #include "bindings/core/v8/ToV8.h" | |
| 12 #include "core/dom/DOMArrayBuffer.h" | |
| 13 #include "core/dom/DOMArrayBufferView.h" | |
| 14 #include "core/dom/DOMException.h" | |
| 15 #include "core/dom/ExceptionCode.h" | |
| 8 #include "modules/webusb/USBConfiguration.h" | 16 #include "modules/webusb/USBConfiguration.h" |
| 17 #include "modules/webusb/USBControlTransferParameters.h" | |
| 18 #include "modules/webusb/USBError.h" | |
| 19 #include "modules/webusb/USBInTransferResult.h" | |
| 20 #include "modules/webusb/USBOutTransferResult.h" | |
| 21 #include "public/platform/modules/webusb/WebUSBTransferInfo.h" | |
| 9 | 22 |
| 10 namespace blink { | 23 namespace blink { |
| 11 | 24 |
| 25 namespace { | |
| 26 | |
| 27 DOMException* convertControlTransferParameters( | |
| 28 WebUSBDevice::TransferDirection direction, | |
| 29 const USBControlTransferParameters& parameters, | |
| 30 WebUSBDevice::ControlTransferParameters* webParameters) | |
| 31 { | |
| 32 webParameters->direction = direction; | |
| 33 | |
| 34 if (parameters.requestType() == "standard") | |
| 35 webParameters->type = WebUSBDevice::RequestType::Standard; | |
| 36 else if (parameters.requestType() == "class") | |
| 37 webParameters->type = WebUSBDevice::RequestType::Class; | |
| 38 else if (parameters.requestType() == "vendor") | |
| 39 webParameters->type = WebUSBDevice::RequestType::Vendor; | |
| 40 else | |
| 41 return DOMException::create(AbortError, "The control transfer requestTyp e parameter is invalid."); | |
|
Reilly Grant (use Gerrit)
2015/08/24 21:47:17
As I understand it these should be TypeErrors.
Ken Rockot(use gerrit already)
2015/08/24 22:52:37
TypeMismatchError?
| |
| 42 | |
| 43 if (parameters.recipient() == "device") | |
| 44 webParameters->recipient = WebUSBDevice::RequestRecipient::Device; | |
| 45 else if (parameters.recipient() == "interface") | |
| 46 webParameters->recipient = WebUSBDevice::RequestRecipient::Interface; | |
| 47 else if (parameters.recipient() == "endpoint") | |
| 48 webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint; | |
| 49 else if (parameters.recipient() == "other") | |
| 50 webParameters->recipient = WebUSBDevice::RequestRecipient::Other; | |
| 51 else | |
| 52 return DOMException::create(AbortError, "The control transfer recipient parameter is invalid."); | |
| 53 | |
| 54 webParameters->request = parameters.request(); | |
| 55 webParameters->value = parameters.value(); | |
| 56 webParameters->index = parameters.index(); | |
| 57 return nullptr; | |
| 58 } | |
| 59 | |
| 60 String convertTransferStatus(const WebUSBTransferInfo::Status& status) | |
| 61 { | |
| 62 switch (status) { | |
| 63 case WebUSBTransferInfo::Status::Ok: | |
| 64 return "ok"; | |
| 65 case WebUSBTransferInfo::Status::Stall: | |
| 66 return "stall"; | |
| 67 case WebUSBTransferInfo::Status::Babble: | |
| 68 return "babble"; | |
| 69 default: | |
| 70 ASSERT_NOT_REACHED(); | |
| 71 return ""; | |
| 72 } | |
| 73 } | |
| 74 | |
| 75 class InputTransferResult { | |
| 76 WTF_MAKE_NONCOPYABLE(InputTransferResult); | |
| 77 public: | |
| 78 using WebType = OwnPtr<WebUSBTransferInfo>; | |
| 79 | |
| 80 static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTr ansferInfo> webTransferInfo) | |
| 81 { | |
| 82 return USBInTransferResult::create(convertTransferStatus(webTransferInfo ->status), webTransferInfo->data); | |
| 83 } | |
| 84 | |
| 85 private: | |
| 86 InputTransferResult() = delete; | |
| 87 }; | |
| 88 | |
| 89 class OutputTransferResult { | |
| 90 WTF_MAKE_NONCOPYABLE(OutputTransferResult); | |
| 91 public: | |
| 92 using WebType = OwnPtr<WebUSBTransferInfo>; | |
| 93 | |
| 94 static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBT ransferInfo> webTransferInfo) | |
| 95 { | |
| 96 return USBOutTransferResult::create(convertTransferStatus(webTransferInf o->status), webTransferInfo->bytesWritten); | |
| 97 } | |
| 98 | |
| 99 private: | |
| 100 OutputTransferResult() = delete; | |
| 101 }; | |
| 102 | |
| 103 class BufferSource { | |
| 104 WTF_MAKE_NONCOPYABLE(BufferSource); | |
| 105 public: | |
| 106 BufferSource(const ArrayBufferOrArrayBufferView& buffer) : m_buffer(buffer) { } | |
| 107 | |
| 108 uint8_t* data() const | |
| 109 { | |
| 110 if (m_buffer.isArrayBuffer()) | |
|
Reilly Grant (use Gerrit)
2015/08/24 21:47:17
Handle the case of m_buffer.isNull()?
Ken Rockot(use gerrit already)
2015/08/24 22:52:37
Added an ASSERT to the constructor. It should neve
| |
| 111 return static_cast<uint8_t*>(m_buffer.getAsArrayBuffer()->data()); | |
| 112 return static_cast<uint8_t*>(m_buffer.getAsArrayBufferView()->baseAddres s()); | |
| 113 } | |
| 114 | |
| 115 unsigned size() const | |
| 116 { | |
| 117 if (m_buffer.isArrayBuffer()) | |
| 118 return m_buffer.getAsArrayBuffer()->byteLength(); | |
| 119 return m_buffer.getAsArrayBufferView()->byteLength(); | |
| 120 } | |
| 121 | |
| 122 private: | |
| 123 const ArrayBufferOrArrayBufferView& m_buffer; | |
| 124 }; | |
| 125 | |
| 126 } // namespace | |
| 127 | |
| 12 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const | 128 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const |
| 13 { | 129 { |
| 14 HeapVector<Member<USBConfiguration>> configurations; | 130 HeapVector<Member<USBConfiguration>> configurations; |
| 15 for (size_t i = 0; i < info().configurations.size(); ++i) | 131 for (size_t i = 0; i < info().configurations.size(); ++i) |
| 16 configurations.append(USBConfiguration::create(this, i)); | 132 configurations.append(USBConfiguration::create(this, i)); |
| 17 return configurations; | 133 return configurations; |
| 18 } | 134 } |
| 19 | 135 |
| 136 ScriptPromise USBDevice::open(ScriptState* scriptState) | |
| 137 { | |
| 138 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 139 ScriptPromise promise = resolver->promise(); | |
| 140 m_device->open(new CallbackPromiseAdapter<void, USBError>(resolver)); | |
| 141 return promise; | |
| 142 } | |
| 143 | |
| 144 ScriptPromise USBDevice::close(ScriptState* scriptState) | |
| 145 { | |
| 146 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 147 ScriptPromise promise = resolver->promise(); | |
| 148 m_device->close(new CallbackPromiseAdapter<void, USBError>(resolver)); | |
| 149 return promise; | |
| 150 } | |
| 151 | |
| 152 ScriptPromise USBDevice::setConfiguration(ScriptState* scriptState, uint8_t conf igurationValue) | |
| 153 { | |
| 154 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 155 ScriptPromise promise = resolver->promise(); | |
| 156 m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<vo id, USBError>(resolver)); | |
| 157 return promise; | |
| 158 } | |
| 159 | |
| 160 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf aceNumber) | |
| 161 { | |
| 162 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 163 ScriptPromise promise = resolver->promise(); | |
| 164 m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, U SBError>(resolver)); | |
| 165 return promise; | |
| 166 } | |
| 167 | |
| 168 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte rfaceNumber) | |
| 169 { | |
| 170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 171 ScriptPromise promise = resolver->promise(); | |
| 172 m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); | |
| 173 return promise; | |
| 174 } | |
| 175 | |
| 176 ScriptPromise USBDevice::setInterface(ScriptState* scriptState, uint8_t interfac eNumber, uint8_t alternateSetting) | |
| 177 { | |
| 178 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 179 ScriptPromise promise = resolver->promise(); | |
| 180 m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromis eAdapter<void, USBError>(resolver)); | |
| 181 return promise; | |
| 182 } | |
| 183 | |
| 184 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length) | |
| 185 { | |
| 186 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 187 ScriptPromise promise = resolver->promise(); | |
| 188 WebUSBDevice::ControlTransferParameters parameters; | |
| 189 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::In, setup, ¶meters); | |
| 190 if (error) | |
| 191 resolver->reject(error); | |
| 192 else | |
| 193 m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPr omiseAdapter<InputTransferResult, USBError>(resolver)); | |
| 194 return promise; | |
| 195 } | |
| 196 | |
| 197 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup) | |
| 198 { | |
| 199 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 200 ScriptPromise promise = resolver->promise(); | |
| 201 WebUSBDevice::ControlTransferParameters parameters; | |
| 202 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, ¶meters); | |
| 203 if (error) | |
| 204 resolver->reject(error); | |
| 205 else | |
| 206 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromise Adapter<OutputTransferResult, USBError>(resolver)); | |
| 207 return promise; | |
| 208 } | |
| 209 | |
| 210 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | |
| 211 { | |
| 212 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 213 ScriptPromise promise = resolver->promise(); | |
| 214 WebUSBDevice::ControlTransferParameters parameters; | |
| 215 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, ¶meters); | |
| 216 if (error) { | |
| 217 resolver->reject(error); | |
| 218 } else { | |
| 219 BufferSource buffer(data); | |
| 220 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, n ew CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); | |
| 221 } | |
| 222 return promise; | |
| 223 } | |
| 224 | |
| 225 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, uint8_t endpointNum ber) | |
| 226 { | |
| 227 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 228 ScriptPromise promise = resolver->promise(); | |
| 229 m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBErro r>(resolver)); | |
| 230 return promise; | |
| 231 } | |
| 232 | |
| 233 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu mber, unsigned length) | |
| 234 { | |
| 235 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 236 ScriptPromise promise = resolver->promise(); | |
| 237 m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, null ptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolv er)); | |
| 238 return promise; | |
| 239 } | |
| 240 | |
| 241 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN umber, const ArrayBufferOrArrayBufferView& data) | |
| 242 { | |
| 243 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 244 ScriptPromise promise = resolver->promise(); | |
| 245 BufferSource buffer(data); | |
| 246 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buf fer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, U SBError>(resolver)); | |
| 247 return promise; | |
| 248 } | |
| 249 | |
| 250 ScriptPromise USBDevice::reset(ScriptState* scriptState) | |
| 251 { | |
| 252 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
| 253 ScriptPromise promise = resolver->promise(); | |
| 254 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); | |
| 255 return promise; | |
| 256 } | |
| 257 | |
| 20 } // namespace blink | 258 } // namespace blink |
| OLD | NEW |