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 0e1f50a187aafb8e1519f77d97d9f17a4d637d88..fa4b8b6581ab760ffa7131cab4118991f958868c 100644 |
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp |
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothGATTCharacteristic.cpp |
@@ -17,17 +17,43 @@ |
namespace blink { |
-BluetoothGATTCharacteristic::BluetoothGATTCharacteristic(PassOwnPtr<WebBluetoothGATTCharacteristicInit> webCharacteristic) |
- : m_webCharacteristic(webCharacteristic) |
+BluetoothGATTCharacteristic::BluetoothGATTCharacteristic(ExecutionContext* context, PassOwnPtr<WebBluetoothGATTCharacteristicInit> webCharacteristic) |
+ : ActiveDOMObject(context) |
+ , m_webCharacteristic(webCharacteristic) |
+ , m_stopped(false) |
{ |
+ // See example in Source/platform/heap/ThreadState.h |
+ ThreadState::current()->registerPreFinalizer(this); |
} |
-BluetoothGATTCharacteristic* BluetoothGATTCharacteristic::take(ScriptPromiseResolver*, PassOwnPtr<WebBluetoothGATTCharacteristicInit> webCharacteristic) |
+BluetoothGATTCharacteristic* BluetoothGATTCharacteristic::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebBluetoothGATTCharacteristicInit> webCharacteristic) |
{ |
if (!webCharacteristic) { |
return nullptr; |
} |
- return new BluetoothGATTCharacteristic(webCharacteristic); |
+ BluetoothGATTCharacteristic* characteristic = new BluetoothGATTCharacteristic(resolver->executionContext(), webCharacteristic); |
+ // See note in ActiveDOMObject about suspendIfNeeded. |
+ characteristic->suspendIfNeeded(); |
+ return characteristic; |
+} |
+ |
+void BluetoothGATTCharacteristic::stop() |
+{ |
+ notifyCharacteristicObjectRemoved(); |
+} |
+ |
+void BluetoothGATTCharacteristic::dispose() |
+{ |
+ notifyCharacteristicObjectRemoved(); |
+} |
+ |
+void BluetoothGATTCharacteristic::notifyCharacteristicObjectRemoved() |
+{ |
+ if (!m_stopped) { |
+ m_stopped = true; |
+ WebBluetooth* webbluetooth = BluetoothSupplement::fromExecutionContext(ActiveDOMObject::executionContext()); |
+ webbluetooth->characteristicObjectRemoved(m_webCharacteristic->characteristicInstanceID, this); |
+ } |
} |
ScriptPromise BluetoothGATTCharacteristic::readValue(ScriptState* scriptState) |
@@ -63,4 +89,27 @@ ScriptPromise BluetoothGATTCharacteristic::writeValue(ScriptState* scriptState, |
return promise; |
} |
+ScriptPromise BluetoothGATTCharacteristic::startNotifications(ScriptState* scriptState) |
+{ |
+ WebBluetooth* webbluetooth = BluetoothSupplement::fromScriptState(scriptState); |
+ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ webbluetooth->startNotifications(m_webCharacteristic->characteristicInstanceID, this, new CallbackPromiseAdapter<void, BluetoothError>(resolver)); |
+ return promise; |
+} |
+ |
+ScriptPromise BluetoothGATTCharacteristic::stopNotifications(ScriptState* scriptState) |
+{ |
+ WebBluetooth* webbluetooth = BluetoothSupplement::fromScriptState(scriptState); |
+ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ webbluetooth->stopNotifications(m_webCharacteristic->characteristicInstanceID, this, new CallbackPromiseAdapter<void, BluetoothError>(resolver)); |
+ return promise; |
+} |
+ |
+DEFINE_TRACE(BluetoothGATTCharacteristic) |
+{ |
+ ActiveDOMObject::trace(visitor); |
+} |
+ |
} // namespace blink |