| Index: content/browser/geolocation/network_location_request.cc
|
| diff --git a/content/browser/geolocation/network_location_request.cc b/content/browser/geolocation/network_location_request.cc
|
| index 94074be561d9c7b4acde2e456099f9ede99d04d0..9418a3f537d0917640606af8dec7989b25ff1592 100644
|
| --- a/content/browser/geolocation/network_location_request.cc
|
| +++ b/content/browser/geolocation/network_location_request.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/json/json_reader.h"
|
| #include "base/json/json_writer.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/metrics/sparse_histogram.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/values.h"
|
| @@ -31,6 +32,32 @@ const char kLatitudeString[] = "lat";
|
| const char kLongitudeString[] = "lng";
|
| const char kAccuracyString[] = "accuracy";
|
|
|
| +enum NetworkLocationRequestEvent {
|
| + // NOTE: Do not renumber these as that would confuse interpretation of
|
| + // previously logged data. When making changes, also update the enum list
|
| + // in tools/metrics/histograms/histograms.xml to keep it in sync.
|
| + NETWORK_LOCATION_REQUEST_EVENT_REQUEST_START = 0,
|
| + NETWORK_LOCATION_REQUEST_EVENT_REQUEST_CANCEL = 1,
|
| + NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_SUCCESS = 2,
|
| + NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_NOT_OK = 3,
|
| + NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_EMPTY = 4,
|
| + NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_MALFORMED = 5,
|
| + NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_INVALID_FIX = 6,
|
| +
|
| + // NOTE: Add entries only immediately above this line.
|
| + NETWORK_LOCATION_REQUEST_EVENT_COUNT = 7
|
| +};
|
| +
|
| +void RecordUmaEvent(NetworkLocationRequestEvent event) {
|
| + UMA_HISTOGRAM_ENUMERATION("Geolocation.NetworkLocationRequest.Event",
|
| + event, NETWORK_LOCATION_REQUEST_EVENT_COUNT);
|
| +}
|
| +
|
| +void RecordUmaResponseCode(int code) {
|
| + UMA_HISTOGRAM_SPARSE_SLOWLY("Geolocation.NetworkLocationRequest.ResponseCode",
|
| + code);
|
| +}
|
| +
|
| // Local functions
|
| // Creates the request url to send to the server.
|
| GURL FormRequestURL(const GURL& url);
|
| @@ -40,7 +67,8 @@ void FormUploadData(const WifiData& wifi_data,
|
| const string16& access_token,
|
| std::string* upload_data);
|
|
|
| -// Parsers the server response.
|
| +// Attempts to extract a position from the response. Detects and indicates
|
| +// various failure cases.
|
| void GetLocationFromResponse(bool http_post_result,
|
| int status_code,
|
| const std::string& response_body,
|
| @@ -78,8 +106,10 @@ NetworkLocationRequest::~NetworkLocationRequest() {
|
| bool NetworkLocationRequest::MakeRequest(const string16& access_token,
|
| const WifiData& wifi_data,
|
| const base::Time& timestamp) {
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_REQUEST_START);
|
| if (url_fetcher_ != NULL) {
|
| DVLOG(1) << "NetworkLocationRequest : Cancelling pending request";
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_REQUEST_CANCEL);
|
| url_fetcher_.reset();
|
| }
|
| wifi_data_ = wifi_data;
|
| @@ -108,6 +138,7 @@ void NetworkLocationRequest::OnURLFetchComplete(
|
|
|
| net::URLRequestStatus status = source->GetStatus();
|
| int response_code = source->GetResponseCode();
|
| + RecordUmaResponseCode(response_code);
|
|
|
| Geoposition position;
|
| string16 access_token;
|
| @@ -259,12 +290,14 @@ void GetLocationFromResponse(bool http_post_result,
|
| // we're offline, or there was no response.
|
| if (!http_post_result) {
|
| FormatPositionError(server_url, "No response received", position);
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_EMPTY);
|
| return;
|
| }
|
| if (status_code != 200) { // HTTP OK.
|
| std::string message = "Returned error code ";
|
| message += base::IntToString(status_code);
|
| FormatPositionError(server_url, message, position);
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_NOT_OK);
|
| return;
|
| }
|
| // We use the timestamp from the wifi data that was used to generate
|
| @@ -272,6 +305,7 @@ void GetLocationFromResponse(bool http_post_result,
|
| if (!ParseServerResponse(response_body, timestamp, position, access_token)) {
|
| // We failed to parse the repsonse.
|
| FormatPositionError(server_url, "Response was malformed", position);
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_MALFORMED);
|
| return;
|
| }
|
| // The response was successfully parsed, but it may not be a valid
|
| @@ -279,8 +313,10 @@ void GetLocationFromResponse(bool http_post_result,
|
| if (!position->Validate()) {
|
| FormatPositionError(server_url,
|
| "Did not provide a good position fix", position);
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_INVALID_FIX);
|
| return;
|
| }
|
| + RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_SUCCESS);
|
| }
|
|
|
| // Numeric values without a decimal point have type integer and IsDouble() will
|
|
|