Chromium Code Reviews| 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 // NETWORK_ERROR Note: | 5 // NETWORK_ERROR Note: |
| 6 // When a device can't be found in the BluetoothAdapter, that generally | 6 // When a device can't be found in the BluetoothAdapter, that generally |
| 7 // indicates that it's gone out of range. We reject with a NetworkError in that | 7 // indicates that it's gone out of range. We reject with a NetworkError in that |
| 8 // case. | 8 // case. |
| 9 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-conne ctgatt | 9 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-conne ctgatt |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 using device::BluetoothGattService; | 30 using device::BluetoothGattService; |
| 31 using device::BluetoothUUID; | 31 using device::BluetoothUUID; |
| 32 | 32 |
| 33 using UMAWebBluetoothFunction = | 33 using UMAWebBluetoothFunction = |
| 34 content::BluetoothMetrics::UMAWebBluetoothFunction; | 34 content::BluetoothMetrics::UMAWebBluetoothFunction; |
| 35 using UMARequestDeviceOutcome = | 35 using UMARequestDeviceOutcome = |
| 36 content::BluetoothMetrics::UMARequestDeviceOutcome; | 36 content::BluetoothMetrics::UMARequestDeviceOutcome; |
| 37 using UMAConnectGATTOutcome = content::BluetoothMetrics::UMAConnectGATTOutcome; | 37 using UMAConnectGATTOutcome = content::BluetoothMetrics::UMAConnectGATTOutcome; |
| 38 using UMAGetPrimaryServiceOutcome = | 38 using UMAGetPrimaryServiceOutcome = |
| 39 content::BluetoothMetrics::UMAGetPrimaryServiceOutcome; | 39 content::BluetoothMetrics::UMAGetPrimaryServiceOutcome; |
| 40 using UMAGetCharacteristicOutcome = | |
| 41 content::BluetoothMetrics::UMAGetCharacteristicOutcome; | |
| 40 using UMAGATTError = content::BluetoothMetrics::UMAGATTError; | 42 using UMAGATTError = content::BluetoothMetrics::UMAGATTError; |
| 41 | 43 |
| 42 namespace { | 44 namespace { |
| 43 | 45 |
| 44 // TODO(ortuno): Once we have a chooser for scanning and the right | 46 // TODO(ortuno): Once we have a chooser for scanning and the right |
| 45 // callback for discovered services we should delete these constants. | 47 // callback for discovered services we should delete these constants. |
| 46 // https://crbug.com/436280 and https://crbug.com/484504 | 48 // https://crbug.com/436280 and https://crbug.com/484504 |
| 47 const int kDelayTime = 5; // 5 seconds for scanning and discovering | 49 const int kDelayTime = 5; // 5 seconds for scanning and discovering |
| 48 const int kTestingDelayTime = 0; // No need to wait during tests | 50 const int kTestingDelayTime = 0; // No need to wait during tests |
| 49 | 51 |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 381 } | 383 } |
| 382 | 384 |
| 383 void BluetoothDispatcherHost::OnGetCharacteristic( | 385 void BluetoothDispatcherHost::OnGetCharacteristic( |
| 384 int thread_id, | 386 int thread_id, |
| 385 int request_id, | 387 int request_id, |
| 386 const std::string& service_instance_id, | 388 const std::string& service_instance_id, |
| 387 const std::string& characteristic_uuid) { | 389 const std::string& characteristic_uuid) { |
| 388 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 390 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 389 BluetoothMetrics::RecordWebBluetoothFunctionCall( | 391 BluetoothMetrics::RecordWebBluetoothFunctionCall( |
| 390 UMAWebBluetoothFunction::GET_CHARACTERISTIC); | 392 UMAWebBluetoothFunction::GET_CHARACTERISTIC); |
| 393 BluetoothMetrics::RecordGetCharacteristicCharacteristic(characteristic_uuid); | |
| 391 | 394 |
| 392 auto device_iter = service_to_device_.find(service_instance_id); | 395 auto device_iter = service_to_device_.find(service_instance_id); |
| 393 // A service_instance_id not in the map implies a hostile renderer | 396 // A service_instance_id not in the map implies a hostile renderer |
| 394 // because a renderer obtains the service id from this class and | 397 // because a renderer obtains the service id from this class and |
| 395 // it will be added to the map at that time. | 398 // it will be added to the map at that time. |
| 396 if (device_iter == service_to_device_.end()) { | 399 if (device_iter == service_to_device_.end()) { |
| 397 // Kill the renderer | 400 // Kill the renderer |
| 398 bad_message::ReceivedBadMessage(this, bad_message::BDH_INVALID_SERVICE_ID); | 401 bad_message::ReceivedBadMessage(this, bad_message::BDH_INVALID_SERVICE_ID); |
| 399 return; | 402 return; |
| 400 } | 403 } |
| 401 | 404 |
| 402 // TODO(ortuno): Check if domain has access to device. | 405 // TODO(ortuno): Check if domain has access to device. |
| 403 // https://crbug.com/493459 | 406 // https://crbug.com/493459 |
| 404 device::BluetoothDevice* device = | 407 device::BluetoothDevice* device = |
| 405 adapter_->GetDevice(device_iter->second /* device_instance_id */); | 408 adapter_->GetDevice(device_iter->second /* device_instance_id */); |
| 406 | 409 |
| 407 if (device == nullptr) { // See "NETWORK_ERROR Note" above. | 410 if (device == nullptr) { // See "NETWORK_ERROR Note" above. |
| 411 BluetoothMetrics::RecordGetCharacteristicOutcome( | |
| 412 UMAGetCharacteristicOutcome::NO_DEVICE); | |
| 413 VLOG(1) << "Bluetooth Device is no longer in range."; | |
|
Jeffrey Yasskin
2015/08/13 21:32:53
As discussed over IM, we should drop the VLOGs wit
ortuno
2015/08/14 16:23:35
Done.
| |
| 408 Send(new BluetoothMsg_GetCharacteristicError( | 414 Send(new BluetoothMsg_GetCharacteristicError( |
| 409 thread_id, request_id, WebBluetoothError::DeviceNoLongerInRange)); | 415 thread_id, request_id, WebBluetoothError::DeviceNoLongerInRange)); |
| 410 return; | 416 return; |
| 411 } | 417 } |
| 412 | 418 |
| 413 // TODO(ortuno): Check if domain has access to service | 419 // TODO(ortuno): Check if domain has access to service |
| 414 // http://crbug.com/493460 | 420 // http://crbug.com/493460 |
| 415 device::BluetoothGattService* service = | 421 device::BluetoothGattService* service = |
| 416 device->GetGattService(service_instance_id); | 422 device->GetGattService(service_instance_id); |
| 417 if (!service) { | 423 if (!service) { |
| 424 BluetoothMetrics::RecordGetCharacteristicOutcome( | |
| 425 UMAGetCharacteristicOutcome::NO_SERVICE); | |
| 426 VLOG(1) << "GATT Service no longer exists."; | |
| 418 Send(new BluetoothMsg_GetCharacteristicError( | 427 Send(new BluetoothMsg_GetCharacteristicError( |
| 419 thread_id, request_id, WebBluetoothError::ServiceNoLongerExists)); | 428 thread_id, request_id, WebBluetoothError::ServiceNoLongerExists)); |
| 420 return; | 429 return; |
| 421 } | 430 } |
| 422 | 431 |
| 423 for (BluetoothGattCharacteristic* characteristic : | 432 for (BluetoothGattCharacteristic* characteristic : |
| 424 service->GetCharacteristics()) { | 433 service->GetCharacteristics()) { |
| 425 if (characteristic->GetUUID().canonical_value() == characteristic_uuid) { | 434 if (characteristic->GetUUID().canonical_value() == characteristic_uuid) { |
| 426 const std::string& characteristic_instance_id = | 435 const std::string& characteristic_instance_id = |
| 427 characteristic->GetIdentifier(); | 436 characteristic->GetIdentifier(); |
| 428 | 437 |
| 429 auto insert_result = characteristic_to_service_.insert( | 438 auto insert_result = characteristic_to_service_.insert( |
| 430 make_pair(characteristic_instance_id, service_instance_id)); | 439 make_pair(characteristic_instance_id, service_instance_id)); |
| 431 | 440 |
| 432 // If value is already in map, DCHECK it's valid. | 441 // If value is already in map, DCHECK it's valid. |
| 433 if (!insert_result.second) | 442 if (!insert_result.second) |
| 434 DCHECK(insert_result.first->second == service_instance_id); | 443 DCHECK(insert_result.first->second == service_instance_id); |
| 435 | 444 |
| 445 BluetoothMetrics::RecordGetCharacteristicOutcome( | |
| 446 UMAGetCharacteristicOutcome::SUCCESS); | |
| 436 // TODO(ortuno): Use generated instance ID instead. | 447 // TODO(ortuno): Use generated instance ID instead. |
| 437 // https://crbug.com/495379 | 448 // https://crbug.com/495379 |
| 438 Send(new BluetoothMsg_GetCharacteristicSuccess( | 449 Send(new BluetoothMsg_GetCharacteristicSuccess( |
| 439 thread_id, request_id, characteristic_instance_id)); | 450 thread_id, request_id, characteristic_instance_id)); |
| 440 return; | 451 return; |
| 441 } | 452 } |
| 442 } | 453 } |
| 454 BluetoothMetrics::RecordGetCharacteristicOutcome( | |
| 455 UMAGetCharacteristicOutcome::NOT_FOUND); | |
| 456 VLOG(1) << "No GATT Characteristic with UUID: " << characteristic_uuid; | |
|
Jeffrey Yasskin
2015/08/13 21:32:52
This one's probably also equivalent to its rejecti
ortuno
2015/08/14 16:23:35
Removed.
| |
| 443 Send(new BluetoothMsg_GetCharacteristicError( | 457 Send(new BluetoothMsg_GetCharacteristicError( |
| 444 thread_id, request_id, WebBluetoothError::CharacteristicNotFound)); | 458 thread_id, request_id, WebBluetoothError::CharacteristicNotFound)); |
| 445 } | 459 } |
| 446 | 460 |
| 447 void BluetoothDispatcherHost::OnReadValue( | 461 void BluetoothDispatcherHost::OnReadValue( |
| 448 int thread_id, | 462 int thread_id, |
| 449 int request_id, | 463 int request_id, |
| 450 const std::string& characteristic_instance_id) { | 464 const std::string& characteristic_instance_id) { |
| 451 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 465 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 452 BluetoothMetrics::RecordWebBluetoothFunctionCall( | 466 BluetoothMetrics::RecordWebBluetoothFunctionCall( |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 751 | 765 |
| 752 void BluetoothDispatcherHost::OnWriteValueFailed( | 766 void BluetoothDispatcherHost::OnWriteValueFailed( |
| 753 int thread_id, | 767 int thread_id, |
| 754 int request_id, | 768 int request_id, |
| 755 device::BluetoothGattService::GattErrorCode error_code) { | 769 device::BluetoothGattService::GattErrorCode error_code) { |
| 756 Send(new BluetoothMsg_WriteCharacteristicValueError( | 770 Send(new BluetoothMsg_WriteCharacteristicValueError( |
| 757 thread_id, request_id, TranslateGATTError(error_code))); | 771 thread_id, request_id, TranslateGATTError(error_code))); |
| 758 } | 772 } |
| 759 | 773 |
| 760 } // namespace content | 774 } // namespace content |
| OLD | NEW |