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 // ID Not In Map Note: | 5 // ID Not In Map Note: |
6 // A service, characteristic, or descriptor ID not in the corresponding | 6 // A service, characteristic, or descriptor ID not in the corresponding |
7 // BluetoothDispatcherHost map [service_to_device_, characteristic_to_service_, | 7 // BluetoothDispatcherHost map [service_to_device_, characteristic_to_service_, |
8 // descriptor_to_characteristic_] implies a hostile renderer because a renderer | 8 // descriptor_to_characteristic_] implies a hostile renderer because a renderer |
9 // obtains the corresponding ID from this class and it will be added to the map | 9 // obtains the corresponding ID from this class and it will be added to the map |
10 // at that time. | 10 // at that time. |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 // See class comment: UI Thread Note. | 272 // See class comment: UI Thread Note. |
273 *thread = BrowserThread::UI; | 273 *thread = BrowserThread::UI; |
274 } | 274 } |
275 | 275 |
276 bool BluetoothDispatcherHost::OnMessageReceived(const IPC::Message& message) { | 276 bool BluetoothDispatcherHost::OnMessageReceived(const IPC::Message& message) { |
277 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 277 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
278 bool handled = true; | 278 bool handled = true; |
279 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) | 279 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) |
280 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) | 280 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) |
281 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ConnectGATT, OnConnectGATT) | 281 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ConnectGATT, OnConnectGATT) |
| 282 IPC_MESSAGE_HANDLER(BluetoothHostMsg_Disconnect, OnDisconnect) |
282 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) | 283 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) |
283 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) | 284 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) |
284 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ReadValue, OnReadValue) | 285 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ReadValue, OnReadValue) |
285 IPC_MESSAGE_HANDLER(BluetoothHostMsg_WriteValue, OnWriteValue) | 286 IPC_MESSAGE_HANDLER(BluetoothHostMsg_WriteValue, OnWriteValue) |
286 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StartNotifications, OnStartNotifications) | 287 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StartNotifications, OnStartNotifications) |
287 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StopNotifications, OnStopNotifications) | 288 IPC_MESSAGE_HANDLER(BluetoothHostMsg_StopNotifications, OnStopNotifications) |
288 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RegisterCharacteristic, | 289 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RegisterCharacteristic, |
289 OnRegisterCharacteristicObject); | 290 OnRegisterCharacteristicObject); |
290 IPC_MESSAGE_HANDLER(BluetoothHostMsg_UnregisterCharacteristic, | 291 IPC_MESSAGE_HANDLER(BluetoothHostMsg_UnregisterCharacteristic, |
291 OnUnregisterCharacteristicObject); | 292 OnUnregisterCharacteristicObject); |
(...skipping 22 matching lines...) Expand all Loading... |
314 DCHECK(pending_primary_services_requests_.empty()); | 315 DCHECK(pending_primary_services_requests_.empty()); |
315 | 316 |
316 // The following data structures are cleaned up when a | 317 // The following data structures are cleaned up when a |
317 // device/service/characteristic is removed. | 318 // device/service/characteristic is removed. |
318 // Since this can happen after the test is done and the cleanup function is | 319 // Since this can happen after the test is done and the cleanup function is |
319 // called, we clean them here. | 320 // called, we clean them here. |
320 service_to_device_.clear(); | 321 service_to_device_.clear(); |
321 characteristic_to_service_.clear(); | 322 characteristic_to_service_.clear(); |
322 characteristic_id_to_notify_session_.clear(); | 323 characteristic_id_to_notify_session_.clear(); |
323 active_characteristic_threads_.clear(); | 324 active_characteristic_threads_.clear(); |
324 connections_.clear(); | 325 device_id_to_connection_map_.clear(); |
325 } | 326 } |
326 | 327 |
327 set_adapter(std::move(mock_adapter)); | 328 set_adapter(std::move(mock_adapter)); |
328 } | 329 } |
329 | 330 |
330 BluetoothDispatcherHost::~BluetoothDispatcherHost() { | 331 BluetoothDispatcherHost::~BluetoothDispatcherHost() { |
331 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 332 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
332 // Clear adapter, releasing observer references. | 333 // Clear adapter, releasing observer references. |
333 set_adapter(scoped_refptr<device::BluetoothAdapter>()); | 334 set_adapter(scoped_refptr<device::BluetoothAdapter>()); |
334 } | 335 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 | 428 |
428 int thread_id; | 429 int thread_id; |
429 int request_id; | 430 int request_id; |
430 std::string service_uuid; | 431 std::string service_uuid; |
431 CallingFunction func; | 432 CallingFunction func; |
432 }; | 433 }; |
433 | 434 |
434 void BluetoothDispatcherHost::set_adapter( | 435 void BluetoothDispatcherHost::set_adapter( |
435 scoped_refptr<device::BluetoothAdapter> adapter) { | 436 scoped_refptr<device::BluetoothAdapter> adapter) { |
436 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 437 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
437 connections_.clear(); | |
438 if (adapter_.get()) | 438 if (adapter_.get()) |
439 adapter_->RemoveObserver(this); | 439 adapter_->RemoveObserver(this); |
440 adapter_ = adapter; | 440 adapter_ = adapter; |
441 if (adapter_.get()) | 441 if (adapter_.get()) |
442 adapter_->AddObserver(this); | 442 adapter_->AddObserver(this); |
443 } | 443 } |
444 | 444 |
445 void BluetoothDispatcherHost::StartDeviceDiscovery( | 445 void BluetoothDispatcherHost::StartDeviceDiscovery( |
446 RequestDeviceSession* session, | 446 RequestDeviceSession* session, |
447 int chooser_id) { | 447 int chooser_id) { |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 const CacheQueryResult query_result = | 725 const CacheQueryResult query_result = |
726 QueryCacheForDevice(GetOrigin(frame_routing_id), device_id); | 726 QueryCacheForDevice(GetOrigin(frame_routing_id), device_id); |
727 | 727 |
728 if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 728 if (query_result.outcome != CacheQueryOutcome::SUCCESS) { |
729 RecordConnectGATTOutcome(query_result.outcome); | 729 RecordConnectGATTOutcome(query_result.outcome); |
730 Send(new BluetoothMsg_ConnectGATTError(thread_id, request_id, | 730 Send(new BluetoothMsg_ConnectGATTError(thread_id, request_id, |
731 query_result.GetWebError())); | 731 query_result.GetWebError())); |
732 return; | 732 return; |
733 } | 733 } |
734 | 734 |
| 735 // If we are already connected no need to connect again. |
| 736 auto connection_iter = device_id_to_connection_map_.find(device_id); |
| 737 if (connection_iter != device_id_to_connection_map_.end()) { |
| 738 if (connection_iter->second->IsConnected()) { |
| 739 VLOG(1) << "Already connected."; |
| 740 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, |
| 741 device_id)); |
| 742 return; |
| 743 } |
| 744 } |
| 745 |
735 query_result.device->CreateGattConnection( | 746 query_result.device->CreateGattConnection( |
736 base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated, | 747 base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated, |
737 weak_ptr_on_ui_thread_, thread_id, request_id, device_id, | 748 weak_ptr_on_ui_thread_, thread_id, request_id, device_id, |
738 start_time), | 749 start_time), |
739 base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError, | 750 base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError, |
740 weak_ptr_on_ui_thread_, thread_id, request_id, device_id, | 751 weak_ptr_on_ui_thread_, thread_id, request_id, device_id, |
741 start_time)); | 752 start_time)); |
742 } | 753 } |
743 | 754 |
| 755 void BluetoothDispatcherHost::OnDisconnect(int thread_id, |
| 756 int frame_routing_id, |
| 757 const std::string& device_id) { |
| 758 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 759 RecordWebBluetoothFunctionCall( |
| 760 UMAWebBluetoothFunction::REMOTE_GATT_SERVER_DISCONNECT); |
| 761 |
| 762 // Make sure the origin is allowed to access the device. We perform this check |
| 763 // in case a hostile renderer is trying to disconnect a device that the |
| 764 // renderer is not allowed to access. |
| 765 if (allowed_devices_map_.GetDeviceAddress(GetOrigin(frame_routing_id), |
| 766 device_id) |
| 767 .empty()) { |
| 768 bad_message::ReceivedBadMessage( |
| 769 this, bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); |
| 770 return; |
| 771 } |
| 772 |
| 773 // The last BluetoothGattConnection for a device closes the connection when |
| 774 // it's destroyed. |
| 775 if (device_id_to_connection_map_.erase(device_id)) { |
| 776 VLOG(1) << "Disconnecting device: " << device_id; |
| 777 } |
| 778 } |
| 779 |
744 void BluetoothDispatcherHost::OnGetPrimaryService( | 780 void BluetoothDispatcherHost::OnGetPrimaryService( |
745 int thread_id, | 781 int thread_id, |
746 int request_id, | 782 int request_id, |
747 int frame_routing_id, | 783 int frame_routing_id, |
748 const std::string& device_id, | 784 const std::string& device_id, |
749 const std::string& service_uuid) { | 785 const std::string& service_uuid) { |
750 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 786 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
751 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_PRIMARY_SERVICE); | 787 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_PRIMARY_SERVICE); |
752 RecordGetPrimaryServiceService(BluetoothUUID(service_uuid)); | 788 RecordGetPrimaryServiceService(BluetoothUUID(service_uuid)); |
753 | 789 |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 request_device_sessions_.Remove(chooser_id); | 1217 request_device_sessions_.Remove(chooser_id); |
1182 } | 1218 } |
1183 | 1219 |
1184 void BluetoothDispatcherHost::OnGATTConnectionCreated( | 1220 void BluetoothDispatcherHost::OnGATTConnectionCreated( |
1185 int thread_id, | 1221 int thread_id, |
1186 int request_id, | 1222 int request_id, |
1187 const std::string& device_id, | 1223 const std::string& device_id, |
1188 base::TimeTicks start_time, | 1224 base::TimeTicks start_time, |
1189 scoped_ptr<device::BluetoothGattConnection> connection) { | 1225 scoped_ptr<device::BluetoothGattConnection> connection) { |
1190 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1226 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1191 connections_.push_back(std::move(connection)); | 1227 device_id_to_connection_map_[device_id] = std::move(connection); |
1192 RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time); | 1228 RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time); |
1193 RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS); | 1229 RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS); |
1194 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, device_id)); | 1230 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, device_id)); |
1195 } | 1231 } |
1196 | 1232 |
1197 void BluetoothDispatcherHost::OnCreateGATTConnectionError( | 1233 void BluetoothDispatcherHost::OnCreateGATTConnectionError( |
1198 int thread_id, | 1234 int thread_id, |
1199 int request_id, | 1235 int request_id, |
1200 const std::string& device_id, | 1236 const std::string& device_id, |
1201 base::TimeTicks start_time, | 1237 base::TimeTicks start_time, |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1422 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1458 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1423 NOTIMPLEMENTED(); | 1459 NOTIMPLEMENTED(); |
1424 } | 1460 } |
1425 | 1461 |
1426 void BluetoothDispatcherHost::ShowNeedLocationLink() { | 1462 void BluetoothDispatcherHost::ShowNeedLocationLink() { |
1427 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1463 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1428 NOTIMPLEMENTED(); | 1464 NOTIMPLEMENTED(); |
1429 } | 1465 } |
1430 | 1466 |
1431 } // namespace content | 1467 } // namespace content |
OLD | NEW |