| Index: third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
|
| diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
|
| index c92a061a325740853622742149e7dd9f1518653e..634b516a9f26151340e76a6bcffeab4fabe62d5b 100644
|
| --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
|
| +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
|
| @@ -23,6 +23,11 @@ namespace blink {
|
|
|
| namespace {
|
|
|
| +const char kGATTServerDisconnected[] =
|
| + "GATT Server disconnected while performing a GATT operation.";
|
| +const char kGATTServerNotConnected[] =
|
| + "GATT Server is disconnected. Cannot perform GATT operations.";
|
| +
|
| DOMDataView* ConvertWebVectorToDataView(const WebVector<uint8_t>& webVector) {
|
| static_assert(sizeof(*webVector.data()) == 1,
|
| "uint8_t should be a single byte");
|
| @@ -119,16 +124,28 @@ class ReadValueCallback : public WebBluetoothReadValueCallbacks {
|
| public:
|
| ReadValueCallback(BluetoothRemoteGATTCharacteristic* characteristic,
|
| ScriptPromiseResolver* resolver)
|
| - : m_webCharacteristic(characteristic), m_resolver(resolver) {}
|
| + : m_characteristic(characteristic), m_resolver(resolver) {
|
| + // We always check that the device is connected before constructing this
|
| + // object.
|
| + CHECK(m_characteristic->gatt()->connected());
|
| + m_characteristic->gatt()->AddToActiveAlgorithms(m_resolver.get());
|
| + }
|
|
|
| void onSuccess(const WebVector<uint8_t>& value) override {
|
| if (!m_resolver->getExecutionContext() ||
|
| m_resolver->getExecutionContext()->activeDOMObjectsAreStopped())
|
| return;
|
|
|
| + if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms(
|
| + m_resolver.get())) {
|
| + m_resolver->reject(
|
| + DOMException::create(NetworkError, kGATTServerDisconnected));
|
| + return;
|
| + }
|
| +
|
| DOMDataView* domDataView = ConvertWebVectorToDataView(value);
|
| - if (m_webCharacteristic)
|
| - m_webCharacteristic->setValue(domDataView);
|
| + if (m_characteristic)
|
| + m_characteristic->setValue(domDataView);
|
|
|
| m_resolver->resolve(domDataView);
|
| }
|
| @@ -140,16 +157,30 @@ class ReadValueCallback : public WebBluetoothReadValueCallbacks {
|
| if (!m_resolver->getExecutionContext() ||
|
| m_resolver->getExecutionContext()->activeDOMObjectsAreStopped())
|
| return;
|
| +
|
| + if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms(
|
| + m_resolver.get())) {
|
| + m_resolver->reject(
|
| + DOMException::create(NetworkError, kGATTServerDisconnected));
|
| + return;
|
| + }
|
| +
|
| m_resolver->reject(BluetoothError::take(m_resolver, error));
|
| }
|
|
|
| private:
|
| - WeakPersistent<BluetoothRemoteGATTCharacteristic> m_webCharacteristic;
|
| + WeakPersistent<BluetoothRemoteGATTCharacteristic> m_characteristic;
|
| Persistent<ScriptPromiseResolver> m_resolver;
|
| };
|
|
|
| ScriptPromise BluetoothRemoteGATTCharacteristic::readValue(
|
| ScriptState* scriptState) {
|
| + if (!gatt()->connected()) {
|
| + return ScriptPromise::rejectWithDOMException(
|
| + scriptState,
|
| + DOMException::create(NetworkError, kGATTServerNotConnected));
|
| + }
|
| +
|
| WebBluetooth* webbluetooth =
|
| BluetoothSupplement::fromScriptState(scriptState);
|
|
|
|
|