| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/data_use_measurement/content/data_use_measurement.h" | 5 #include "components/data_use_measurement/core/data_use_measurement.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
| 8 #include "base/metrics/sparse_histogram.h" | 8 #include "base/metrics/sparse_histogram.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
| 11 #include "components/data_use_measurement/core/data_use_user_data.h" | 11 #include "components/data_use_measurement/core/data_use_user_data.h" |
| 12 #include "content/public/browser/resource_request_info.h" | 12 #include "components/data_use_measurement/core/url_request_classifier.h" |
| 13 #include "net/base/network_change_notifier.h" | 13 #include "net/base/network_change_notifier.h" |
| 14 #include "net/base/upload_data_stream.h" | 14 #include "net/base/upload_data_stream.h" |
| 15 #include "net/http/http_response_headers.h" | 15 #include "net/http/http_response_headers.h" |
| 16 #include "net/url_request/url_request.h" | 16 #include "net/url_request/url_request.h" |
| 17 | 17 |
| 18 #if defined(OS_ANDROID) | 18 #if defined(OS_ANDROID) |
| 19 #include "net/android/traffic_stats.h" | 19 #include "net/android/traffic_stats.h" |
| 20 #endif | 20 #endif |
| 21 | 21 |
| 22 namespace data_use_measurement { | 22 namespace data_use_measurement { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 base::TimeDelta::FromHours(1), // Maximum sample | 57 base::TimeDelta::FromHours(1), // Maximum sample |
| 58 50, // Bucket count. | 58 50, // Bucket count. |
| 59 base::HistogramBase::kUmaTargetedHistogramFlag); | 59 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 60 histogram_pointer->AddCount(latency.InMilliseconds(), count); | 60 histogram_pointer->AddCount(latency.InMilliseconds(), count); |
| 61 } | 61 } |
| 62 #endif | 62 #endif |
| 63 | 63 |
| 64 } // namespace | 64 } // namespace |
| 65 | 65 |
| 66 DataUseMeasurement::DataUseMeasurement( | 66 DataUseMeasurement::DataUseMeasurement( |
| 67 std::unique_ptr<URLRequestClassifier> url_request_classifier, |
| 67 const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder) | 68 const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder) |
| 68 : metrics_data_use_forwarder_(metrics_data_use_forwarder) | 69 : url_request_classifier_(std::move(url_request_classifier)), |
| 70 metrics_data_use_forwarder_(metrics_data_use_forwarder) |
| 69 #if defined(OS_ANDROID) | 71 #if defined(OS_ANDROID) |
| 70 , | 72 , |
| 71 app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), | 73 app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), |
| 72 app_listener_(new base::android::ApplicationStatusListener( | 74 app_listener_(new base::android::ApplicationStatusListener( |
| 73 base::Bind(&DataUseMeasurement::OnApplicationStateChange, | 75 base::Bind(&DataUseMeasurement::OnApplicationStateChange, |
| 74 base::Unretained(this)))), | 76 base::Unretained(this)))), |
| 75 rx_bytes_os_(0), | 77 rx_bytes_os_(0), |
| 76 tx_bytes_os_(0), | 78 tx_bytes_os_(0), |
| 77 bytes_transferred_since_last_traffic_stats_query_(0), | 79 bytes_transferred_since_last_traffic_stats_query_(0), |
| 78 no_reads_since_background_(false) | 80 no_reads_since_background_(false) |
| 79 #endif | 81 #endif |
| 80 { | 82 { |
| 83 DCHECK(url_request_classifier_); |
| 81 } | 84 } |
| 82 | 85 |
| 83 DataUseMeasurement::~DataUseMeasurement(){}; | 86 DataUseMeasurement::~DataUseMeasurement(){}; |
| 84 | 87 |
| 85 void DataUseMeasurement::OnBeforeURLRequest(net::URLRequest* request) { | 88 void DataUseMeasurement::OnBeforeURLRequest(net::URLRequest* request) { |
| 86 DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>( | 89 DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>( |
| 87 request->GetUserData(DataUseUserData::kUserDataKey)); | 90 request->GetUserData(DataUseUserData::kUserDataKey)); |
| 88 if (!data_use_user_data) { | 91 if (!data_use_user_data) { |
| 89 data_use_user_data = new DataUseUserData( | 92 data_use_user_data = new DataUseUserData( |
| 90 DataUseUserData::ServiceName::NOT_TAGGED, CurrentAppState()); | 93 DataUseUserData::ServiceName::NOT_TAGGED, CurrentAppState()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 // of redirected requests. | 126 // of redirected requests. |
| 124 UpdateDataUsePrefs(request); | 127 UpdateDataUsePrefs(request); |
| 125 #if defined(OS_ANDROID) | 128 #if defined(OS_ANDROID) |
| 126 MaybeRecordNetworkBytesOS(); | 129 MaybeRecordNetworkBytesOS(); |
| 127 #endif | 130 #endif |
| 128 } | 131 } |
| 129 | 132 |
| 130 void DataUseMeasurement::ReportDataUseUMA(const net::URLRequest& request, | 133 void DataUseMeasurement::ReportDataUseUMA(const net::URLRequest& request, |
| 131 TrafficDirection dir, | 134 TrafficDirection dir, |
| 132 int64_t bytes) { | 135 int64_t bytes) { |
| 133 bool is_user_traffic = IsUserInitiatedRequest(request); | 136 bool is_user_traffic = |
| 137 url_request_classifier_->IsUserInitiatedRequest(request); |
| 134 bool is_connection_cellular = | 138 bool is_connection_cellular = |
| 135 net::NetworkChangeNotifier::IsConnectionCellular( | 139 net::NetworkChangeNotifier::IsConnectionCellular( |
| 136 net::NetworkChangeNotifier::GetConnectionType()); | 140 net::NetworkChangeNotifier::GetConnectionType()); |
| 137 | 141 |
| 138 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>( | 142 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>( |
| 139 request.GetUserData(DataUseUserData::kUserDataKey)); | 143 request.GetUserData(DataUseUserData::kUserDataKey)); |
| 140 DataUseUserData::ServiceName service_name = DataUseUserData::NOT_TAGGED; | 144 DataUseUserData::ServiceName service_name = DataUseUserData::NOT_TAGGED; |
| 141 DataUseUserData::AppState old_app_state = DataUseUserData::FOREGROUND; | 145 DataUseUserData::AppState old_app_state = DataUseUserData::FOREGROUND; |
| 142 DataUseUserData::AppState new_app_state = DataUseUserData::UNKNOWN; | 146 DataUseUserData::AppState new_app_state = DataUseUserData::UNKNOWN; |
| 143 | 147 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 | 200 |
| 197 // Update data use prefs for cellular connections. | 201 // Update data use prefs for cellular connections. |
| 198 if (!metrics_data_use_forwarder_.is_null()) { | 202 if (!metrics_data_use_forwarder_.is_null()) { |
| 199 metrics_data_use_forwarder_.Run( | 203 metrics_data_use_forwarder_.Run( |
| 200 DataUseUserData::GetServiceNameAsString(service_name), | 204 DataUseUserData::GetServiceNameAsString(service_name), |
| 201 request.GetTotalSentBytes() + request.GetTotalReceivedBytes(), | 205 request.GetTotalSentBytes() + request.GetTotalReceivedBytes(), |
| 202 is_connection_cellular); | 206 is_connection_cellular); |
| 203 } | 207 } |
| 204 } | 208 } |
| 205 | 209 |
| 206 // static | |
| 207 bool DataUseMeasurement::IsUserInitiatedRequest( | |
| 208 const net::URLRequest& request) { | |
| 209 // Having ResourceRequestInfo in the URL request is a sign that the request is | |
| 210 // for a web content from user. For now we could add a condition to check | |
| 211 // ProcessType in info is content::PROCESS_TYPE_RENDERER, but it won't be | |
| 212 // compatible with upcoming PlzNavigate architecture. So just existence of | |
| 213 // ResourceRequestInfo is verified, and the current check should be compatible | |
| 214 // with upcoming changes in PlzNavigate. | |
| 215 // TODO(rajendrant): Verify this condition for different use cases. See | |
| 216 // crbug.com/626063. | |
| 217 return content::ResourceRequestInfo::ForRequest(&request) != nullptr; | |
| 218 } | |
| 219 | |
| 220 #if defined(OS_ANDROID) | 210 #if defined(OS_ANDROID) |
| 221 void DataUseMeasurement::OnApplicationStateChangeForTesting( | 211 void DataUseMeasurement::OnApplicationStateChangeForTesting( |
| 222 base::android::ApplicationState application_state) { | 212 base::android::ApplicationState application_state) { |
| 223 OnApplicationStateChange(application_state); | 213 OnApplicationStateChange(application_state); |
| 224 } | 214 } |
| 225 #endif | 215 #endif |
| 226 | 216 |
| 227 DataUseUserData::AppState DataUseMeasurement::CurrentAppState() const { | 217 DataUseUserData::AppState DataUseMeasurement::CurrentAppState() const { |
| 228 #if defined(OS_ANDROID) | 218 #if defined(OS_ANDROID) |
| 229 if (app_state_ != base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) | 219 if (app_state_ != base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 message_size); | 294 message_size); |
| 305 if (message_size > 0) { | 295 if (message_size > 0) { |
| 306 IncreaseSparseHistogramByValue( | 296 IncreaseSparseHistogramByValue( |
| 307 GetHistogramName("DataUse.MessageSize.AllServices", dir, app_state, | 297 GetHistogramName("DataUse.MessageSize.AllServices", dir, app_state, |
| 308 is_connection_cellular), | 298 is_connection_cellular), |
| 309 service, message_size); | 299 service, message_size); |
| 310 } | 300 } |
| 311 } | 301 } |
| 312 | 302 |
| 313 } // namespace data_use_measurement | 303 } // namespace data_use_measurement |
| OLD | NEW |