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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 std::set<BluetoothUUID> union_of_services(optional_services.begin(), | 104 std::set<BluetoothUUID> union_of_services(optional_services.begin(), |
| 105 optional_services.end()); | 105 optional_services.end()); |
| 106 | 106 |
| 107 for (const content::BluetoothScanFilter& filter : filters) | 107 for (const content::BluetoothScanFilter& filter : filters) |
| 108 union_of_services.insert(filter.services.begin(), filter.services.end()); | 108 union_of_services.insert(filter.services.begin(), filter.services.end()); |
| 109 | 109 |
| 110 UMA_HISTOGRAM_COUNTS_100("Bluetooth.Web.RequestDevice.UnionOfServices.Count", | 110 UMA_HISTOGRAM_COUNTS_100("Bluetooth.Web.RequestDevice.UnionOfServices.Count", |
| 111 union_of_services.size()); | 111 union_of_services.size()); |
| 112 } | 112 } |
| 113 | 113 |
| 114 enum class UMAConnectGATTOutcome { | |
| 115 SUCCESS, | |
| 116 NO_DEVICE, | |
| 117 UNKNOWN, | |
| 118 IN_PROGRESS, | |
| 119 FAILED, | |
| 120 AUTH_FAILED, | |
| 121 AUTH_CANCELED, | |
| 122 AUTH_REJECTED, | |
| 123 AUTH_TIMEOUT, | |
| 124 UNSUPPORTED_DEVICE, | |
| 125 // Note: Add new ConnectGATT outcomes immediately above this line. Make sure | |
| 126 // to update the enum list in tools/metrisc/histogram/histograms.xml | |
| 127 // accordingly. | |
| 128 COUNT | |
| 129 }; | |
| 130 | |
| 131 void RecordConnectGATTOutcome(UMAConnectGATTOutcome outcome) { | |
| 132 UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.ConnectGATT.Outcome", | |
| 133 static_cast<int>(outcome), | |
| 134 static_cast<int>(UMAConnectGATTOutcome::COUNT)); | |
| 135 } | |
| 136 | |
| 137 void RecordConnectGATTTimeSuccess(const base::TimeDelta& duration) { | |
| 138 UMA_HISTOGRAM_TIMES("Bluetooth.Web.ConnectGATT.TimeSuccess", duration); | |
|
Jeffrey Yasskin
2015/08/12 00:35:45
I'm a little worried that 10 seconds won't be enou
ortuno
2015/08/12 16:34:04
Done.
| |
| 139 } | |
| 140 | |
| 141 void RecordConnectGATTTimeFailed(const base::TimeDelta& duration) { | |
| 142 UMA_HISTOGRAM_TIMES("Bluetooth.Web.ConnectGATT.TimeFailed", duration); | |
| 143 } | |
| 144 | |
| 114 enum class UMAWebBluetoothFunction { | 145 enum class UMAWebBluetoothFunction { |
| 115 REQUEST_DEVICE, | 146 REQUEST_DEVICE, |
| 116 CONNECT_GATT, | 147 CONNECT_GATT, |
| 117 GET_PRIMARY_SERVICE, | 148 GET_PRIMARY_SERVICE, |
| 118 GET_CHARACTERISTIC, | 149 GET_CHARACTERISTIC, |
| 119 CHARACTERISTIC_READ_VALUE, | 150 CHARACTERISTIC_READ_VALUE, |
| 120 CHARACTERISTIC_WRITE_VALUE, | 151 CHARACTERISTIC_WRITE_VALUE, |
| 121 // NOTE: Add new actions immediately above this line. Make sure to update the | 152 // NOTE: Add new actions immediately above this line. Make sure to update the |
| 122 // enum list in tools/metrics/histogram/histograms.xml accordingly. | 153 // enum list in tools/metrics/histogram/histograms.xml accordingly. |
| 123 COUNT | 154 COUNT |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 | 195 |
| 165 void AddToHistogram(BluetoothGATTError error) { | 196 void AddToHistogram(BluetoothGATTError error) { |
| 166 UMA_HISTOGRAM_ENUMERATION("Bluetooth.GATTErrors", static_cast<int>(error), | 197 UMA_HISTOGRAM_ENUMERATION("Bluetooth.GATTErrors", static_cast<int>(error), |
| 167 static_cast<int>(BluetoothGATTError::MAX_ERROR)); | 198 static_cast<int>(BluetoothGATTError::MAX_ERROR)); |
| 168 } | 199 } |
| 169 | 200 |
| 170 WebBluetoothError TranslateConnectError( | 201 WebBluetoothError TranslateConnectError( |
| 171 device::BluetoothDevice::ConnectErrorCode error_code) { | 202 device::BluetoothDevice::ConnectErrorCode error_code) { |
| 172 switch (error_code) { | 203 switch (error_code) { |
| 173 case device::BluetoothDevice::ERROR_UNKNOWN: | 204 case device::BluetoothDevice::ERROR_UNKNOWN: |
| 205 RecordConnectGATTOutcome(UMAConnectGATTOutcome::UNKNOWN); | |
| 174 return WebBluetoothError::ConnectUnknownError; | 206 return WebBluetoothError::ConnectUnknownError; |
| 175 case device::BluetoothDevice::ERROR_INPROGRESS: | 207 case device::BluetoothDevice::ERROR_INPROGRESS: |
| 208 RecordConnectGATTOutcome(UMAConnectGATTOutcome::IN_PROGRESS); | |
| 176 return WebBluetoothError::ConnectAlreadyInProgress; | 209 return WebBluetoothError::ConnectAlreadyInProgress; |
| 177 case device::BluetoothDevice::ERROR_FAILED: | 210 case device::BluetoothDevice::ERROR_FAILED: |
| 211 RecordConnectGATTOutcome(UMAConnectGATTOutcome::FAILED); | |
| 178 return WebBluetoothError::ConnectUnknownFailure; | 212 return WebBluetoothError::ConnectUnknownFailure; |
| 179 case device::BluetoothDevice::ERROR_AUTH_FAILED: | 213 case device::BluetoothDevice::ERROR_AUTH_FAILED: |
| 214 RecordConnectGATTOutcome(UMAConnectGATTOutcome::AUTH_FAILED); | |
| 180 return WebBluetoothError::ConnectAuthFailed; | 215 return WebBluetoothError::ConnectAuthFailed; |
| 181 case device::BluetoothDevice::ERROR_AUTH_CANCELED: | 216 case device::BluetoothDevice::ERROR_AUTH_CANCELED: |
| 217 RecordConnectGATTOutcome(UMAConnectGATTOutcome::AUTH_CANCELED); | |
| 182 return WebBluetoothError::ConnectAuthCanceled; | 218 return WebBluetoothError::ConnectAuthCanceled; |
| 183 case device::BluetoothDevice::ERROR_AUTH_REJECTED: | 219 case device::BluetoothDevice::ERROR_AUTH_REJECTED: |
| 220 RecordConnectGATTOutcome(UMAConnectGATTOutcome::AUTH_REJECTED); | |
| 184 return WebBluetoothError::ConnectAuthRejected; | 221 return WebBluetoothError::ConnectAuthRejected; |
| 185 case device::BluetoothDevice::ERROR_AUTH_TIMEOUT: | 222 case device::BluetoothDevice::ERROR_AUTH_TIMEOUT: |
| 223 RecordConnectGATTOutcome(UMAConnectGATTOutcome::AUTH_TIMEOUT); | |
| 186 return WebBluetoothError::ConnectAuthTimeout; | 224 return WebBluetoothError::ConnectAuthTimeout; |
| 187 case device::BluetoothDevice::ERROR_UNSUPPORTED_DEVICE: | 225 case device::BluetoothDevice::ERROR_UNSUPPORTED_DEVICE: |
| 226 RecordConnectGATTOutcome(UMAConnectGATTOutcome::UNSUPPORTED_DEVICE); | |
| 188 return WebBluetoothError::ConnectUnsupportedDevice; | 227 return WebBluetoothError::ConnectUnsupportedDevice; |
| 189 } | 228 } |
| 190 NOTREACHED(); | 229 NOTREACHED(); |
| 191 return WebBluetoothError::UntranslatedConnectErrorCode; | 230 return WebBluetoothError::UntranslatedConnectErrorCode; |
| 192 } | 231 } |
| 193 | 232 |
| 194 blink::WebBluetoothError TranslateGATTError( | 233 blink::WebBluetoothError TranslateGATTError( |
| 195 BluetoothGattService::GattErrorCode error_code) { | 234 BluetoothGattService::GattErrorCode error_code) { |
| 196 switch (error_code) { | 235 switch (error_code) { |
| 197 case BluetoothGattService::GATT_ERROR_UNKNOWN: | 236 case BluetoothGattService::GATT_ERROR_UNKNOWN: |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 406 const std::string& device_instance_id) { | 445 const std::string& device_instance_id) { |
| 407 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 446 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 408 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT); | 447 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT); |
| 409 | 448 |
| 410 // TODO(ortuno): Right now it's pointless to check if the domain has access to | 449 // TODO(ortuno): Right now it's pointless to check if the domain has access to |
| 411 // the device, because any domain can connect to any device. But once | 450 // the device, because any domain can connect to any device. But once |
| 412 // permissions are implemented we should check that the domain has access to | 451 // permissions are implemented we should check that the domain has access to |
| 413 // the device. https://crbug.com/484745 | 452 // the device. https://crbug.com/484745 |
| 414 device::BluetoothDevice* device = adapter_->GetDevice(device_instance_id); | 453 device::BluetoothDevice* device = adapter_->GetDevice(device_instance_id); |
| 415 if (device == nullptr) { // See "NETWORK_ERROR Note" above. | 454 if (device == nullptr) { // See "NETWORK_ERROR Note" above. |
| 455 RecordConnectGATTOutcome(UMAConnectGATTOutcome::NO_DEVICE); | |
| 456 VLOG(1) << "Bluetooth Device no longer in range."; | |
| 416 Send(new BluetoothMsg_ConnectGATTError( | 457 Send(new BluetoothMsg_ConnectGATTError( |
| 417 thread_id, request_id, WebBluetoothError::DeviceNoLongerInRange)); | 458 thread_id, request_id, WebBluetoothError::DeviceNoLongerInRange)); |
| 418 return; | 459 return; |
| 419 } | 460 } |
| 420 device->CreateGattConnection( | 461 device->CreateGattConnection( |
| 421 base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated, | 462 base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated, |
| 422 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, | 463 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, |
| 423 device_instance_id), | 464 device_instance_id, base::TimeTicks::Now()), |
|
Jeffrey Yasskin
2015/08/12 00:35:45
Measure the starting time once at the beginning of
ortuno
2015/08/12 16:34:04
Done.
| |
| 424 base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError, | 465 base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError, |
| 425 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, | 466 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, |
| 426 device_instance_id)); | 467 device_instance_id, base::TimeTicks::Now())); |
| 427 } | 468 } |
| 428 | 469 |
| 429 void BluetoothDispatcherHost::OnGetPrimaryService( | 470 void BluetoothDispatcherHost::OnGetPrimaryService( |
| 430 int thread_id, | 471 int thread_id, |
| 431 int request_id, | 472 int request_id, |
| 432 const std::string& device_instance_id, | 473 const std::string& device_instance_id, |
| 433 const std::string& service_uuid) { | 474 const std::string& service_uuid) { |
| 434 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 475 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 435 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_PRIMARY_SERVICE); | 476 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_PRIMARY_SERVICE); |
| 436 | 477 |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 715 RecordRequestDeviceOutcome(UMARequestDeviceOutcome::DISCOVERY_STOP_FAILED); | 756 RecordRequestDeviceOutcome(UMARequestDeviceOutcome::DISCOVERY_STOP_FAILED); |
| 716 Send(new BluetoothMsg_RequestDeviceError( | 757 Send(new BluetoothMsg_RequestDeviceError( |
| 717 thread_id, request_id, WebBluetoothError::DiscoverySessionStopFailed)); | 758 thread_id, request_id, WebBluetoothError::DiscoverySessionStopFailed)); |
| 718 request_device_sessions_.erase(std::make_pair(thread_id, request_id)); | 759 request_device_sessions_.erase(std::make_pair(thread_id, request_id)); |
| 719 } | 760 } |
| 720 | 761 |
| 721 void BluetoothDispatcherHost::OnGATTConnectionCreated( | 762 void BluetoothDispatcherHost::OnGATTConnectionCreated( |
| 722 int thread_id, | 763 int thread_id, |
| 723 int request_id, | 764 int request_id, |
| 724 const std::string& device_instance_id, | 765 const std::string& device_instance_id, |
| 766 base::TimeTicks start_time, | |
| 725 scoped_ptr<device::BluetoothGattConnection> connection) { | 767 scoped_ptr<device::BluetoothGattConnection> connection) { |
| 726 // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect | 768 // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect |
| 727 // from it. | 769 // from it. |
| 770 RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time); | |
| 771 RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS); | |
| 728 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, | 772 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, |
| 729 device_instance_id)); | 773 device_instance_id)); |
| 730 } | 774 } |
| 731 | 775 |
| 732 void BluetoothDispatcherHost::OnCreateGATTConnectionError( | 776 void BluetoothDispatcherHost::OnCreateGATTConnectionError( |
| 733 int thread_id, | 777 int thread_id, |
| 734 int request_id, | 778 int request_id, |
| 735 const std::string& device_instance_id, | 779 const std::string& device_instance_id, |
| 780 base::TimeTicks start_time, | |
| 736 device::BluetoothDevice::ConnectErrorCode error_code) { | 781 device::BluetoothDevice::ConnectErrorCode error_code) { |
| 737 // There was an error creating the ATT Bearer so we reject with | 782 // There was an error creating the ATT Bearer so we reject with |
| 738 // NetworkError. | 783 // NetworkError. |
| 739 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-con nectgatt | 784 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-con nectgatt |
| 785 RecordConnectGATTTimeFailed(base::TimeTicks::Now() - start_time); | |
| 740 Send(new BluetoothMsg_ConnectGATTError(thread_id, request_id, | 786 Send(new BluetoothMsg_ConnectGATTError(thread_id, request_id, |
|
Jeffrey Yasskin
2015/08/12 00:35:45
Comment that RecordConnectGATTOutcome is called by
ortuno
2015/08/12 16:34:04
Done.
| |
| 741 TranslateConnectError(error_code))); | 787 TranslateConnectError(error_code))); |
| 742 } | 788 } |
| 743 | 789 |
| 744 void BluetoothDispatcherHost::OnServicesDiscovered( | 790 void BluetoothDispatcherHost::OnServicesDiscovered( |
| 745 int thread_id, | 791 int thread_id, |
| 746 int request_id, | 792 int request_id, |
| 747 const std::string& device_instance_id, | 793 const std::string& device_instance_id, |
| 748 const std::string& service_uuid) { | 794 const std::string& service_uuid) { |
| 749 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 795 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 750 | 796 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 798 | 844 |
| 799 void BluetoothDispatcherHost::OnWriteValueFailed( | 845 void BluetoothDispatcherHost::OnWriteValueFailed( |
| 800 int thread_id, | 846 int thread_id, |
| 801 int request_id, | 847 int request_id, |
| 802 device::BluetoothGattService::GattErrorCode error_code) { | 848 device::BluetoothGattService::GattErrorCode error_code) { |
| 803 Send(new BluetoothMsg_WriteCharacteristicValueError( | 849 Send(new BluetoothMsg_WriteCharacteristicValueError( |
| 804 thread_id, request_id, TranslateGATTError(error_code))); | 850 thread_id, request_id, TranslateGATTError(error_code))); |
| 805 } | 851 } |
| 806 | 852 |
| 807 } // namespace content | 853 } // namespace content |
| OLD | NEW |