Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Unified Diff: content/browser/bluetooth/bluetooth_dispatcher_host.cc

Issue 1264203002: bluetooth: Add histograms and logging for requestDevice() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bluetooth-web-bluetooth-action
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 61d35955a2169cb768de875934ad772f2c66132c..3cdba38b7c19de094608f923920a73790b97a3bd 100644
--- a/content/browser/bluetooth/bluetooth_dispatcher_host.cc
+++ b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
@@ -52,18 +52,161 @@ enum class UMARequestDeviceOutcome {
DISCOVERY_START_FAILED = 3,
DISCOVERY_STOP_FAILED = 4,
NO_MATCHING_DEVICES_FOUND = 5,
+ BLUETOOTH_ADAPTER_OFF = 6,
// NOTE: Add new requestDevice() outcomes immediately above this line. Make
// sure to update the enum list in
// tools/metrics/histogram/histograms.xml accordingly.
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() {
+ 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 RecordRequestDeviceOutcome(UMARequestDeviceOutcome outcome) {
- UMA_HISTOGRAM_ENUMERATION("Bluetooth.RequestDevice.Outcome",
+ UMA_HISTOGRAM_ENUMERATION("WebBluetooth.RequestDevice.Outcome",
static_cast<int>(outcome),
static_cast<int>(UMARequestDeviceOutcome::COUNT));
}
+void RecordRequestDeviceFilters(
+ const std::vector<content::BluetoothScanFilter>& filters) {
+ UMA_HISTOGRAM_COUNTS("WebBluetooth.RequestDevice.Filters.Count",
+ filters.size());
+ for (const content::BluetoothScanFilter& filter : filters) {
+ for (const BluetoothUUID& service : filter.services) {
+ UMA_HISTOGRAM_ENUMERATION("WebBluetooth.RequestDevice.Filters.Services",
+ GetServiceBucket(service),
+ static_cast<int>(UMAGATTServices::COUNT));
+ }
+ }
+}
+
+void RecordRequestDeviceOptionalServices(
+ const std::vector<BluetoothUUID>& optional_services) {
+ UMA_HISTOGRAM_COUNTS("WebBluetooth.RequestDevice.OptionalServices.Count",
+ optional_services.size());
+ for (const BluetoothUUID& service : optional_services) {
+ UMA_HISTOGRAM_ENUMERATION(
+ "WebBluetooth.RequestDevice.OptionalServices.Services",
+ static_cast<int>(GetServiceBucket(service)),
+ static_cast<int>(UMAGATTServices::COUNT));
+ }
+}
+
// TODO(ortuno): Once we have a chooser for scanning and the right
// callback for discovered services we should delete these constants.
// https://crbug.com/436280 and https://crbug.com/484504
@@ -254,14 +397,27 @@ void BluetoothDispatcherHost::OnRequestDevice(
const std::vector<BluetoothUUID>& optional_services) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
RecordAction(UserMetricsAction("WebBluetooth_RequestDevice"));
+ 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) << service.value();
+ VLOG(1) << "]";
+ }
+
+ VLOG(1) << "requestDevice called with the following optional services: ";
+ for (const BluetoothUUID& service : optional_services)
+ VLOG(1) << 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));
@@ -281,6 +437,22 @@ void BluetoothDispatcherHost::OnRequestDevice(
bad_message::ReceivedBadMessage(
this, bad_message::BDH_DUPLICATE_REQUEST_DEVICE_ID);
}
+
+ if (!adapter_->IsPresent()) {
+ VLOG(1) << "BluetoothAdapter not present. Can't serve requestDevice.";
+ RecordRequestDeviceOutcome(UMARequestDeviceOutcome::NO_BLUETOOTH_ADAPTER);
+ Send(new BluetoothMsg_RequestDeviceError(
+ thread_id, request_id, WebBluetoothError::NoBluetoothAdapter));
+ return;
+ }
+ if (!adapter_->IsPowered()) {
+ VLOG(1) << "BluetoothAdapter is not powered. Can't serve requestDevice.";
+ RecordRequestDeviceOutcome(
+ UMARequestDeviceOutcome::BLUETOOTH_ADAPTER_OFF);
+ Send(new BluetoothMsg_RequestDeviceError(
+ thread_id, request_id, WebBluetoothError::BluetoothAdapterOff));
+ return;
+ }
adapter_->StartDiscoverySessionWithFilter(
ComputeScanFilter(filters),
base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted,
@@ -288,7 +460,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));
@@ -589,6 +761,7 @@ void BluetoothDispatcherHost::OnDiscoverySessionStopped(int thread_id,
return;
}
}
+ VLOG(1) << "No matching Bluetooth Devices found";
RecordRequestDeviceOutcome(
UMARequestDeviceOutcome::NO_MATCHING_DEVICES_FOUND);
Send(new BluetoothMsg_RequestDeviceError(thread_id, request_id,
« no previous file with comments | « no previous file | content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698