| Index: third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
|
| diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
|
| index 84d915fd495db3acdbbf855b6811c19d87763f45..729c1a6b873ff33a15cac37f1301b6d643adb128 100644
|
| --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
|
| +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
|
| @@ -9,11 +9,10 @@
|
| #include "core/dom/DOMException.h"
|
| #include "core/dom/ExceptionCode.h"
|
| #include "core/inspector/ConsoleMessage.h"
|
| +#include "modules/bluetooth/Bluetooth.h"
|
| #include "modules/bluetooth/BluetoothError.h"
|
| #include "modules/bluetooth/BluetoothRemoteGATTCharacteristic.h"
|
| -#include "modules/bluetooth/BluetoothSupplement.h"
|
| #include "modules/bluetooth/BluetoothUUID.h"
|
| -#include "public/platform/modules/bluetooth/WebBluetooth.h"
|
| #include "wtf/PtrUtil.h"
|
| #include <memory>
|
| #include <utility>
|
| @@ -33,93 +32,69 @@ const char kInvalidService[] =
|
| } // namespace
|
|
|
| BluetoothRemoteGATTService::BluetoothRemoteGATTService(
|
| - std::unique_ptr<WebBluetoothRemoteGATTService> webService,
|
| + const String& serviceInstanceId,
|
| + const String& uuid,
|
| + bool isPrimary,
|
| + const String& deviceInstanceId,
|
| BluetoothDevice* device)
|
| - : m_webService(std::move(webService)), m_device(device) {
|
| - DCHECK(m_webService);
|
| -}
|
| + : m_serviceInstanceId(serviceInstanceId),
|
| + m_uuid(uuid),
|
| + m_isPrimary(isPrimary),
|
| + m_deviceInstanceId(deviceInstanceId),
|
| + m_device(device) {}
|
|
|
| DEFINE_TRACE(BluetoothRemoteGATTService) {
|
| visitor->trace(m_device);
|
| }
|
|
|
| -// Class that allows us to resolve the promise with a single Characteristic or
|
| -// with a vector owning the characteristics.
|
| -class GetCharacteristicsCallback
|
| - : public WebBluetoothGetCharacteristicsCallbacks {
|
| - public:
|
| - GetCharacteristicsCallback(
|
| - BluetoothRemoteGATTService* service,
|
| - mojom::blink::WebBluetoothGATTQueryQuantity quantity,
|
| - ScriptPromiseResolver* resolver)
|
| - : m_service(service), m_quantity(quantity), m_resolver(resolver) {
|
| - // We always check that the device is connected before constructing this
|
| - // object.
|
| - CHECK(m_service->device()->gatt()->connected());
|
| - m_service->device()->gatt()->AddToActiveAlgorithms(m_resolver.get());
|
| +// Callback that allows us to resolve the promise with a single Characteristic
|
| +// or with a vector owning the characteristics.
|
| +void BluetoothRemoteGATTService::GetCharacteristicsCallback(
|
| + const String& serviceInstanceId,
|
| + mojom::blink::WebBluetoothGATTQueryQuantity quantity,
|
| + ScriptPromiseResolver* resolver,
|
| + mojom::blink::WebBluetoothResult result,
|
| + Optional<Vector<mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr>>
|
| + characteristics) {
|
| + 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 (!device()->gatt()->RemoveFromActiveAlgorithms(resolver)) {
|
| + resolver->reject(
|
| + DOMException::create(NetworkError, kGATTServerDisconnected));
|
| + return;
|
| }
|
|
|
| - void onSuccess(const WebVector<WebBluetoothRemoteGATTCharacteristicInit*>&
|
| - webCharacteristics) override {
|
| - if (!m_resolver->getExecutionContext() ||
|
| - m_resolver->getExecutionContext()->isContextDestroyed())
|
| - return;
|
| -
|
| - // If the resolver is not in the set of ActiveAlgorithms then the frame
|
| - // disconnected so we reject.
|
| - if (!m_service->device()->gatt()->RemoveFromActiveAlgorithms(
|
| - m_resolver.get())) {
|
| - m_resolver->reject(
|
| - DOMException::create(NetworkError, kGATTServerDisconnected));
|
| - return;
|
| - }
|
| + if (result == mojom::blink::WebBluetoothResult::SUCCESS) {
|
| + DCHECK(characteristics);
|
|
|
| - if (m_quantity == mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE) {
|
| - DCHECK_EQ(1u, webCharacteristics.size());
|
| - m_resolver->resolve(
|
| - m_service->device()->getOrCreateBluetoothRemoteGATTCharacteristic(
|
| - m_resolver->getExecutionContext(),
|
| - WTF::wrapUnique(webCharacteristics[0]), m_service));
|
| + if (quantity == mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE) {
|
| + DCHECK_EQ(1u, characteristics->size());
|
| + resolver->resolve(device()->getOrCreateBluetoothRemoteGATTCharacteristic(
|
| + resolver->getExecutionContext(),
|
| + characteristics.value()[0]->instance_id, serviceInstanceId,
|
| + characteristics.value()[0]->uuid,
|
| + characteristics.value()[0]->properties, this));
|
| return;
|
| }
|
|
|
| - HeapVector<Member<BluetoothRemoteGATTCharacteristic>> characteristics;
|
| - characteristics.reserveInitialCapacity(webCharacteristics.size());
|
| - for (WebBluetoothRemoteGATTCharacteristicInit* webCharacteristic :
|
| - webCharacteristics) {
|
| - characteristics.append(
|
| - m_service->device()->getOrCreateBluetoothRemoteGATTCharacteristic(
|
| - m_resolver->getExecutionContext(),
|
| - WTF::wrapUnique(webCharacteristic), m_service));
|
| - }
|
| - m_resolver->resolve(characteristics);
|
| - }
|
| -
|
| - void onError(
|
| - int32_t
|
| - error /* Corresponds to WebBluetoothResult in web_bluetooth.mojom */)
|
| - override {
|
| - if (!m_resolver->getExecutionContext() ||
|
| - m_resolver->getExecutionContext()->isContextDestroyed())
|
| - return;
|
| -
|
| - // If the resolver is not in the set of ActiveAlgorithms then the frame
|
| - // disconnected so we reject.
|
| - if (!m_service->device()->gatt()->RemoveFromActiveAlgorithms(
|
| - m_resolver.get())) {
|
| - m_resolver->reject(
|
| - DOMException::create(NetworkError, kGATTServerDisconnected));
|
| - return;
|
| + HeapVector<Member<BluetoothRemoteGATTCharacteristic>> gattCharacteristics;
|
| + gattCharacteristics.reserveInitialCapacity(characteristics->size());
|
| + for (const auto& characteristic : characteristics.value()) {
|
| + gattCharacteristics.append(
|
| + device()->getOrCreateBluetoothRemoteGATTCharacteristic(
|
| + resolver->getExecutionContext(), characteristic->instance_id,
|
| + serviceInstanceId, characteristic->uuid,
|
| + characteristic->properties, this));
|
| }
|
| -
|
| - m_resolver->reject(BluetoothError::take(m_resolver, error));
|
| + resolver->resolve(gattCharacteristics);
|
| + } else {
|
| + resolver->reject(BluetoothError::take(resolver, result));
|
| }
|
| -
|
| - private:
|
| - Persistent<BluetoothRemoteGATTService> m_service;
|
| - mojom::blink::WebBluetoothGATTQueryQuantity m_quantity;
|
| - const Persistent<ScriptPromiseResolver> m_resolver;
|
| -};
|
| +}
|
|
|
| ScriptPromise BluetoothRemoteGATTService::getCharacteristic(
|
| ScriptState* scriptState,
|
| @@ -159,27 +134,34 @@ ScriptPromise BluetoothRemoteGATTService::getCharacteristics(
|
| ScriptPromise BluetoothRemoteGATTService::getCharacteristicsImpl(
|
| ScriptState* scriptState,
|
| mojom::blink::WebBluetoothGATTQueryQuantity quantity,
|
| - String characteristicsUUID) {
|
| + const String& characteristicsUUID) {
|
| + // We always check that the device is connected.
|
| if (!device()->gatt()->connected()) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState,
|
| DOMException::create(NetworkError, kGATTServerNotConnected));
|
| }
|
|
|
| - if (!device()->isValidService(m_webService->serviceInstanceID)) {
|
| + if (!device()->isValidService(m_serviceInstanceId)) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState, DOMException::create(InvalidStateError, kInvalidService));
|
| }
|
|
|
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
|
| ScriptPromise promise = resolver->promise();
|
| -
|
| - WebBluetooth* webbluetooth =
|
| - BluetoothSupplement::fromScriptState(scriptState);
|
| - webbluetooth->getCharacteristics(
|
| - m_webService->serviceInstanceID, static_cast<int32_t>(quantity),
|
| - characteristicsUUID,
|
| - new GetCharacteristicsCallback(this, quantity, resolver));
|
| + device()->gatt()->AddToActiveAlgorithms(resolver);
|
| +
|
| + mojom::blink::WebBluetoothService* service = m_device->bluetooth()->service();
|
| +
|
| + WTF::Optional<String> uuid = WTF::nullopt;
|
| + if (!characteristicsUUID.isEmpty())
|
| + uuid = characteristicsUUID;
|
| + service->RemoteServiceGetCharacteristics(
|
| + m_serviceInstanceId, quantity, uuid,
|
| + convertToBaseCallback(
|
| + WTF::bind(&BluetoothRemoteGATTService::GetCharacteristicsCallback,
|
| + wrapPersistent(this), m_serviceInstanceId, quantity,
|
| + wrapPersistent(resolver))));
|
|
|
| return promise;
|
| }
|
|
|