OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/renderer/bluetooth/bluetooth_dispatcher.h" | 5 #include "content/renderer/bluetooth/bluetooth_dispatcher.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 ~BluetoothCharacteristicRequest() {} | 63 ~BluetoothCharacteristicRequest() {} |
64 | 64 |
65 blink::WebString service_instance_id; | 65 blink::WebString service_instance_id; |
66 blink::WebString characteristic_uuid; | 66 blink::WebString characteristic_uuid; |
67 scoped_ptr<blink::WebBluetoothGetCharacteristicCallbacks> callbacks; | 67 scoped_ptr<blink::WebBluetoothGetCharacteristicCallbacks> callbacks; |
68 }; | 68 }; |
69 | 69 |
70 // Struct that holds a pending Start/StopNotifications request. | 70 // Struct that holds a pending Start/StopNotifications request. |
71 struct BluetoothNotificationsRequest { | 71 struct BluetoothNotificationsRequest { |
72 BluetoothNotificationsRequest( | 72 BluetoothNotificationsRequest( |
| 73 int frame_routing_id, |
73 const std::string characteristic_instance_id, | 74 const std::string characteristic_instance_id, |
74 blink::WebBluetoothGATTCharacteristic* characteristic, | 75 blink::WebBluetoothGATTCharacteristic* characteristic, |
75 blink::WebBluetoothNotificationsCallbacks* callbacks, | 76 blink::WebBluetoothNotificationsCallbacks* callbacks, |
76 NotificationsRequestType type) | 77 NotificationsRequestType type) |
77 : characteristic_instance_id(characteristic_instance_id), | 78 : frame_routing_id(frame_routing_id), |
| 79 characteristic_instance_id(characteristic_instance_id), |
78 characteristic(characteristic), | 80 characteristic(characteristic), |
79 callbacks(callbacks), | 81 callbacks(callbacks), |
80 type(type) {} | 82 type(type) {} |
81 ~BluetoothNotificationsRequest() {} | 83 ~BluetoothNotificationsRequest() {} |
82 | 84 |
| 85 const int frame_routing_id; |
83 const std::string characteristic_instance_id; | 86 const std::string characteristic_instance_id; |
84 // The characteristic object is owned by the execution context on | 87 // The characteristic object is owned by the execution context on |
85 // the blink side which can destroy the object at any point. Since the | 88 // the blink side which can destroy the object at any point. Since the |
86 // object implements ActiveDOMObject, the object calls Stop when is getting | 89 // object implements ActiveDOMObject, the object calls Stop when is getting |
87 // destroyed, which in turn calls characteristicObjectRemoved. | 90 // destroyed, which in turn calls characteristicObjectRemoved. |
88 // characteristicObjectRemoved will null any pointers to the object | 91 // characteristicObjectRemoved will null any pointers to the object |
89 // and queue a stop notifications request if necessary. | 92 // and queue a stop notifications request if necessary. |
90 blink::WebBluetoothGATTCharacteristic* characteristic; | 93 blink::WebBluetoothGATTCharacteristic* characteristic; |
91 scoped_ptr<blink::WebBluetoothNotificationsCallbacks> callbacks; | 94 scoped_ptr<blink::WebBluetoothNotificationsCallbacks> callbacks; |
92 NotificationsRequestType type; | 95 NotificationsRequestType type; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 for (const WebString& optional_service : options.optionalServices) { | 212 for (const WebString& optional_service : options.optionalServices) { |
210 optional_services.push_back(device::BluetoothUUID(optional_service.utf8())); | 213 optional_services.push_back(device::BluetoothUUID(optional_service.utf8())); |
211 } | 214 } |
212 | 215 |
213 Send(new BluetoothHostMsg_RequestDevice(CurrentWorkerId(), request_id, | 216 Send(new BluetoothHostMsg_RequestDevice(CurrentWorkerId(), request_id, |
214 frame_routing_id, filters, | 217 frame_routing_id, filters, |
215 optional_services)); | 218 optional_services)); |
216 } | 219 } |
217 | 220 |
218 void BluetoothDispatcher::connectGATT( | 221 void BluetoothDispatcher::connectGATT( |
| 222 int frame_routing_id, |
219 const blink::WebString& device_id, | 223 const blink::WebString& device_id, |
220 blink::WebBluetoothConnectGATTCallbacks* callbacks) { | 224 blink::WebBluetoothConnectGATTCallbacks* callbacks) { |
221 int request_id = pending_connect_requests_.Add(callbacks); | 225 int request_id = pending_connect_requests_.Add(callbacks); |
222 Send(new BluetoothHostMsg_ConnectGATT(CurrentWorkerId(), request_id, | 226 Send(new BluetoothHostMsg_ConnectGATT(CurrentWorkerId(), request_id, |
223 device_id.utf8())); | 227 frame_routing_id, device_id.utf8())); |
224 } | 228 } |
225 | 229 |
226 void BluetoothDispatcher::getPrimaryService( | 230 void BluetoothDispatcher::getPrimaryService( |
| 231 int frame_routing_id, |
227 const blink::WebString& device_id, | 232 const blink::WebString& device_id, |
228 const blink::WebString& service_uuid, | 233 const blink::WebString& service_uuid, |
229 blink::WebBluetoothGetPrimaryServiceCallbacks* callbacks) { | 234 blink::WebBluetoothGetPrimaryServiceCallbacks* callbacks) { |
230 int request_id = pending_primary_service_requests_.Add( | 235 int request_id = pending_primary_service_requests_.Add( |
231 new BluetoothPrimaryServiceRequest(device_id, service_uuid, callbacks)); | 236 new BluetoothPrimaryServiceRequest(device_id, service_uuid, callbacks)); |
232 Send(new BluetoothHostMsg_GetPrimaryService( | 237 Send(new BluetoothHostMsg_GetPrimaryService( |
233 CurrentWorkerId(), request_id, device_id.utf8(), service_uuid.utf8())); | 238 CurrentWorkerId(), request_id, frame_routing_id, device_id.utf8(), |
| 239 service_uuid.utf8())); |
234 } | 240 } |
235 | 241 |
236 void BluetoothDispatcher::getCharacteristic( | 242 void BluetoothDispatcher::getCharacteristic( |
| 243 int frame_routing_id, |
237 const blink::WebString& service_instance_id, | 244 const blink::WebString& service_instance_id, |
238 const blink::WebString& characteristic_uuid, | 245 const blink::WebString& characteristic_uuid, |
239 blink::WebBluetoothGetCharacteristicCallbacks* callbacks) { | 246 blink::WebBluetoothGetCharacteristicCallbacks* callbacks) { |
240 int request_id = | 247 int request_id = |
241 pending_characteristic_requests_.Add(new BluetoothCharacteristicRequest( | 248 pending_characteristic_requests_.Add(new BluetoothCharacteristicRequest( |
242 service_instance_id, characteristic_uuid, callbacks)); | 249 service_instance_id, characteristic_uuid, callbacks)); |
243 Send(new BluetoothHostMsg_GetCharacteristic(CurrentWorkerId(), request_id, | 250 Send(new BluetoothHostMsg_GetCharacteristic( |
244 service_instance_id.utf8(), | 251 CurrentWorkerId(), request_id, frame_routing_id, |
245 characteristic_uuid.utf8())); | 252 service_instance_id.utf8(), characteristic_uuid.utf8())); |
246 } | 253 } |
247 | 254 |
248 void BluetoothDispatcher::readValue( | 255 void BluetoothDispatcher::readValue( |
| 256 int frame_routing_id, |
249 const blink::WebString& characteristic_instance_id, | 257 const blink::WebString& characteristic_instance_id, |
250 blink::WebBluetoothReadValueCallbacks* callbacks) { | 258 blink::WebBluetoothReadValueCallbacks* callbacks) { |
251 int request_id = pending_read_value_requests_.Add(callbacks); | 259 int request_id = pending_read_value_requests_.Add(callbacks); |
252 Send(new BluetoothHostMsg_ReadValue(CurrentWorkerId(), request_id, | 260 Send(new BluetoothHostMsg_ReadValue(CurrentWorkerId(), request_id, |
| 261 frame_routing_id, |
253 characteristic_instance_id.utf8())); | 262 characteristic_instance_id.utf8())); |
254 } | 263 } |
255 | 264 |
256 void BluetoothDispatcher::writeValue( | 265 void BluetoothDispatcher::writeValue( |
| 266 int frame_routing_id, |
257 const blink::WebString& characteristic_instance_id, | 267 const blink::WebString& characteristic_instance_id, |
258 const blink::WebVector<uint8_t>& value, | 268 const blink::WebVector<uint8_t>& value, |
259 blink::WebBluetoothWriteValueCallbacks* callbacks) { | 269 blink::WebBluetoothWriteValueCallbacks* callbacks) { |
260 int request_id = pending_write_value_requests_.Add(callbacks); | 270 int request_id = pending_write_value_requests_.Add(callbacks); |
261 | 271 |
262 Send(new BluetoothHostMsg_WriteValue( | 272 Send(new BluetoothHostMsg_WriteValue( |
263 CurrentWorkerId(), request_id, characteristic_instance_id.utf8(), | 273 CurrentWorkerId(), request_id, frame_routing_id, |
| 274 characteristic_instance_id.utf8(), |
264 std::vector<uint8_t>(value.begin(), value.end()))); | 275 std::vector<uint8_t>(value.begin(), value.end()))); |
265 } | 276 } |
266 | 277 |
267 void BluetoothDispatcher::startNotifications( | 278 void BluetoothDispatcher::startNotifications( |
| 279 int frame_routing_id, |
268 const blink::WebString& characteristic_instance_id, | 280 const blink::WebString& characteristic_instance_id, |
269 blink::WebBluetoothGATTCharacteristic* characteristic, | 281 blink::WebBluetoothGATTCharacteristic* characteristic, |
270 blink::WebBluetoothNotificationsCallbacks* callbacks) { | 282 blink::WebBluetoothNotificationsCallbacks* callbacks) { |
271 int request_id = QueueNotificationRequest(characteristic_instance_id.utf8(), | 283 int request_id = QueueNotificationRequest( |
272 characteristic, callbacks, | 284 frame_routing_id, characteristic_instance_id.utf8(), characteristic, |
273 NotificationsRequestType::START); | 285 callbacks, NotificationsRequestType::START); |
274 // The Notification subscription's state can change after a request | 286 // The Notification subscription's state can change after a request |
275 // finishes. To avoid resolving with a soon-to-be-invalid state we queue | 287 // finishes. To avoid resolving with a soon-to-be-invalid state we queue |
276 // requests. | 288 // requests. |
277 if (HasNotificationRequestResponsePending( | 289 if (HasNotificationRequestResponsePending( |
278 characteristic_instance_id.utf8())) { | 290 characteristic_instance_id.utf8())) { |
279 return; | 291 return; |
280 } | 292 } |
281 | 293 |
282 ResolveOrSendStartNotificationRequest(request_id); | 294 ResolveOrSendStartNotificationRequest(request_id); |
283 } | 295 } |
284 | 296 |
285 void BluetoothDispatcher::stopNotifications( | 297 void BluetoothDispatcher::stopNotifications( |
| 298 int frame_routing_id, |
286 const blink::WebString& characteristic_instance_id, | 299 const blink::WebString& characteristic_instance_id, |
287 blink::WebBluetoothGATTCharacteristic* characteristic, | 300 blink::WebBluetoothGATTCharacteristic* characteristic, |
288 blink::WebBluetoothNotificationsCallbacks* callbacks) { | 301 blink::WebBluetoothNotificationsCallbacks* callbacks) { |
289 int request_id = QueueNotificationRequest(characteristic_instance_id.utf8(), | 302 int request_id = QueueNotificationRequest( |
290 characteristic, callbacks, | 303 frame_routing_id, characteristic_instance_id.utf8(), characteristic, |
291 NotificationsRequestType::STOP); | 304 callbacks, NotificationsRequestType::STOP); |
292 if (HasNotificationRequestResponsePending( | 305 if (HasNotificationRequestResponsePending( |
293 characteristic_instance_id.utf8())) { | 306 characteristic_instance_id.utf8())) { |
294 return; | 307 return; |
295 } | 308 } |
296 | 309 |
297 ResolveOrSendStopNotificationsRequest(request_id); | 310 ResolveOrSendStopNotificationsRequest(request_id); |
298 } | 311 } |
299 | 312 |
300 void BluetoothDispatcher::characteristicObjectRemoved( | 313 void BluetoothDispatcher::characteristicObjectRemoved( |
| 314 int frame_routing_id, |
301 const blink::WebString& characteristic_instance_id, | 315 const blink::WebString& characteristic_instance_id, |
302 blink::WebBluetoothGATTCharacteristic* characteristic) { | 316 blink::WebBluetoothGATTCharacteristic* characteristic) { |
303 // We need to remove references to the object from the following: | 317 // We need to remove references to the object from the following: |
304 // 1) The set of active characteristics | 318 // 1) The set of active characteristics |
305 // 2) The queue waiting for a response | 319 // 2) The queue waiting for a response |
306 // 3) The set of active notifications | 320 // 3) The set of active notifications |
307 | 321 |
308 // 1 | 322 // 1 |
309 // TODO(ortuno): We should only unregister a characteristic once | 323 // TODO(ortuno): We should only unregister a characteristic once |
310 // there are no characteristic objects that have listeners attached. | 324 // there are no characteristic objects that have listeners attached. |
311 // https://crbug.com/541388 | 325 // https://crbug.com/541388 |
312 UnregisterCharacteristicObject(characteristic_instance_id); | 326 UnregisterCharacteristicObject(frame_routing_id, characteristic_instance_id); |
313 | 327 |
314 // 2 | 328 // 2 |
315 // If the object is in the queue we null the characteristic. If this is the | 329 // If the object is in the queue we null the characteristic. If this is the |
316 // first object waiting for a response OnStartNotificationsSuccess will make | 330 // first object waiting for a response OnStartNotificationsSuccess will make |
317 // sure not to add the characteristic to the map and it will queue a Stop | 331 // sure not to add the characteristic to the map and it will queue a Stop |
318 // request. Otherwise ResolveOrSendStartNotificationRequest will make sure not | 332 // request. Otherwise ResolveOrSendStartNotificationRequest will make sure not |
319 // to add it to active notification subscriptions. | 333 // to add it to active notification subscriptions. |
320 bool found = false; | 334 bool found = false; |
321 for (IDMap<BluetoothNotificationsRequest, IDMapOwnPointer>::iterator iter( | 335 for (IDMap<BluetoothNotificationsRequest, IDMapOwnPointer>::iterator iter( |
322 &pending_notifications_requests_); | 336 &pending_notifications_requests_); |
(...skipping 26 matching lines...) Expand all Loading... |
349 | 363 |
350 if (!HasActiveNotificationSubscription(characteristic_instance_id.utf8())) { | 364 if (!HasActiveNotificationSubscription(characteristic_instance_id.utf8())) { |
351 return; | 365 return; |
352 } | 366 } |
353 | 367 |
354 // For 2 and 3 calling ResolveOrSendStopNotificationsRequest ensures the | 368 // For 2 and 3 calling ResolveOrSendStopNotificationsRequest ensures the |
355 // notification subscription is released. | 369 // notification subscription is released. |
356 // We pass in the characteristic so that ResolveOrSendStopNotificationsRequest | 370 // We pass in the characteristic so that ResolveOrSendStopNotificationsRequest |
357 // can remove the characteristic from ActiveNotificationSubscriptions. | 371 // can remove the characteristic from ActiveNotificationSubscriptions. |
358 ResolveOrSendStopNotificationsRequest(QueueNotificationRequest( | 372 ResolveOrSendStopNotificationsRequest(QueueNotificationRequest( |
359 characteristic_instance_id.utf8(), characteristic, | 373 frame_routing_id, characteristic_instance_id.utf8(), characteristic, |
360 nullptr /* callbacks */, NotificationsRequestType::STOP)); | 374 nullptr /* callbacks */, NotificationsRequestType::STOP)); |
361 } | 375 } |
362 | 376 |
363 void BluetoothDispatcher::registerCharacteristicObject( | 377 void BluetoothDispatcher::registerCharacteristicObject( |
| 378 int frame_routing_id, |
364 const blink::WebString& characteristic_instance_id, | 379 const blink::WebString& characteristic_instance_id, |
365 blink::WebBluetoothGATTCharacteristic* characteristic) { | 380 blink::WebBluetoothGATTCharacteristic* characteristic) { |
366 // TODO(ortuno): After the Object manager is implemented, there will | 381 // TODO(ortuno): After the Object manager is implemented, there will |
367 // only be one object per characteristic. But for now we remove | 382 // only be one object per characteristic. But for now we remove |
368 // the previous object. | 383 // the previous object. |
369 // https://crbug.com/495270 | 384 // https://crbug.com/495270 |
370 active_characteristics_.erase(characteristic_instance_id.utf8()); | 385 active_characteristics_.erase(characteristic_instance_id.utf8()); |
371 | 386 |
372 active_characteristics_.insert( | 387 active_characteristics_.insert( |
373 std::make_pair(characteristic_instance_id.utf8(), characteristic)); | 388 std::make_pair(characteristic_instance_id.utf8(), characteristic)); |
374 | 389 |
375 Send(new BluetoothHostMsg_RegisterCharacteristic( | 390 Send(new BluetoothHostMsg_RegisterCharacteristic( |
376 CurrentWorkerId(), characteristic_instance_id.utf8())); | 391 CurrentWorkerId(), frame_routing_id, characteristic_instance_id.utf8())); |
377 } | 392 } |
378 | 393 |
379 void BluetoothDispatcher::WillStopCurrentWorkerThread() { | 394 void BluetoothDispatcher::WillStopCurrentWorkerThread() { |
380 delete this; | 395 delete this; |
381 } | 396 } |
382 | 397 |
383 int BluetoothDispatcher::QueueNotificationRequest( | 398 int BluetoothDispatcher::QueueNotificationRequest( |
| 399 int frame_routing_id, |
384 const std::string& characteristic_instance_id, | 400 const std::string& characteristic_instance_id, |
385 blink::WebBluetoothGATTCharacteristic* characteristic, | 401 blink::WebBluetoothGATTCharacteristic* characteristic, |
386 blink::WebBluetoothNotificationsCallbacks* callbacks, | 402 blink::WebBluetoothNotificationsCallbacks* callbacks, |
387 NotificationsRequestType type) { | 403 NotificationsRequestType type) { |
388 int request_id = | 404 int request_id = |
389 pending_notifications_requests_.Add(new BluetoothNotificationsRequest( | 405 pending_notifications_requests_.Add(new BluetoothNotificationsRequest( |
390 characteristic_instance_id, characteristic, callbacks, type)); | 406 frame_routing_id, characteristic_instance_id, characteristic, |
| 407 callbacks, type)); |
391 notification_requests_queues_[characteristic_instance_id].push(request_id); | 408 notification_requests_queues_[characteristic_instance_id].push(request_id); |
392 | 409 |
393 return request_id; | 410 return request_id; |
394 } | 411 } |
395 | 412 |
396 void BluetoothDispatcher::PopNotificationRequestQueueAndProcessNext( | 413 void BluetoothDispatcher::PopNotificationRequestQueueAndProcessNext( |
397 int request_id) { | 414 int request_id) { |
398 BluetoothNotificationsRequest* old_request = | 415 BluetoothNotificationsRequest* old_request = |
399 pending_notifications_requests_.Lookup(request_id); | 416 pending_notifications_requests_.Lookup(request_id); |
400 | 417 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 DCHECK(!HasActiveNotificationSubscription(characteristic_instance_id)); | 483 DCHECK(!HasActiveNotificationSubscription(characteristic_instance_id)); |
467 return true; | 484 return true; |
468 } | 485 } |
469 return false; | 486 return false; |
470 } | 487 } |
471 | 488 |
472 void BluetoothDispatcher::ResolveOrSendStartNotificationRequest( | 489 void BluetoothDispatcher::ResolveOrSendStartNotificationRequest( |
473 int request_id) { | 490 int request_id) { |
474 BluetoothNotificationsRequest* request = | 491 BluetoothNotificationsRequest* request = |
475 pending_notifications_requests_.Lookup(request_id); | 492 pending_notifications_requests_.Lookup(request_id); |
| 493 const int frame_routing_id = request->frame_routing_id; |
476 const std::string& characteristic_instance_id = | 494 const std::string& characteristic_instance_id = |
477 request->characteristic_instance_id; | 495 request->characteristic_instance_id; |
478 blink::WebBluetoothGATTCharacteristic* characteristic = | 496 blink::WebBluetoothGATTCharacteristic* characteristic = |
479 request->characteristic; | 497 request->characteristic; |
480 blink::WebBluetoothNotificationsCallbacks* callbacks = | 498 blink::WebBluetoothNotificationsCallbacks* callbacks = |
481 request->callbacks.get(); | 499 request->callbacks.get(); |
482 | 500 |
483 // If an object is already subscribed to notifications from the characteristic | 501 // If an object is already subscribed to notifications from the characteristic |
484 // no need to send an IPC again. | 502 // no need to send an IPC again. |
485 if (HasActiveNotificationSubscription(characteristic_instance_id)) { | 503 if (HasActiveNotificationSubscription(characteristic_instance_id)) { |
486 // The object could have been destroyed while we waited. | 504 // The object could have been destroyed while we waited. |
487 if (characteristic != nullptr) { | 505 if (characteristic != nullptr) { |
488 AddToActiveNotificationSubscriptions(characteristic_instance_id, | 506 AddToActiveNotificationSubscriptions(characteristic_instance_id, |
489 characteristic); | 507 characteristic); |
490 } | 508 } |
491 callbacks->onSuccess(); | 509 callbacks->onSuccess(); |
492 | 510 |
493 PopNotificationRequestQueueAndProcessNext(request_id); | 511 PopNotificationRequestQueueAndProcessNext(request_id); |
494 return; | 512 return; |
495 } | 513 } |
496 | 514 |
497 Send(new BluetoothHostMsg_StartNotifications(CurrentWorkerId(), request_id, | 515 Send(new BluetoothHostMsg_StartNotifications(CurrentWorkerId(), request_id, |
| 516 frame_routing_id, |
498 characteristic_instance_id)); | 517 characteristic_instance_id)); |
499 } | 518 } |
500 | 519 |
501 void BluetoothDispatcher::ResolveOrSendStopNotificationsRequest( | 520 void BluetoothDispatcher::ResolveOrSendStopNotificationsRequest( |
502 int request_id) { | 521 int request_id) { |
503 // The Notification subscription's state can change after a request | 522 // The Notification subscription's state can change after a request |
504 // finishes. To avoid resolving with a soon-to-be-invalid state we queue | 523 // finishes. To avoid resolving with a soon-to-be-invalid state we queue |
505 // requests. | 524 // requests. |
506 BluetoothNotificationsRequest* request = | 525 BluetoothNotificationsRequest* request = |
507 pending_notifications_requests_.Lookup(request_id); | 526 pending_notifications_requests_.Lookup(request_id); |
| 527 const int frame_routing_id = request->frame_routing_id; |
508 const std::string& characteristic_instance_id = | 528 const std::string& characteristic_instance_id = |
509 request->characteristic_instance_id; | 529 request->characteristic_instance_id; |
510 blink::WebBluetoothGATTCharacteristic* characteristic = | 530 blink::WebBluetoothGATTCharacteristic* characteristic = |
511 request->characteristic; | 531 request->characteristic; |
512 blink::WebBluetoothNotificationsCallbacks* callbacks = | 532 blink::WebBluetoothNotificationsCallbacks* callbacks = |
513 request->callbacks.get(); | 533 request->callbacks.get(); |
514 | 534 |
515 // If removing turns the subscription inactive then stop. | 535 // If removing turns the subscription inactive then stop. |
516 if (RemoveFromActiveNotificationSubscriptions(characteristic_instance_id, | 536 if (RemoveFromActiveNotificationSubscriptions(characteristic_instance_id, |
517 characteristic)) { | 537 characteristic)) { |
518 Send(new BluetoothHostMsg_StopNotifications(CurrentWorkerId(), request_id, | 538 Send(new BluetoothHostMsg_StopNotifications(CurrentWorkerId(), request_id, |
| 539 frame_routing_id, |
519 characteristic_instance_id)); | 540 characteristic_instance_id)); |
520 return; | 541 return; |
521 } | 542 } |
522 | 543 |
523 // We could be processing a request with nullptr callbacks due to: | 544 // We could be processing a request with nullptr callbacks due to: |
524 // 1) OnStartNotificationSuccess queues a Stop request because the object | 545 // 1) OnStartNotificationSuccess queues a Stop request because the object |
525 // got destroyed in characteristicObjectRemoved. | 546 // got destroyed in characteristicObjectRemoved. |
526 // 2) The last characteristic object that held this subscription got | 547 // 2) The last characteristic object that held this subscription got |
527 // destroyed in characteristicObjectRemoved. | 548 // destroyed in characteristicObjectRemoved. |
528 if (callbacks != nullptr) { | 549 if (callbacks != nullptr) { |
529 callbacks->onSuccess(); | 550 callbacks->onSuccess(); |
530 } | 551 } |
531 PopNotificationRequestQueueAndProcessNext(request_id); | 552 PopNotificationRequestQueueAndProcessNext(request_id); |
532 } | 553 } |
533 | 554 |
534 void BluetoothDispatcher::UnregisterCharacteristicObject( | 555 void BluetoothDispatcher::UnregisterCharacteristicObject( |
| 556 int frame_routing_id, |
535 const blink::WebString& characteristic_instance_id) { | 557 const blink::WebString& characteristic_instance_id) { |
536 int removed = | 558 int removed = |
537 active_characteristics_.erase(characteristic_instance_id.utf8()); | 559 active_characteristics_.erase(characteristic_instance_id.utf8()); |
538 if (removed != 0) { | 560 if (removed != 0) { |
539 Send(new BluetoothHostMsg_UnregisterCharacteristic( | 561 Send(new BluetoothHostMsg_UnregisterCharacteristic( |
540 CurrentWorkerId(), characteristic_instance_id.utf8())); | 562 CurrentWorkerId(), frame_routing_id, |
| 563 characteristic_instance_id.utf8())); |
541 } | 564 } |
542 } | 565 } |
543 | 566 |
544 void BluetoothDispatcher::OnRequestDeviceSuccess( | 567 void BluetoothDispatcher::OnRequestDeviceSuccess( |
545 int thread_id, | 568 int thread_id, |
546 int request_id, | 569 int request_id, |
547 const BluetoothDevice& device) { | 570 const BluetoothDevice& device) { |
548 DCHECK(pending_requests_.Lookup(request_id)) << request_id; | 571 DCHECK(pending_requests_.Lookup(request_id)) << request_id; |
549 | 572 |
550 WebVector<WebString> uuids(device.uuids.size()); | 573 WebVector<WebString> uuids(device.uuids.size()); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 | 724 |
702 // The object requesting the notification could have been destroyed | 725 // The object requesting the notification could have been destroyed |
703 // while waiting for the subscription. characteristicRemoved | 726 // while waiting for the subscription. characteristicRemoved |
704 // nulls the characteristic when the corresponding js object gets destroyed. | 727 // nulls the characteristic when the corresponding js object gets destroyed. |
705 // A Stop request must be issued as the subscription is no longer needed. | 728 // A Stop request must be issued as the subscription is no longer needed. |
706 // The Stop requets is added to the end of the queue in case another | 729 // The Stop requets is added to the end of the queue in case another |
707 // Start request exists in the queue from another characteristic object, | 730 // Start request exists in the queue from another characteristic object, |
708 // which would result in the subscription continuing. | 731 // which would result in the subscription continuing. |
709 if (request->characteristic == nullptr) { | 732 if (request->characteristic == nullptr) { |
710 QueueNotificationRequest( | 733 QueueNotificationRequest( |
711 request->characteristic_instance_id, nullptr /* characteristic */, | 734 request->frame_routing_id, request->characteristic_instance_id, |
712 nullptr /* callbacks */, NotificationsRequestType::STOP); | 735 nullptr /* characteristic */, nullptr /* callbacks */, |
| 736 NotificationsRequestType::STOP); |
713 } | 737 } |
714 | 738 |
715 request->callbacks->onSuccess(); | 739 request->callbacks->onSuccess(); |
716 | 740 |
717 PopNotificationRequestQueueAndProcessNext(request_id); | 741 PopNotificationRequestQueueAndProcessNext(request_id); |
718 } | 742 } |
719 | 743 |
720 void BluetoothDispatcher::OnStartNotificationsError(int thread_id, | 744 void BluetoothDispatcher::OnStartNotificationsError(int thread_id, |
721 int request_id, | 745 int request_id, |
722 WebBluetoothError error) { | 746 WebBluetoothError error) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 int thread_id, | 786 int thread_id, |
763 const std::string& characteristic_instance_id, | 787 const std::string& characteristic_instance_id, |
764 const std::vector<uint8_t> new_value) { | 788 const std::vector<uint8_t> new_value) { |
765 auto active_iter = active_characteristics_.find(characteristic_instance_id); | 789 auto active_iter = active_characteristics_.find(characteristic_instance_id); |
766 if (active_iter != active_characteristics_.end()) { | 790 if (active_iter != active_characteristics_.end()) { |
767 active_iter->second->dispatchCharacteristicValueChanged(new_value); | 791 active_iter->second->dispatchCharacteristicValueChanged(new_value); |
768 } | 792 } |
769 } | 793 } |
770 | 794 |
771 } // namespace content | 795 } // namespace content |
OLD | NEW |