| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/bluetooth/BluetoothRemoteGATTCharacteristic.h" | 5 #include "modules/bluetooth/BluetoothRemoteGATTCharacteristic.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ScriptPromise.h" | 7 #include "bindings/core/v8/ScriptPromise.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "core/events/Event.h" | 9 #include "core/events/Event.h" |
| 10 #include "core/inspector/ConsoleMessage.h" | 10 #include "core/inspector/ConsoleMessage.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 } | 94 } |
| 95 | 95 |
| 96 void BluetoothRemoteGATTCharacteristic::ReadValueCallback( | 96 void BluetoothRemoteGATTCharacteristic::ReadValueCallback( |
| 97 ScriptPromiseResolver* resolver, | 97 ScriptPromiseResolver* resolver, |
| 98 mojom::blink::WebBluetoothResult result, | 98 mojom::blink::WebBluetoothResult result, |
| 99 const Optional<Vector<uint8_t>>& value) { | 99 const Optional<Vector<uint8_t>>& value) { |
| 100 if (!resolver->getExecutionContext() || | 100 if (!resolver->getExecutionContext() || |
| 101 resolver->getExecutionContext()->isContextDestroyed()) | 101 resolver->getExecutionContext()->isContextDestroyed()) |
| 102 return; | 102 return; |
| 103 | 103 |
| 104 // If the resolver is not in the set of ActiveAlgorithms then the frame | 104 // If the device is disconnected, reject. |
| 105 // disconnected so we reject. | |
| 106 if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { | 105 if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { |
| 107 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( | 106 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( |
| 108 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); | 107 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); |
| 109 return; | 108 return; |
| 110 } | 109 } |
| 111 | 110 |
| 112 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { | 111 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { |
| 113 DCHECK(value); | 112 DCHECK(value); |
| 114 DOMDataView* domDataView = | 113 DOMDataView* domDataView = |
| 115 BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value.value()); | 114 BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value.value()); |
| 116 setValue(domDataView); | 115 setValue(domDataView); |
| 117 resolver->resolve(domDataView); | 116 resolver->resolve(domDataView); |
| 118 } else { | 117 } else { |
| 119 resolver->reject(BluetoothError::take(resolver, result)); | 118 resolver->reject(BluetoothError::take(resolver, result)); |
| 120 } | 119 } |
| 121 } | 120 } |
| 122 | 121 |
| 123 ScriptPromise BluetoothRemoteGATTCharacteristic::readValue( | 122 ScriptPromise BluetoothRemoteGATTCharacteristic::readValue( |
| 124 ScriptState* scriptState) { | 123 ScriptState* scriptState) { |
| 125 // We always check that the device is connected. | |
| 126 if (!getGatt()->connected()) { | 124 if (!getGatt()->connected()) { |
| 127 return ScriptPromise::rejectWithDOMException( | 125 return ScriptPromise::rejectWithDOMException( |
| 128 scriptState, | 126 scriptState, |
| 129 BluetoothRemoteGATTUtils::CreateDOMException( | 127 BluetoothRemoteGATTUtils::CreateDOMException( |
| 130 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); | 128 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); |
| 131 } | 129 } |
| 132 | 130 |
| 133 if (!getGatt()->device()->isValidCharacteristic( | 131 if (!getGatt()->device()->isValidCharacteristic( |
| 134 m_characteristic->instance_id)) { | 132 m_characteristic->instance_id)) { |
| 135 return ScriptPromise::rejectWithDOMException( | 133 return ScriptPromise::rejectWithDOMException( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 153 } | 151 } |
| 154 | 152 |
| 155 void BluetoothRemoteGATTCharacteristic::WriteValueCallback( | 153 void BluetoothRemoteGATTCharacteristic::WriteValueCallback( |
| 156 ScriptPromiseResolver* resolver, | 154 ScriptPromiseResolver* resolver, |
| 157 const Vector<uint8_t>& value, | 155 const Vector<uint8_t>& value, |
| 158 mojom::blink::WebBluetoothResult result) { | 156 mojom::blink::WebBluetoothResult result) { |
| 159 if (!resolver->getExecutionContext() || | 157 if (!resolver->getExecutionContext() || |
| 160 resolver->getExecutionContext()->isContextDestroyed()) | 158 resolver->getExecutionContext()->isContextDestroyed()) |
| 161 return; | 159 return; |
| 162 | 160 |
| 163 // If the resolver is not in the set of ActiveAlgorithms then the frame | 161 // If the device is disconnected, reject. |
| 164 // disconnected so we reject. | |
| 165 if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { | 162 if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { |
| 166 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( | 163 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( |
| 167 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); | 164 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); |
| 168 return; | 165 return; |
| 169 } | 166 } |
| 170 | 167 |
| 171 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { | 168 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { |
| 172 setValue(BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value)); | 169 setValue(BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value)); |
| 173 resolver->resolve(); | 170 resolver->resolve(); |
| 174 } else { | 171 } else { |
| 175 resolver->reject(BluetoothError::take(resolver, result)); | 172 resolver->reject(BluetoothError::take(resolver, result)); |
| 176 } | 173 } |
| 177 } | 174 } |
| 178 | 175 |
| 179 ScriptPromise BluetoothRemoteGATTCharacteristic::writeValue( | 176 ScriptPromise BluetoothRemoteGATTCharacteristic::writeValue( |
| 180 ScriptState* scriptState, | 177 ScriptState* scriptState, |
| 181 const DOMArrayPiece& value) { | 178 const DOMArrayPiece& value) { |
| 182 // We always check that the device is connected. | |
| 183 if (!getGatt()->connected()) { | 179 if (!getGatt()->connected()) { |
| 184 return ScriptPromise::rejectWithDOMException( | 180 return ScriptPromise::rejectWithDOMException( |
| 185 scriptState, | 181 scriptState, |
| 186 BluetoothRemoteGATTUtils::CreateDOMException( | 182 BluetoothRemoteGATTUtils::CreateDOMException( |
| 187 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); | 183 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); |
| 188 } | 184 } |
| 189 | 185 |
| 190 if (!getGatt()->device()->isValidCharacteristic( | 186 if (!getGatt()->device()->isValidCharacteristic( |
| 191 m_characteristic->instance_id)) { | 187 m_characteristic->instance_id)) { |
| 192 return ScriptPromise::rejectWithDOMException( | 188 return ScriptPromise::rejectWithDOMException( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 return promise; | 220 return promise; |
| 225 } | 221 } |
| 226 | 222 |
| 227 void BluetoothRemoteGATTCharacteristic::NotificationsCallback( | 223 void BluetoothRemoteGATTCharacteristic::NotificationsCallback( |
| 228 ScriptPromiseResolver* resolver, | 224 ScriptPromiseResolver* resolver, |
| 229 mojom::blink::WebBluetoothResult result) { | 225 mojom::blink::WebBluetoothResult result) { |
| 230 if (!resolver->getExecutionContext() || | 226 if (!resolver->getExecutionContext() || |
| 231 resolver->getExecutionContext()->isContextDestroyed()) | 227 resolver->getExecutionContext()->isContextDestroyed()) |
| 232 return; | 228 return; |
| 233 | 229 |
| 234 // If the resolver is not in the set of ActiveAlgorithms then the frame | 230 // If the device is disconnected, reject. |
| 235 // disconnected so we reject. | |
| 236 if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { | 231 if (!getGatt()->RemoveFromActiveAlgorithms(resolver)) { |
| 237 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( | 232 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( |
| 238 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); | 233 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); |
| 239 return; | 234 return; |
| 240 } | 235 } |
| 241 | 236 |
| 242 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { | 237 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { |
| 243 resolver->resolve(this); | 238 resolver->resolve(this); |
| 244 } else { | 239 } else { |
| 245 resolver->reject(BluetoothError::take(resolver, result)); | 240 resolver->reject(BluetoothError::take(resolver, result)); |
| 246 } | 241 } |
| 247 } | 242 } |
| 248 | 243 |
| 249 ScriptPromise BluetoothRemoteGATTCharacteristic::startNotifications( | 244 ScriptPromise BluetoothRemoteGATTCharacteristic::startNotifications( |
| 250 ScriptState* scriptState) { | 245 ScriptState* scriptState) { |
| 251 // We always check that the device is connected. | |
| 252 if (!getGatt()->connected()) { | 246 if (!getGatt()->connected()) { |
| 253 return ScriptPromise::rejectWithDOMException( | 247 return ScriptPromise::rejectWithDOMException( |
| 254 scriptState, | 248 scriptState, |
| 255 BluetoothRemoteGATTUtils::CreateDOMException( | 249 BluetoothRemoteGATTUtils::CreateDOMException( |
| 256 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); | 250 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); |
| 257 } | 251 } |
| 258 | 252 |
| 259 if (!getGatt()->device()->isValidCharacteristic( | 253 if (!getGatt()->device()->isValidCharacteristic( |
| 260 m_characteristic->instance_id)) { | 254 m_characteristic->instance_id)) { |
| 261 return ScriptPromise::rejectWithDOMException( | 255 return ScriptPromise::rejectWithDOMException( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 273 m_characteristic->instance_id, | 267 m_characteristic->instance_id, |
| 274 convertToBaseCallback( | 268 convertToBaseCallback( |
| 275 WTF::bind(&BluetoothRemoteGATTCharacteristic::NotificationsCallback, | 269 WTF::bind(&BluetoothRemoteGATTCharacteristic::NotificationsCallback, |
| 276 wrapPersistent(this), wrapPersistent(resolver)))); | 270 wrapPersistent(this), wrapPersistent(resolver)))); |
| 277 | 271 |
| 278 return promise; | 272 return promise; |
| 279 } | 273 } |
| 280 | 274 |
| 281 ScriptPromise BluetoothRemoteGATTCharacteristic::stopNotifications( | 275 ScriptPromise BluetoothRemoteGATTCharacteristic::stopNotifications( |
| 282 ScriptState* scriptState) { | 276 ScriptState* scriptState) { |
| 283 // We always check that the device is connected. | |
| 284 if (!getGatt()->connected()) { | 277 if (!getGatt()->connected()) { |
| 285 return ScriptPromise::rejectWithDOMException( | 278 return ScriptPromise::rejectWithDOMException( |
| 286 scriptState, | 279 scriptState, |
| 287 BluetoothRemoteGATTUtils::CreateDOMException( | 280 BluetoothRemoteGATTUtils::CreateDOMException( |
| 288 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); | 281 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerNotConnected)); |
| 289 } | 282 } |
| 290 | 283 |
| 291 if (!getGatt()->device()->isValidCharacteristic( | 284 if (!getGatt()->device()->isValidCharacteristic( |
| 292 m_characteristic->instance_id)) { | 285 m_characteristic->instance_id)) { |
| 293 return ScriptPromise::rejectWithDOMException( | 286 return ScriptPromise::rejectWithDOMException( |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 const String& characteristicInstanceId, | 381 const String& characteristicInstanceId, |
| 389 mojom::blink::WebBluetoothGATTQueryQuantity quantity, | 382 mojom::blink::WebBluetoothGATTQueryQuantity quantity, |
| 390 ScriptPromiseResolver* resolver, | 383 ScriptPromiseResolver* resolver, |
| 391 mojom::blink::WebBluetoothResult result, | 384 mojom::blink::WebBluetoothResult result, |
| 392 Optional<Vector<mojom::blink::WebBluetoothRemoteGATTDescriptorPtr>> | 385 Optional<Vector<mojom::blink::WebBluetoothRemoteGATTDescriptorPtr>> |
| 393 descriptors) { | 386 descriptors) { |
| 394 if (!resolver->getExecutionContext() || | 387 if (!resolver->getExecutionContext() || |
| 395 resolver->getExecutionContext()->isContextDestroyed()) | 388 resolver->getExecutionContext()->isContextDestroyed()) |
| 396 return; | 389 return; |
| 397 | 390 |
| 398 // If the resolver is not in the set of ActiveAlgorithms then the frame | 391 // If the device is disconnected, reject. |
| 399 // disconnected so we reject. | |
| 400 if (!service()->device()->gatt()->RemoveFromActiveAlgorithms(resolver)) { | 392 if (!service()->device()->gatt()->RemoveFromActiveAlgorithms(resolver)) { |
| 401 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( | 393 resolver->reject(BluetoothRemoteGATTUtils::CreateDOMException( |
| 402 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); | 394 BluetoothRemoteGATTUtils::ExceptionType::kGATTServerDisconnected)); |
| 403 return; | 395 return; |
| 404 } | 396 } |
| 405 | 397 |
| 406 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { | 398 if (result == mojom::blink::WebBluetoothResult::SUCCESS) { |
| 407 DCHECK(descriptors); | 399 DCHECK(descriptors); |
| 408 | 400 |
| 409 if (quantity == mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE) { | 401 if (quantity == mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 430 DEFINE_TRACE(BluetoothRemoteGATTCharacteristic) { | 422 DEFINE_TRACE(BluetoothRemoteGATTCharacteristic) { |
| 431 visitor->trace(m_service); | 423 visitor->trace(m_service); |
| 432 visitor->trace(m_properties); | 424 visitor->trace(m_properties); |
| 433 visitor->trace(m_value); | 425 visitor->trace(m_value); |
| 434 visitor->trace(m_device); | 426 visitor->trace(m_device); |
| 435 EventTargetWithInlineData::trace(visitor); | 427 EventTargetWithInlineData::trace(visitor); |
| 436 ContextLifecycleObserver::trace(visitor); | 428 ContextLifecycleObserver::trace(visitor); |
| 437 } | 429 } |
| 438 | 430 |
| 439 } // namespace blink | 431 } // namespace blink |
| OLD | NEW |