Chromium Code Reviews| Index: third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTDescriptor.cpp |
| diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTDescriptor.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTDescriptor.cpp |
| index 8b0ca465a5638a4823d1a3cac6dde44ec75f5f1c..9bb73d669e97c3512fff7570306fa1b7dd2c5368 100644 |
| --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTDescriptor.cpp |
| +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTDescriptor.cpp |
| @@ -7,7 +7,6 @@ |
| #include "bindings/core/v8/ScriptPromise.h" |
| #include "bindings/core/v8/ScriptPromiseResolver.h" |
| #include "core/dom/DOMException.h" |
| -#include "modules/bluetooth/Bluetooth.h" |
| #include "modules/bluetooth/BluetoothError.h" |
| #include "modules/bluetooth/BluetoothRemoteGATTService.h" |
| #include "modules/bluetooth/BluetoothRemoteGATTUtils.h" |
| @@ -74,10 +73,7 @@ ScriptPromise BluetoothRemoteGATTDescriptor::readValue( |
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| ScriptPromise promise = resolver->promise(); |
| getGatt()->AddToActiveAlgorithms(resolver); |
| - |
| - mojom::blink::WebBluetoothService* service = |
| - m_characteristic->m_device->bluetooth()->service(); |
| - service->RemoteDescriptorReadValue( |
| + getService()->RemoteDescriptorReadValue( |
| m_descriptor->instance_id, |
| convertToBaseCallback( |
| WTF::bind(&BluetoothRemoteGATTDescriptor::ReadValueCallback, |
| @@ -86,15 +82,73 @@ ScriptPromise BluetoothRemoteGATTDescriptor::readValue( |
| return promise; |
| } |
| +void BluetoothRemoteGATTDescriptor::WriteValueCallback( |
| + ScriptPromiseResolver* resolver, |
| + const Vector<uint8_t>& value, |
| + mojom::blink::WebBluetoothResult result) { |
| + if (!resolver->getExecutionContext() || |
| + resolver->getExecutionContext()->isContextDestroyed()) |
| + return; |
| + |
| + // If the resolver is not in the set of ActiveAlgorithms then the frame |
| + // disconnected so we reject. |
| + if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { |
| + resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( |
| + BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); |
| + return; |
| + } |
| + |
| + if (result == mojom::blink::WebBluetoothResult::SUCCESS) { |
| + m_value = BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value); |
| + resolver->resolve(); |
| + } else { |
| + resolver->reject(BluetoothError::take(resolver, result)); |
| + } |
| +} |
| + |
| ScriptPromise BluetoothRemoteGATTDescriptor::writeValue( |
| ScriptState* scriptState, |
| const DOMArrayPiece& value) { |
| - // TODO(668838): Implement WebBluetooth descriptor.writeValue() |
| - return ScriptPromise::rejectWithDOMException( |
| - scriptState, |
| - DOMException::create(NotSupportedError, |
| - "descriptor writeValue is not implemented " |
| - "yet. See https://goo.gl/J6ASzs")); |
| + if (!getGatt()->connected()) { |
| + return ScriptPromise::rejectWithDOMException( |
| + scriptState, |
| + BluetoothRemoteGATTUtils::CreateDOMException( |
| + BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); |
| + } |
| + |
| + if (!getGatt()->device()->isValidDescriptor(m_descriptor->instance_id)) { |
| + return ScriptPromise::rejectWithDOMException( |
| + scriptState, |
| + BluetoothRemoteGATTUtils::CreateDOMException( |
| + BluetoothRemoteGATTUtils::ExceptionType::kInvalidDescriptor)); |
| + } |
| + |
| + // Partial implementation of writeValue algorithm: |
| + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-writevalue |
| + |
| + // If bytes is more than 512 bytes long (the maximum length of an attribute |
| + // value, per Long Attribute Values) return a promise rejected with an |
| + // InvalidModificationError and abort. |
| + if (value.byteLength() > 512) { |
| + return ScriptPromise::rejectWithDOMException( |
| + scriptState, DOMException::create(InvalidModificationError, |
| + "Value can't exceed 512 bytes.")); |
| + } |
| + |
| + // Let valueVector be a copy of the bytes held by value. |
| + Vector<uint8_t> valueVector; |
| + valueVector.append(value.bytes(), value.byteLength()); |
|
dcheng
2017/01/31 01:27:01
Is it possible to do this without copying?
dougt
2017/01/31 18:07:16
Two answers:
1) no. But I filed a bug: https://bu
|
| + |
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->promise(); |
| + getGatt()->AddToActiveAlgorithms(resolver); |
| + getService()->RemoteDescriptorWriteValue( |
| + m_descriptor->instance_id, valueVector, |
| + convertToBaseCallback(WTF::bind( |
| + &BluetoothRemoteGATTDescriptor::WriteValueCallback, |
| + wrapPersistent(this), wrapPersistent(resolver), valueVector))); |
| + |
| + return promise; |
| } |
| DEFINE_TRACE(BluetoothRemoteGATTDescriptor) { |