Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(465)

Unified Diff: third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp

Issue 2565913002: [Onion Soup] Move WebBluetoothImpl from //content/renderer/bluetooth to Blink's bluetooth module (Closed)
Patch Set: renamed BluetoothUUID.typemap to Bluetooth.typemap Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 5f88b9949b95b7403a368ed5924450f0bd2dd289..a1614922a580ceaeb9131f26fa615683cbbd51c5 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
@@ -11,11 +11,11 @@
#include "core/dom/ExceptionCode.h"
#include "core/events/Event.h"
#include "core/inspector/ConsoleMessage.h"
+#include "modules/bluetooth/Bluetooth.h"
#include "modules/bluetooth/BluetoothCharacteristicProperties.h"
+#include "modules/bluetooth/BluetoothDevice.h"
#include "modules/bluetooth/BluetoothError.h"
#include "modules/bluetooth/BluetoothRemoteGATTService.h"
-#include "modules/bluetooth/BluetoothSupplement.h"
-#include "public/platform/modules/bluetooth/WebBluetooth.h"
#include <memory>
namespace blink {
@@ -30,36 +30,47 @@ const char kInvalidCharacteristic[] =
"Characteristic is no longer valid. Remember to retrieve the "
"characteristic again after reconnecting.";
-DOMDataView* ConvertWebVectorToDataView(const WebVector<uint8_t>& webVector) {
- static_assert(sizeof(*webVector.data()) == 1,
+DOMDataView* ConvertWTFVectorToDataView(const Vector<uint8_t>& wtfVector) {
+ static_assert(sizeof(*wtfVector.data()) == 1,
"uint8_t should be a single byte");
DOMArrayBuffer* domBuffer =
- DOMArrayBuffer::create(webVector.data(), webVector.size());
- return DOMDataView::create(domBuffer, 0, webVector.size());
+ DOMArrayBuffer::create(wtfVector.data(), wtfVector.size());
+ return DOMDataView::create(domBuffer, 0, wtfVector.size());
}
} // anonymous namespace
BluetoothRemoteGATTCharacteristic::BluetoothRemoteGATTCharacteristic(
ExecutionContext* context,
- std::unique_ptr<WebBluetoothRemoteGATTCharacteristicInit> webCharacteristic,
- BluetoothRemoteGATTService* service)
+ const String& characteristicInstanceId,
+ const String& serviceInstanceId,
+ const String& uuid,
+ uint32_t characteristicProperties,
+ BluetoothRemoteGATTService* service,
+ BluetoothDevice* device)
: ContextLifecycleObserver(context),
- m_webCharacteristic(std::move(webCharacteristic)),
+ m_characteristicInstanceId(characteristicInstanceId),
+ m_serviceInstanceId(serviceInstanceId),
+ m_uuid(uuid),
+ m_characteristicProperties(characteristicProperties),
m_service(service),
- m_stopped(false) {
- m_properties = BluetoothCharacteristicProperties::create(
- m_webCharacteristic->characteristicProperties);
+ m_stopped(false),
+ m_device(device) {
+ m_properties =
+ BluetoothCharacteristicProperties::create(m_characteristicProperties);
}
BluetoothRemoteGATTCharacteristic* BluetoothRemoteGATTCharacteristic::create(
ExecutionContext* context,
- std::unique_ptr<WebBluetoothRemoteGATTCharacteristicInit> webCharacteristic,
- BluetoothRemoteGATTService* service) {
- DCHECK(webCharacteristic);
-
+ const String& characteristicInstanceId,
+ const String& serviceInstanceId,
+ const String& uuid,
+ uint32_t characteristicProperties,
+ BluetoothRemoteGATTService* service,
+ BluetoothDevice* device) {
return new BluetoothRemoteGATTCharacteristic(
- context, std::move(webCharacteristic), service);
+ context, characteristicInstanceId, serviceInstanceId, uuid,
+ characteristicProperties, service, device);
}
void BluetoothRemoteGATTCharacteristic::setValue(DOMDataView* domDataView) {
@@ -67,8 +78,8 @@ void BluetoothRemoteGATTCharacteristic::setValue(DOMDataView* domDataView) {
}
void BluetoothRemoteGATTCharacteristic::dispatchCharacteristicValueChanged(
- const WebVector<uint8_t>& value) {
- this->setValue(ConvertWebVectorToDataView(value));
+ const Vector<uint8_t>& value) {
+ this->setValue(ConvertWTFVectorToDataView(value));
dispatchEvent(Event::create(EventTypeNames::characteristicvaluechanged));
}
@@ -83,10 +94,8 @@ void BluetoothRemoteGATTCharacteristic::dispose() {
void BluetoothRemoteGATTCharacteristic::notifyCharacteristicObjectRemoved() {
if (!m_stopped) {
m_stopped = true;
- WebBluetooth* webbluetooth = BluetoothSupplement::fromExecutionContext(
- ContextLifecycleObserver::getExecutionContext());
- webbluetooth->characteristicObjectRemoved(
- m_webCharacteristic->characteristicInstanceID, this);
+ m_device->bluetooth()->characteristicObjectRemoved(
+ m_characteristicInstanceId);
}
}
@@ -107,162 +116,106 @@ void BluetoothRemoteGATTCharacteristic::addedEventListener(
// We will also need to unregister a characteristic once all the event
// listeners have been removed. See http://crbug.com/541390
if (eventType == EventTypeNames::characteristicvaluechanged) {
- WebBluetooth* webbluetooth =
- BluetoothSupplement::fromExecutionContext(getExecutionContext());
- webbluetooth->registerCharacteristicObject(
- m_webCharacteristic->characteristicInstanceID, this);
+ m_device->bluetooth()->registerCharacteristicObject(
+ m_characteristicInstanceId, this);
}
}
-class ReadValueCallback : public WebBluetoothReadValueCallbacks {
- public:
- ReadValueCallback(BluetoothRemoteGATTCharacteristic* characteristic,
- ScriptPromiseResolver* 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()->isContextDestroyed())
- return;
-
- if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms(
- m_resolver.get())) {
- m_resolver->reject(
- DOMException::create(NetworkError, kGATTServerDisconnected));
- return;
- }
-
- DOMDataView* domDataView = ConvertWebVectorToDataView(value);
- if (m_characteristic)
- m_characteristic->setValue(domDataView);
-
- m_resolver->resolve(domDataView);
+void BluetoothRemoteGATTCharacteristic::ReadValueCallback(
+ ScriptPromiseResolver* resolver,
+ mojom::blink::WebBluetoothResult result,
+ const Optional<Vector<uint8_t>>& value) {
+ if (!resolver->getExecutionContext() ||
+ resolver->getExecutionContext()->isContextDestroyed())
+ return;
+
+ // If the resolver is not in the set of ActiveAlgorithms then the frame
+ // disconnected so we reject.
+ if (!gatt()->RemoveFromActiveAlgorithms(resolver)) {
+ resolver->reject(
+ DOMException::create(NetworkError, kGATTServerDisconnected));
+ return;
}
- void onError(
- int32_t
- error /* Corresponds to WebBluetoothResult in web_bluetooth.mojom */)
- override {
- if (!m_resolver->getExecutionContext() ||
- m_resolver->getExecutionContext()->isContextDestroyed())
- 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));
+ if (result == mojom::blink::WebBluetoothResult::SUCCESS) {
+ DCHECK(value);
+ DOMDataView* domDataView = ConvertWTFVectorToDataView(value.value());
+ setValue(domDataView);
+ resolver->resolve(domDataView);
+ } else {
+ resolver->reject(BluetoothError::take(resolver, result));
}
-
- private:
- Persistent<BluetoothRemoteGATTCharacteristic> m_characteristic;
- Persistent<ScriptPromiseResolver> m_resolver;
-};
+}
ScriptPromise BluetoothRemoteGATTCharacteristic::readValue(
ScriptState* scriptState) {
+ // We always check that the device is connected.
if (!gatt()->connected()) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(NetworkError, kGATTServerNotConnected));
}
- if (!gatt()->device()->isValidCharacteristic(
- m_webCharacteristic->characteristicInstanceID)) {
+ if (!gatt()->device()->isValidCharacteristic(m_characteristicInstanceId)) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(InvalidStateError, kInvalidCharacteristic));
}
- WebBluetooth* webbluetooth =
- BluetoothSupplement::fromScriptState(scriptState);
-
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
- webbluetooth->readValue(m_webCharacteristic->characteristicInstanceID,
- new ReadValueCallback(this, resolver));
+ gatt()->AddToActiveAlgorithms(resolver);
+
+ mojom::blink::WebBluetoothService* service = m_device->bluetooth()->service();
+ service->RemoteCharacteristicReadValue(
+ m_characteristicInstanceId,
+ convertToBaseCallback(
+ WTF::bind(&BluetoothRemoteGATTCharacteristic::ReadValueCallback,
+ wrapPersistent(this), wrapPersistent(resolver))));
return promise;
}
-class WriteValueCallback : public WebBluetoothWriteValueCallbacks {
- public:
- WriteValueCallback(BluetoothRemoteGATTCharacteristic* characteristic,
- ScriptPromiseResolver* 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()->isContextDestroyed())
- return;
-
- if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms(
- m_resolver.get())) {
- m_resolver->reject(
- DOMException::create(NetworkError, kGATTServerDisconnected));
- return;
- }
-
- if (m_characteristic) {
- m_characteristic->setValue(ConvertWebVectorToDataView(value));
- }
- m_resolver->resolve();
+void BluetoothRemoteGATTCharacteristic::WriteValueCallback(
+ ScriptPromiseResolver* resolver,
+ const Vector<uint8_t>& value,
+ mojom::blink::WebBluetoothResult result) {
+ if (!resolver->getExecutionContext() ||
+ resolver->getExecutionContext()->isContextDestroyed())
+ return;
+
+ // If the resolver is not in the set of ActiveAlgorithms then the frame
+ // disconnected so we reject.
+ if (!gatt()->RemoveFromActiveAlgorithms(resolver)) {
+ resolver->reject(
+ DOMException::create(NetworkError, kGATTServerDisconnected));
+ return;
}
- void onError(
- int32_t
- error /* Corresponds to WebBluetoothResult in web_bluetooth.mojom */)
- override {
- if (!m_resolver->getExecutionContext() ||
- m_resolver->getExecutionContext()->isContextDestroyed())
- 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));
+ if (result == mojom::blink::WebBluetoothResult::SUCCESS) {
+ setValue(ConvertWTFVectorToDataView(value));
+ resolver->resolve();
+ } else {
+ resolver->reject(BluetoothError::take(resolver, result));
}
-
- private:
- Persistent<BluetoothRemoteGATTCharacteristic> m_characteristic;
- Persistent<ScriptPromiseResolver> m_resolver;
-};
+}
ScriptPromise BluetoothRemoteGATTCharacteristic::writeValue(
ScriptState* scriptState,
const DOMArrayPiece& value) {
+ // We always check that the device is connected.
if (!gatt()->connected()) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(NetworkError, kGATTServerNotConnected));
}
- if (!gatt()->device()->isValidCharacteristic(
- m_webCharacteristic->characteristicInstanceID)) {
+ if (!gatt()->device()->isValidCharacteristic(m_characteristicInstanceId)) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(InvalidStateError, kInvalidCharacteristic));
}
- WebBluetooth* webbluetooth =
- BluetoothSupplement::fromScriptState(scriptState);
// Partial implementation of writeValue algorithm:
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-writevalue
@@ -275,112 +228,100 @@ ScriptPromise BluetoothRemoteGATTCharacteristic::writeValue(
"Value can't exceed 512 bytes."));
// Let valueVector be a copy of the bytes held by value.
- WebVector<uint8_t> valueVector(value.bytes(), value.byteLength());
+ Vector<uint8_t> valueVector;
+ valueVector.append(value.bytes(), value.byteLength());
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
-
ScriptPromise promise = resolver->promise();
- webbluetooth->writeValue(m_webCharacteristic->characteristicInstanceID,
- valueVector, new WriteValueCallback(this, resolver));
+ gatt()->AddToActiveAlgorithms(resolver);
+
+ mojom::blink::WebBluetoothService* service = m_device->bluetooth()->service();
+ service->RemoteCharacteristicWriteValue(
+ m_characteristicInstanceId, valueVector,
+ convertToBaseCallback(WTF::bind(
+ &BluetoothRemoteGATTCharacteristic::WriteValueCallback,
+ wrapPersistent(this), wrapPersistent(resolver), valueVector)));
return promise;
}
-class NotificationsCallback : public WebBluetoothNotificationsCallbacks {
- public:
- NotificationsCallback(BluetoothRemoteGATTCharacteristic* characteristic,
- ScriptPromiseResolver* 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() override {
- if (!m_resolver->getExecutionContext() ||
- m_resolver->getExecutionContext()->isContextDestroyed())
- return;
-
- if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms(
- m_resolver.get())) {
- m_resolver->reject(
- DOMException::create(NetworkError, kGATTServerDisconnected));
- return;
- }
-
- m_resolver->resolve(m_characteristic);
+void BluetoothRemoteGATTCharacteristic::NotificationsCallback(
+ ScriptPromiseResolver* resolver,
+ mojom::blink::WebBluetoothResult result) {
+ if (!resolver->getExecutionContext() ||
+ resolver->getExecutionContext()->isContextDestroyed())
+ return;
+
+ // If the resolver is not in the set of ActiveAlgorithms then the frame
+ // disconnected so we reject.
+ if (!gatt()->RemoveFromActiveAlgorithms(resolver)) {
+ resolver->reject(
+ DOMException::create(NetworkError, kGATTServerDisconnected));
+ return;
}
- void onError(
- int32_t
- error /* Corresponds to WebBluetoothResult in web_bluetooth.mojom */)
- override {
- if (!m_resolver->getExecutionContext() ||
- m_resolver->getExecutionContext()->isContextDestroyed())
- 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));
+ if (result == mojom::blink::WebBluetoothResult::SUCCESS) {
+ resolver->resolve(this);
+ } else {
+ resolver->reject(BluetoothError::take(resolver, result));
}
-
- private:
- Persistent<BluetoothRemoteGATTCharacteristic> m_characteristic;
- Persistent<ScriptPromiseResolver> m_resolver;
-};
+}
ScriptPromise BluetoothRemoteGATTCharacteristic::startNotifications(
ScriptState* scriptState) {
+ // We always check that the device is connected.
if (!gatt()->connected()) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(NetworkError, kGATTServerNotConnected));
}
- if (!gatt()->device()->isValidCharacteristic(
- m_webCharacteristic->characteristicInstanceID)) {
+ if (!gatt()->device()->isValidCharacteristic(m_characteristicInstanceId)) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(InvalidStateError, kInvalidCharacteristic));
}
- WebBluetooth* webbluetooth =
- BluetoothSupplement::fromScriptState(scriptState);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
- webbluetooth->startNotifications(
- m_webCharacteristic->characteristicInstanceID,
- new NotificationsCallback(this, resolver));
+ gatt()->AddToActiveAlgorithms(resolver);
+
+ mojom::blink::WebBluetoothService* service = m_device->bluetooth()->service();
+ service->RemoteCharacteristicStartNotifications(
+ m_characteristicInstanceId,
+ convertToBaseCallback(
+ WTF::bind(&BluetoothRemoteGATTCharacteristic::NotificationsCallback,
+ wrapPersistent(this), wrapPersistent(resolver))));
+
return promise;
}
ScriptPromise BluetoothRemoteGATTCharacteristic::stopNotifications(
ScriptState* scriptState) {
+ // We always check that the device is connected.
if (!gatt()->connected()) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(NetworkError, kGATTServerNotConnected));
}
- if (!gatt()->device()->isValidCharacteristic(
- m_webCharacteristic->characteristicInstanceID)) {
+ if (!gatt()->device()->isValidCharacteristic(m_characteristicInstanceId)) {
return ScriptPromise::rejectWithDOMException(
scriptState,
DOMException::create(InvalidStateError, kInvalidCharacteristic));
}
- WebBluetooth* webbluetooth =
- BluetoothSupplement::fromScriptState(scriptState);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
- webbluetooth->stopNotifications(m_webCharacteristic->characteristicInstanceID,
- new NotificationsCallback(this, resolver));
+ gatt()->AddToActiveAlgorithms(resolver);
+
+ mojom::blink::WebBluetoothService* service = m_device->bluetooth()->service();
+ service->RemoteCharacteristicStopNotifications(
+ m_characteristicInstanceId,
+ convertToBaseCallback(
+ WTF::bind(&BluetoothRemoteGATTCharacteristic::NotificationsCallback,
+ wrapPersistent(this), wrapPersistent(resolver),
+ mojom::blink::WebBluetoothResult::SUCCESS)));
return promise;
}
@@ -388,6 +329,7 @@ DEFINE_TRACE(BluetoothRemoteGATTCharacteristic) {
visitor->trace(m_service);
visitor->trace(m_properties);
visitor->trace(m_value);
+ visitor->trace(m_device);
EventTargetWithInlineData::trace(visitor);
ContextLifecycleObserver::trace(visitor);
}

Powered by Google App Engine
This is Rietveld 408576698