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); |