Chromium Code Reviews| 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 d55e5e678faadcf9c756acef6b4d47e1ea467605..92fc2ea76dc94839e37cc498c70f589f9fb63e29 100644 |
| --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp |
| +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp |
| @@ -13,8 +13,10 @@ |
| #include "core/inspector/ConsoleMessage.h" |
| #include "modules/bluetooth/BluetoothCharacteristicProperties.h" |
| #include "modules/bluetooth/BluetoothError.h" |
| +#include "modules/bluetooth/BluetoothRemoteGATTDescriptor.h" |
| #include "modules/bluetooth/BluetoothRemoteGATTService.h" |
| #include "modules/bluetooth/BluetoothSupplement.h" |
| +#include "modules/bluetooth/BluetoothUUID.h" |
| #include "public/platform/modules/bluetooth/WebBluetooth.h" |
| #include <memory> |
| @@ -120,10 +122,160 @@ void BluetoothRemoteGATTCharacteristic::addedEventListener( |
| } |
| } |
| -class ReadValueCallback : public WebBluetoothReadValueCallbacks { |
| +class GetDescriptorsCallback : public WebBluetoothGetDescriptorsCallbacks { |
| public: |
| - ReadValueCallback(BluetoothRemoteGATTCharacteristic* characteristic, |
| - ScriptPromiseResolver* resolver) |
| + GetDescriptorsCallback(BluetoothRemoteGATTCharacteristic* characteristic, |
| + mojom::blink::WebBluetoothGATTQueryQuantity quantity, |
| + ScriptPromiseResolver* resolver) |
| + : m_characteristic(characteristic), |
| + m_quantity(quantity), |
| + 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<WebBluetoothRemoteGATTDescriptorInit*>& |
| + webDescriptors) override { |
| + if (!m_resolver->getExecutionContext() || |
| + m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
| + return; |
| + |
| + // If the resolver is not in the set of ActiveAlgorithms then the frame |
| + // disconnected so we reject. |
| + if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms( |
| + m_resolver.get())) { |
| + m_resolver->reject( |
| + DOMException::create(NetworkError, kGATTServerDisconnected)); |
|
ortuno
2016/12/02 06:14:51
I like that we can test all of the characteristic'
dougt
2016/12/02 18:31:29
If anything, a possible spec bug? I am not really
ortuno
2016/12/07 08:05:12
hmm then we should change the message since this i
ortuno
2016/12/08 05:42:51
As discussed offline, I think it's fine to use the
|
| + return; |
| + } |
| + |
| + if (m_quantity == mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE) { |
| + DCHECK_EQ(1u, webDescriptors.size()); |
| + m_resolver->resolve( |
| + m_characteristic->gatt() |
| + ->device() |
| + ->getOrCreateBluetoothRemoteGATTDescriptor( |
| + wrapUnique(webDescriptors[0]), m_characteristic)); |
| + return; |
| + } |
| + |
| + HeapVector<Member<BluetoothRemoteGATTDescriptor>> descriptors; |
| + descriptors.reserveInitialCapacity(webDescriptors.size()); |
| + for (WebBluetoothRemoteGATTDescriptorInit* webDescriptor : webDescriptors) { |
| + descriptors.append(m_characteristic->gatt() |
| + ->device() |
| + ->getOrCreateBluetoothRemoteGATTDescriptor( |
| + wrapUnique(webDescriptor), m_characteristic)); |
| + } |
| + m_resolver->resolve(descriptors); |
| + } |
| + |
| + void onError( |
| + int32_t |
| + error /* Corresponds to WebBluetoothResult in web_bluetooth.mojom */) |
| + override { |
| + if (!m_resolver->getExecutionContext() || |
| + m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
| + return; |
| + |
| + // If the resolver is not in the set of ActiveAlgorithms then the frame |
| + // disconnected so we reject. |
| + 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: |
| + Persistent<BluetoothRemoteGATTCharacteristic> m_characteristic; |
| + mojom::blink::WebBluetoothGATTQueryQuantity m_quantity; |
| + const Persistent<ScriptPromiseResolver> m_resolver; |
| +}; |
| + |
| +ScriptPromise BluetoothRemoteGATTCharacteristic::getDescriptorsImpl( |
|
ortuno
2016/12/02 06:14:51
nit: Order of declaration should match order of im
dougt
2016/12/02 18:31:29
Done.
|
| + ScriptState* scriptState, |
| + mojom::blink::WebBluetoothGATTQueryQuantity quantity, |
| + const String& descriptor) { |
| +#if OS(MACOSX) |
| + // TODO(ortuno): Remove when getDescriptor[s] is implemented. |
|
ortuno
2016/12/02 06:14:51
nit: TODO(crbug.com/624017): Remove when descripto
dougt
2016/12/02 18:31:29
Done.
|
| + return ScriptPromise::rejectWithDOMException( |
| + scriptState, DOMException::create(NotSupportedError, |
| + "getDescriptor[s] is not implemented " |
| + "yet. See https://goo.gl/J6ASzs")); |
| +#endif // OS(MACOSX) |
| + WebBluetooth* webbluetooth = |
| + BluetoothSupplement::fromScriptState(scriptState); |
| + |
| + if (!gatt()->connected()) { |
| + return ScriptPromise::rejectWithDOMException( |
| + scriptState, |
| + DOMException::create(NetworkError, kGATTServerNotConnected)); |
| + } |
| + |
| + if (!gatt()->device()->isValidCharacteristic( |
| + m_webCharacteristic->characteristicInstanceID)) { |
| + return ScriptPromise::rejectWithDOMException( |
| + scriptState, |
| + DOMException::create(InvalidStateError, kInvalidCharacteristic)); |
| + } |
| + |
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->promise(); |
| + |
| + webbluetooth->getDescriptors( |
| + m_webCharacteristic->characteristicInstanceID, |
| + static_cast<int32_t>(quantity), descriptor, |
| + new GetDescriptorsCallback(this, quantity, resolver)); |
| + |
| + return promise; |
| +} |
| + |
| +ScriptPromise BluetoothRemoteGATTCharacteristic::getDescriptor( |
| + ScriptState* scriptState, |
| + const StringOrUnsignedLong& descriptorUUID, |
| + ExceptionState& exceptionState) { |
| + String descriptor = |
| + BluetoothUUID::getDescriptor(descriptorUUID, exceptionState); |
| + if (exceptionState.hadException()) |
| + return exceptionState.reject(scriptState); |
| + |
| + return getDescriptorsImpl(scriptState, |
| + mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE, |
| + descriptor); |
| +} |
| + |
| +ScriptPromise BluetoothRemoteGATTCharacteristic::getDescriptors( |
| + ScriptState* scriptState, |
| + ExceptionState&) { |
| + return getDescriptorsImpl( |
| + scriptState, mojom::blink::WebBluetoothGATTQueryQuantity::MULTIPLE); |
| +} |
| + |
| +ScriptPromise BluetoothRemoteGATTCharacteristic::getDescriptors( |
| + ScriptState* scriptState, |
| + const StringOrUnsignedLong& descriptorUUID, |
| + ExceptionState& exceptionState) { |
| + String descriptor = |
| + BluetoothUUID::getDescriptor(descriptorUUID, exceptionState); |
| + if (exceptionState.hadException()) |
| + return exceptionState.reject(scriptState); |
| + |
| + return getDescriptorsImpl( |
| + scriptState, mojom::blink::WebBluetoothGATTQueryQuantity::MULTIPLE, |
| + descriptor); |
| +} |
| + |
| +class CharacteristicReadValueCallback : public WebBluetoothReadValueCallbacks { |
| + public: |
| + CharacteristicReadValueCallback( |
| + BluetoothRemoteGATTCharacteristic* characteristic, |
| + ScriptPromiseResolver* resolver) |
| : m_characteristic(characteristic), m_resolver(resolver) { |
| // We always check that the device is connected before constructing this |
| // object. |
| @@ -193,16 +345,19 @@ ScriptPromise BluetoothRemoteGATTCharacteristic::readValue( |
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| ScriptPromise promise = resolver->promise(); |
| - webbluetooth->readValue(m_webCharacteristic->characteristicInstanceID, |
| - new ReadValueCallback(this, resolver)); |
| + webbluetooth->characteristicReadValue( |
| + m_webCharacteristic->characteristicInstanceID, |
| + new CharacteristicReadValueCallback(this, resolver)); |
| return promise; |
| } |
| -class WriteValueCallback : public WebBluetoothWriteValueCallbacks { |
| +class CharacteristicWriteValueCallback |
| + : public WebBluetoothWriteValueCallbacks { |
| public: |
| - WriteValueCallback(BluetoothRemoteGATTCharacteristic* characteristic, |
| - ScriptPromiseResolver* resolver) |
| + CharacteristicWriteValueCallback( |
| + BluetoothRemoteGATTCharacteristic* characteristic, |
| + ScriptPromiseResolver* resolver) |
| : m_characteristic(characteristic), m_resolver(resolver) { |
| // We always check that the device is connected before constructing this |
| // object. |
| @@ -235,7 +390,6 @@ class WriteValueCallback : public WebBluetoothWriteValueCallbacks { |
| if (!m_resolver->getExecutionContext() || |
| m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
| return; |
| - |
| if (!m_characteristic->gatt()->RemoveFromActiveAlgorithms( |
| m_resolver.get())) { |
| m_resolver->reject( |
| @@ -286,8 +440,9 @@ ScriptPromise BluetoothRemoteGATTCharacteristic::writeValue( |
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| ScriptPromise promise = resolver->promise(); |
| - webbluetooth->writeValue(m_webCharacteristic->characteristicInstanceID, |
| - valueVector, new WriteValueCallback(this, resolver)); |
| + webbluetooth->characteristicWriteValue( |
| + m_webCharacteristic->characteristicInstanceID, valueVector, |
| + new CharacteristicWriteValueCallback(this, resolver)); |
| return promise; |
| } |