| Index: third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp
|
| diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp
|
| index 23250910ad7f10a724d3c1e995096e85b6832766..f75d0b1b80e65e69f163549a49cc7be38e66b256 100644
|
| --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp
|
| +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp
|
| @@ -13,11 +13,22 @@
|
| #include "modules/bluetooth/BluetoothCharacteristicProperties.h"
|
| #include "modules/bluetooth/BluetoothError.h"
|
| #include "modules/bluetooth/BluetoothSupplement.h"
|
| -#include "modules/bluetooth/ConvertWebVectorToArrayBuffer.h"
|
| #include "public/platform/modules/bluetooth/WebBluetooth.h"
|
|
|
| namespace blink {
|
|
|
| +namespace {
|
| +
|
| +PassRefPtr<DOMArrayBuffer> ConvertWebVectorToArrayBuffer(
|
| + const WebVector<uint8_t>& webVector)
|
| +{
|
| + static_assert(sizeof(*webVector.data()) == 1, "uint8_t should be a single byte");
|
| + RefPtr<DOMArrayBuffer> domBuffer = DOMArrayBuffer::create(webVector.data(), webVector.size());
|
| + return domBuffer;
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| BluetoothGATTCharacteristic::BluetoothGATTCharacteristic(ExecutionContext* context, PassOwnPtr<WebBluetoothGATTCharacteristicInit> webCharacteristic)
|
| : ActiveDOMObject(context)
|
| , m_webCharacteristic(webCharacteristic)
|
| @@ -39,13 +50,17 @@ BluetoothGATTCharacteristic* BluetoothGATTCharacteristic::take(ScriptPromiseReso
|
| return characteristic;
|
| }
|
|
|
| +void BluetoothGATTCharacteristic::setValue(
|
| + const PassRefPtr<DOMArrayBuffer>& domBuffer)
|
| +{
|
| + m_value = domBuffer;
|
| +}
|
| +
|
| void BluetoothGATTCharacteristic::dispatchCharacteristicValueChanged(
|
| const WebVector<uint8_t>& value)
|
| {
|
| - static_assert(sizeof(*value.data()) == 1, "uint8_t should be a single byte");
|
| -
|
| - m_value = DOMArrayBuffer::create(value.data(), value.size());
|
| -
|
| + RefPtr<DOMArrayBuffer> domBuffer = ConvertWebVectorToArrayBuffer(value);
|
| + this->setValue(domBuffer);
|
| dispatchEvent(Event::create(EventTypeNames::characteristicvaluechanged));
|
| }
|
|
|
| @@ -89,13 +104,41 @@ bool BluetoothGATTCharacteristic::addEventListenerInternal(const AtomicString& e
|
| return EventTarget::addEventListenerInternal(eventType, listener, options);
|
| }
|
|
|
| +class ReadValueCallback : public WebBluetoothReadValueCallbacks {
|
| +public:
|
| + ReadValueCallback(BluetoothGATTCharacteristic* characteristic, ScriptPromiseResolver* resolver) : m_webCharacteristic(characteristic), m_resolver(resolver) {}
|
| +
|
| + void onSuccess(const WebVector<uint8_t>& value) override
|
| + {
|
| + if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped())
|
| + return;
|
| +
|
| + RefPtr<DOMArrayBuffer> domBuffer = ConvertWebVectorToArrayBuffer(value);
|
| + if (m_webCharacteristic) {
|
| + m_webCharacteristic->setValue(domBuffer);
|
| + }
|
| + m_resolver->resolve(domBuffer);
|
| + }
|
| +
|
| + void onError(const WebBluetoothError& e) override
|
| + {
|
| + if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped())
|
| + return;
|
| + m_resolver->reject(BluetoothError::take(m_resolver, e));
|
| + }
|
| +
|
| +private:
|
| + WeakPersistent<BluetoothGATTCharacteristic> m_webCharacteristic;
|
| + Persistent<ScriptPromiseResolver> m_resolver;
|
| +};
|
| +
|
| ScriptPromise BluetoothGATTCharacteristic::readValue(ScriptState* scriptState)
|
| {
|
| WebBluetooth* webbluetooth = BluetoothSupplement::fromScriptState(scriptState);
|
|
|
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
|
| ScriptPromise promise = resolver->promise();
|
| - webbluetooth->readValue(m_webCharacteristic->characteristicInstanceID, new CallbackPromiseAdapter<ConvertWebVectorToArrayBuffer, BluetoothError>(resolver));
|
| + webbluetooth->readValue(m_webCharacteristic->characteristicInstanceID, new ReadValueCallback(this, resolver));
|
|
|
| return promise;
|
| }
|
|
|