| Index: components/data_use_measurement/content/data_use_measurement.cc
|
| diff --git a/components/data_use_measurement/content/data_use_measurement.cc b/components/data_use_measurement/content/data_use_measurement.cc
|
| index a1f257f85e671faa3c25720c32d1cc9ef5663292..849db0d822683bff83c1c572dec6530a280b90ff 100644
|
| --- a/components/data_use_measurement/content/data_use_measurement.cc
|
| +++ b/components/data_use_measurement/content/data_use_measurement.cc
|
| @@ -80,12 +80,14 @@ void DataUseMeasurement::OnBeforeURLRequest(net::URLRequest* request) {
|
| void DataUseMeasurement::OnBeforeRedirect(const net::URLRequest& request,
|
| const GURL& new_location) {
|
| // Recording data use of request on redirects.
|
| - ReportDataUseUMA(request);
|
| + // TODO(rajendrant): May not be needed when http://crbug/651957 is fixed.
|
| + UpdateDataUsePrefs(request);
|
| }
|
|
|
| void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request,
|
| int64_t bytes_received) {
|
| UMA_HISTOGRAM_COUNTS("DataUse.BytesReceived.Delegate", bytes_received);
|
| + ReportDataUseUMA(request, DOWNSTREAM, bytes_received);
|
| #if defined(OS_ANDROID)
|
| bytes_transferred_since_last_traffic_stats_query_ += bytes_received;
|
| #endif
|
| @@ -94,6 +96,7 @@ void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request,
|
| void DataUseMeasurement::OnNetworkBytesSent(const net::URLRequest& request,
|
| int64_t bytes_sent) {
|
| UMA_HISTOGRAM_COUNTS("DataUse.BytesSent.Delegate", bytes_sent);
|
| + ReportDataUseUMA(request, UPSTREAM, bytes_sent);
|
| #if defined(OS_ANDROID)
|
| bytes_transferred_since_last_traffic_stats_query_ += bytes_sent;
|
| #endif
|
| @@ -103,61 +106,67 @@ void DataUseMeasurement::OnCompleted(const net::URLRequest& request,
|
| bool started) {
|
| // TODO(amohammadkhan): Verify that there is no double recording in data use
|
| // of redirected requests.
|
| - ReportDataUseUMA(request);
|
| + UpdateDataUsePrefs(request);
|
| #if defined(OS_ANDROID)
|
| MaybeRecordNetworkBytesOS();
|
| #endif
|
| }
|
|
|
| void DataUseMeasurement::ReportDataUseUMA(
|
| - const net::URLRequest& request) const {
|
| - // Counts rely on URLRequest::GetTotalReceivedBytes() and
|
| - // URLRequest::GetTotalSentBytes(), which does not include the send path,
|
| - // network layer overhead, TLS overhead, and DNS.
|
| - // TODO(amohammadkhan): Make these measured bytes more in line with number of
|
| - // bytes in lower levels.
|
| - int64_t total_upload_bytes = request.GetTotalSentBytes();
|
| - int64_t total_received_bytes = request.GetTotalReceivedBytes();
|
| + const net::URLRequest& request,
|
| + TrafficDirection dir,
|
| + int64_t bytes) const {
|
| bool is_user_traffic = IsUserInitiatedRequest(request);
|
| -
|
| bool is_connection_cellular =
|
| net::NetworkChangeNotifier::IsConnectionCellular(
|
| net::NetworkChangeNotifier::GetConnectionType());
|
|
|
| - DataUseUserData* attached_service_data = reinterpret_cast<DataUseUserData*>(
|
| + DataUseUserData* attached_service_data = static_cast<DataUseUserData*>(
|
| request.GetUserData(DataUseUserData::kUserDataKey));
|
| - DataUseUserData::ServiceName service_name =
|
| - attached_service_data ? attached_service_data->service_name()
|
| - : DataUseUserData::NOT_TAGGED;
|
| - bool started_in_foreground =
|
| - attached_service_data
|
| - ? attached_service_data->app_state() == DataUseUserData::FOREGROUND
|
| - : CurrentAppState() == DataUseUserData::FOREGROUND;
|
| + DataUseUserData::ServiceName service_name = DataUseUserData::NOT_TAGGED;
|
| + DataUseUserData::AppState old_app_state = DataUseUserData::FOREGROUND;
|
| + DataUseUserData::AppState new_app_state = DataUseUserData::UNKNOWN;
|
| +
|
| + if (attached_service_data) {
|
| + service_name = attached_service_data->service_name();
|
| + old_app_state = attached_service_data->app_state();
|
| + }
|
| + if (old_app_state == CurrentAppState())
|
| + new_app_state = old_app_state;
|
| +
|
| + if (attached_service_data && old_app_state != new_app_state)
|
| + attached_service_data->set_app_state(CurrentAppState());
|
|
|
| RecordUMAHistogramCount(
|
| GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User"
|
| : "DataUse.TrafficSize.System",
|
| - UPSTREAM, started_in_foreground, is_connection_cellular),
|
| - total_upload_bytes);
|
| - RecordUMAHistogramCount(
|
| - GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User"
|
| - : "DataUse.TrafficSize.System",
|
| - DOWNSTREAM, started_in_foreground,
|
| - is_connection_cellular),
|
| - total_received_bytes);
|
| + dir, new_app_state, is_connection_cellular),
|
| + bytes);
|
|
|
| if (!is_user_traffic) {
|
| - ReportDataUsageServices(service_name, UPSTREAM, started_in_foreground,
|
| - is_connection_cellular, total_upload_bytes);
|
| - ReportDataUsageServices(service_name, DOWNSTREAM, started_in_foreground,
|
| - is_connection_cellular, total_received_bytes);
|
| + ReportDataUsageServices(service_name, dir, new_app_state,
|
| + is_connection_cellular, bytes);
|
| }
|
| +}
|
| +
|
| +void DataUseMeasurement::UpdateDataUsePrefs(
|
| + const net::URLRequest& request) const {
|
| + bool is_connection_cellular =
|
| + net::NetworkChangeNotifier::IsConnectionCellular(
|
| + net::NetworkChangeNotifier::GetConnectionType());
|
| +
|
| + DataUseUserData* attached_service_data = static_cast<DataUseUserData*>(
|
| + request.GetUserData(DataUseUserData::kUserDataKey));
|
| + DataUseUserData::ServiceName service_name =
|
| + attached_service_data ? attached_service_data->service_name()
|
| + : DataUseUserData::NOT_TAGGED;
|
|
|
| // Update data use prefs for cellular connections.
|
| if (!metrics_data_use_forwarder_.is_null()) {
|
| metrics_data_use_forwarder_.Run(
|
| - attached_service_data->GetServiceNameAsString(service_name),
|
| - total_upload_bytes + total_received_bytes, is_connection_cellular);
|
| + DataUseUserData::GetServiceNameAsString(service_name),
|
| + request.GetTotalSentBytes() + request.GetTotalReceivedBytes(),
|
| + is_connection_cellular);
|
| }
|
| }
|
|
|
| @@ -194,11 +203,14 @@ DataUseUserData::AppState DataUseMeasurement::CurrentAppState() const {
|
| std::string DataUseMeasurement::GetHistogramName(
|
| const char* prefix,
|
| TrafficDirection dir,
|
| - bool started_in_foreground,
|
| + DataUseUserData::AppState app_state,
|
| bool is_connection_cellular) const {
|
| return base::StringPrintf(
|
| "%s.%s.%s.%s", prefix, dir == UPSTREAM ? "Upstream" : "Downstream",
|
| - started_in_foreground ? "Foreground" : "Background",
|
| + app_state == DataUseUserData::UNKNOWN
|
| + ? "Unknown"
|
| + : (app_state == DataUseUserData::FOREGROUND ? "Foreground"
|
| + : "Background"),
|
| is_connection_cellular ? "Cellular" : "NotCellular");
|
| }
|
|
|
| @@ -246,7 +258,7 @@ void DataUseMeasurement::MaybeRecordNetworkBytesOS() {
|
| void DataUseMeasurement::ReportDataUsageServices(
|
| DataUseUserData::ServiceName service,
|
| TrafficDirection dir,
|
| - bool started_in_foreground,
|
| + DataUseUserData::AppState app_state,
|
| bool is_connection_cellular,
|
| int64_t message_size) const {
|
| RecordUMAHistogramCount(
|
| @@ -254,8 +266,8 @@ void DataUseMeasurement::ReportDataUsageServices(
|
| message_size);
|
| if (message_size > 0) {
|
| IncreaseSparseHistogramByValue(
|
| - GetHistogramName("DataUse.MessageSize.AllServices", dir,
|
| - started_in_foreground, is_connection_cellular),
|
| + GetHistogramName("DataUse.MessageSize.AllServices", dir, app_state,
|
| + is_connection_cellular),
|
| service, message_size);
|
| }
|
| }
|
|
|