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