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; |
} |