Chromium Code Reviews| Index: content/browser/bluetooth/bluetooth_dispatcher_host.cc |
| diff --git a/content/browser/bluetooth/bluetooth_dispatcher_host.cc b/content/browser/bluetooth/bluetooth_dispatcher_host.cc |
| index 9870148b7f2ecb1d34d96f59aa2f5d8188d3a4bc..7974b37229950a6bca9aedee5707f19f89a6f536 100644 |
| --- a/content/browser/bluetooth/bluetooth_dispatcher_host.cc |
| +++ b/content/browser/bluetooth/bluetooth_dispatcher_host.cc |
| @@ -58,11 +58,151 @@ enum class UMARequestDeviceOutcome { |
| }; |
| void RecordRequestDeviceOutcome(UMARequestDeviceOutcome outcome) { |
| - UMA_HISTOGRAM_ENUMERATION("Bluetooth.RequestDevice.Outcome", |
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.RequestDevice.Outcome", |
| static_cast<int>(outcome), |
| static_cast<int>(UMARequestDeviceOutcome::COUNT)); |
| } |
| +enum class UMAGATTServices { |
| + UNKNOWN, |
| + ALERT_NOTIFICATION, |
| + AUTOMATION_IO, |
| + BATTERY_SERVICE, |
| + BLOOD_PRESSURE, |
| + BODY_COMPOSITION, |
| + BOND_MANAGEMENT, |
| + CONTINUOUS_GLUCOSE_MONITORING, |
| + CURRENT_TIME, |
| + CYCLING_POWER, |
| + CYCLING_SPEED_AND_CADENCE, |
| + DEVICE_INFORMATION, |
| + ENVIRONMENTAL_SENSING, |
| + GENERIC_ACCESS, |
| + GENERIC_ATTRIBUTE, |
| + GLUCOSE, |
| + HEALTH_THERMOMETER, |
| + HEART_RATE, |
| + HUMAN_INTERFACE_DEVICE, |
| + IMMEDIATE_ALERT, |
| + INDOOR_POSITIONING, |
| + INTERNET_PROTOCOL_SUPPORT, |
| + LINK_LOSS, |
| + LOCATION_AND_NAVIGATION, |
| + NEXT_DST_CHANGE, |
| + PHONE_ALERT_STATUS, |
| + PULSE_OXIMETER, |
| + REFERENCE_TIME_UPDATE, |
| + RUNNING_SPEED_AND_CADENCE, |
| + SCAN_PARAMETERS, |
| + TX_POWER, |
| + USER_DATA, |
| + WEIGHT_SCALE, |
| + // NOTE: Add new services immediately above this line. Make sure to update the |
| + // enum list in tools/metrics/histogram/histograms.xml accordingly. |
| + COUNT |
| +}; |
| + |
| +typedef std::map<BluetoothUUID, UMAGATTServices> BluetoothUUIDToServicesMap; |
| + |
| +std::map<BluetoothUUID, UMAGATTServices>* getServiceToEnumMap() { |
|
Jeffrey Yasskin
2015/08/05 19:03:49
I don't really like having to maintain yet another
ortuno
2015/08/10 20:05:50
Done.
|
| + CR_DEFINE_STATIC_LOCAL(BluetoothUUIDToServicesMap, services, ()); |
| + if (services.empty()) { |
| + services.insert(std::make_pair(BluetoothUUID("1811"), |
| + UMAGATTServices::ALERT_NOTIFICATION)); |
| + services.insert(std::make_pair(BluetoothUUID("180F"), |
| + UMAGATTServices::BATTERY_SERVICE)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1810"), UMAGATTServices::BLOOD_PRESSURE)); |
| + services.insert(std::make_pair(BluetoothUUID("181B"), |
| + UMAGATTServices::BODY_COMPOSITION)); |
| + services.insert(std::make_pair(BluetoothUUID("181E"), |
| + UMAGATTServices::BOND_MANAGEMENT)); |
| + services.insert(std::make_pair( |
| + BluetoothUUID("181F"), UMAGATTServices::CONTINUOUS_GLUCOSE_MONITORING)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1805"), UMAGATTServices::CURRENT_TIME)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1818"), UMAGATTServices::CYCLING_POWER)); |
| + services.insert(std::make_pair(BluetoothUUID("1816"), |
| + UMAGATTServices::CYCLING_SPEED_AND_CADENCE)); |
| + services.insert(std::make_pair(BluetoothUUID("180A"), |
| + UMAGATTServices::DEVICE_INFORMATION)); |
| + services.insert(std::make_pair(BluetoothUUID("181A"), |
| + UMAGATTServices::ENVIRONMENTAL_SENSING)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1800"), UMAGATTServices::GENERIC_ACCESS)); |
| + services.insert(std::make_pair(BluetoothUUID("1801"), |
| + UMAGATTServices::GENERIC_ATTRIBUTE)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1808"), UMAGATTServices::GLUCOSE)); |
| + services.insert(std::make_pair(BluetoothUUID("1809"), |
| + UMAGATTServices::HEALTH_THERMOMETER)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("180D"), UMAGATTServices::HEART_RATE)); |
| + services.insert(std::make_pair(BluetoothUUID("1812"), |
| + UMAGATTServices::HUMAN_INTERFACE_DEVICE)); |
| + services.insert(std::make_pair(BluetoothUUID("1802"), |
| + UMAGATTServices::IMMEDIATE_ALERT)); |
| + services.insert(std::make_pair(BluetoothUUID("1821"), |
| + UMAGATTServices::INDOOR_POSITIONING)); |
| + services.insert(std::make_pair(BluetoothUUID("1820"), |
| + UMAGATTServices::INTERNET_PROTOCOL_SUPPORT)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1803"), UMAGATTServices::LINK_LOSS)); |
| + services.insert(std::make_pair(BluetoothUUID("1819"), |
| + UMAGATTServices::LOCATION_AND_NAVIGATION)); |
| + services.insert(std::make_pair(BluetoothUUID("1807"), |
| + UMAGATTServices::NEXT_DST_CHANGE)); |
| + services.insert(std::make_pair(BluetoothUUID("180E"), |
| + UMAGATTServices::PHONE_ALERT_STATUS)); |
| + services.insert(std::make_pair(BluetoothUUID("1806"), |
| + UMAGATTServices::REFERENCE_TIME_UPDATE)); |
| + services.insert(std::make_pair(BluetoothUUID("1814"), |
| + UMAGATTServices::RUNNING_SPEED_AND_CADENCE)); |
| + services.insert(std::make_pair(BluetoothUUID("1813"), |
| + UMAGATTServices::SCAN_PARAMETERS)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("1804"), UMAGATTServices::TX_POWER)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("181C"), UMAGATTServices::USER_DATA)); |
| + services.insert( |
| + std::make_pair(BluetoothUUID("181D"), UMAGATTServices::WEIGHT_SCALE)); |
| + } |
| + return &services; |
| +} |
| + |
| +int GetServiceBucket(const BluetoothUUID& service) { |
| + std::map<BluetoothUUID, UMAGATTServices>* services = getServiceToEnumMap(); |
| + auto it = services->find(service); |
| + if (it == services->end()) |
| + return static_cast<int>(UMAGATTServices::UNKNOWN); |
| + return static_cast<int>(it->second); |
| +} |
| + |
| +void RecordRequestDeviceFilters( |
| + const std::vector<content::BluetoothScanFilter>& filters) { |
| + UMA_HISTOGRAM_COUNTS("Bluetooth.Web.RequestDevice.Filters.Count", |
| + filters.size()); |
| + for (const content::BluetoothScanFilter& filter : filters) { |
| + for (const BluetoothUUID& service : filter.services) { |
| + UMA_HISTOGRAM_ENUMERATION("Bluetooth.Web.RequestDevice.Filters.Services", |
| + GetServiceBucket(service), |
| + static_cast<int>(UMAGATTServices::COUNT)); |
| + } |
| + } |
| +} |
| + |
| +void RecordRequestDeviceOptionalServices( |
| + const std::vector<BluetoothUUID>& optional_services) { |
| + UMA_HISTOGRAM_COUNTS("Bluetooth.Web.RequestDevice.OptionalServices.Count", |
| + optional_services.size()); |
| + for (const BluetoothUUID& service : optional_services) { |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "Bluetooth.Web.RequestDevice.OptionalServices.Services", |
| + GetServiceBucket(service), static_cast<int>(UMAGATTServices::COUNT)); |
| + } |
| +} |
| + |
| enum class UMAWebBluetoothFunction { |
| REQUEST_DEVICE, |
| CONNECT_GATT, |
| @@ -271,14 +411,27 @@ void BluetoothDispatcherHost::OnRequestDevice( |
| const std::vector<BluetoothUUID>& optional_services) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::REQUEST_DEVICE); |
| + RecordRequestDeviceFilters(filters); |
| + RecordRequestDeviceOptionalServices(optional_services); |
| + |
| + VLOG(1) << "requestDevice called with the following filters: "; |
| + for (const BluetoothScanFilter& filter : filters) { |
| + VLOG(1) << "["; |
| + for (const BluetoothUUID& service : filter.services) |
| + VLOG(1) << "\t" << service.value(); |
| + VLOG(1) << "]"; |
| + } |
| + |
| + VLOG(1) << "requestDevice called with the following optional services: "; |
| + for (const BluetoothUUID& service : optional_services) |
| + VLOG(1) << "\t" << service.value(); |
| RenderFrameHostImpl* render_frame_host = |
| RenderFrameHostImpl::FromID(render_process_id_, frame_routing_id); |
| if (!render_frame_host) { |
| - DLOG(WARNING) |
| - << "Got a requestDevice IPC without a matching RenderFrameHost: " |
| - << render_process_id_ << ", " << frame_routing_id; |
| + VLOG(1) << "Got a requestDevice IPC without a matching RenderFrameHost: " |
| + << render_process_id_ << ", " << frame_routing_id; |
| RecordRequestDeviceOutcome(UMARequestDeviceOutcome::NO_RENDER_FRAME); |
| Send(new BluetoothMsg_RequestDeviceError( |
| thread_id, request_id, WebBluetoothError::RequestDeviceWithoutFrame)); |
| @@ -321,7 +474,7 @@ void BluetoothDispatcherHost::OnRequestDevice( |
| base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError, |
| weak_ptr_factory_.GetWeakPtr(), thread_id, request_id)); |
| } else { |
| - DLOG(WARNING) << "No BluetoothAdapter. Can't serve requestDevice."; |
| + VLOG(1) << "No BluetoothAdapter. Can't serve requestDevice."; |
| RecordRequestDeviceOutcome(UMARequestDeviceOutcome::NO_BLUETOOTH_ADAPTER); |
| Send(new BluetoothMsg_RequestDeviceError( |
| thread_id, request_id, WebBluetoothError::NoBluetoothAdapter)); |
| @@ -605,6 +758,10 @@ void BluetoothDispatcherHost::OnDiscoverySessionStopped(int thread_id, |
| CHECK(session != request_device_sessions_.end()); |
| BluetoothAdapter::DeviceList devices = adapter_->GetDevices(); |
| for (device::BluetoothDevice* device : devices) { |
| + VLOG(1) << "Device: " << device->GetName(); |
| + VLOG(1) << "UUIDs: "; |
| + for (BluetoothUUID uuid : device->GetUUIDs()) |
| + VLOG(1) << "\t" << uuid.canonical_value(); |
| if (MatchesFilters(*device, session->second.filters)) { |
| content::BluetoothDevice device_ipc( |
| device->GetAddress(), // instance_id |
| @@ -626,6 +783,7 @@ void BluetoothDispatcherHost::OnDiscoverySessionStopped(int thread_id, |
| } |
| RecordRequestDeviceOutcome( |
| UMARequestDeviceOutcome::NO_MATCHING_DEVICES_FOUND); |
| + VLOG(1) << "No matching Bluetooth Devices found"; |
| Send(new BluetoothMsg_RequestDeviceError(thread_id, request_id, |
| WebBluetoothError::NoDevicesFound)); |
| request_device_sessions_.erase(session); |