Index: components/cronet/android/cronet_url_request_adapter.cc |
diff --git a/components/cronet/android/cronet_url_request_adapter.cc b/components/cronet/android/cronet_url_request_adapter.cc |
index 6e79bb5d431f7f296ae374228bbe1d7bfa25fb02..0ef0415210e6438cb3ba7e7d5f82375b9b31fbf8 100644 |
--- a/components/cronet/android/cronet_url_request_adapter.cc |
+++ b/components/cronet/android/cronet_url_request_adapter.cc |
@@ -33,6 +33,22 @@ using base::android::JavaParamRef; |
namespace cronet { |
+namespace { |
+ |
+// Converts timing metrics stored as TimeTicks into the format expected by the |
+// Java layer: ms since Unix epoch, or -1 for null |
+int64_t ConvertTime(const base::TimeTicks& ticks, |
+ const base::TimeTicks& start_ticks, |
+ const base::Time& start_time) { |
+ if (ticks.is_null() || start_ticks.is_null()) { |
+ return -1; |
+ } |
+ DCHECK(!start_time.is_null()); |
+ return (start_time + (ticks - start_ticks)).ToJavaTime(); |
+} |
+ |
+} // namespace |
+ |
// Explicitly register static JNI functions. |
bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env) { |
return RegisterNativesImpl(env); |
@@ -44,7 +60,8 @@ static jlong CreateRequestAdapter(JNIEnv* env, |
const JavaParamRef<jstring>& jurl_string, |
jint jpriority, |
jboolean jdisable_cache, |
- jboolean jdisable_connection_migration) { |
+ jboolean jdisable_connection_migration, |
+ jboolean jenable_metrics) { |
CronetURLRequestContextAdapter* context_adapter = |
reinterpret_cast<CronetURLRequestContextAdapter*>( |
jurl_request_context_adapter); |
@@ -58,7 +75,7 @@ static jlong CreateRequestAdapter(JNIEnv* env, |
CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter( |
context_adapter, env, jurl_request, url, |
static_cast<net::RequestPriority>(jpriority), jdisable_cache, |
- jdisable_connection_migration); |
+ jdisable_connection_migration, jenable_metrics); |
return reinterpret_cast<jlong>(adapter); |
} |
@@ -70,12 +87,14 @@ CronetURLRequestAdapter::CronetURLRequestAdapter( |
const GURL& url, |
net::RequestPriority priority, |
jboolean jdisable_cache, |
- jboolean jdisable_connection_migration) |
+ jboolean jdisable_connection_migration, |
+ jboolean jenable_metrics) |
: context_(context), |
initial_url_(url), |
initial_priority_(priority), |
initial_method_("GET"), |
- load_flags_(context->default_load_flags()) { |
+ load_flags_(context->default_load_flags()), |
+ enable_metrics_(jenable_metrics == JNI_TRUE) { |
DCHECK(!context_->IsOnNetworkThread()); |
owner_.Reset(env, jurl_request); |
if (jdisable_cache == JNI_TRUE) |
@@ -362,15 +381,16 @@ void CronetURLRequestAdapter::ReadDataOnNetworkThread( |
void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) { |
DCHECK(context_->IsOnNetworkThread()); |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
if (send_on_canceled) { |
- JNIEnv* env = base::android::AttachCurrentThread(); |
cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj()); |
} |
+ MaybeReportMetrics(env); |
delete this; |
} |
void CronetURLRequestAdapter::ReportError(net::URLRequest* request, |
- int net_error) const { |
+ int net_error) { |
DCHECK_NE(net::ERR_IO_PENDING, net_error); |
DCHECK_LT(net_error, 0); |
DCHECK_EQ(request, url_request_.get()); |
@@ -387,6 +407,33 @@ void CronetURLRequestAdapter::ReportError(net::URLRequest* request, |
request->GetTotalReceivedBytes()); |
} |
+void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) const { |
+ if (!enable_metrics_) { |
+ return; |
+ } |
+ net::LoadTimingInfo metrics; |
+ url_request_->GetLoadTimingInfo(&metrics); |
+ base::Time start_time = metrics.request_start_time; |
+ base::TimeTicks start_ticks = metrics.request_start; |
+ Java_CronetUrlRequest_onMetricsCollected( |
+ env, owner_.obj(), ConvertTime(start_ticks, start_ticks, start_time), |
+ ConvertTime(metrics.connect_timing.dns_start, start_ticks, start_time), |
+ ConvertTime(metrics.connect_timing.dns_end, start_ticks, start_time), |
+ ConvertTime(metrics.connect_timing.connect_start, start_ticks, |
+ start_time), |
+ ConvertTime(metrics.connect_timing.connect_end, start_ticks, start_time), |
+ ConvertTime(metrics.connect_timing.ssl_start, start_ticks, start_time), |
+ ConvertTime(metrics.connect_timing.ssl_end, start_ticks, start_time), |
+ ConvertTime(metrics.send_start, start_ticks, start_time), |
+ ConvertTime(metrics.send_end, start_ticks, start_time), |
+ ConvertTime(metrics.push_start, start_ticks, start_time), |
+ ConvertTime(metrics.push_end, start_ticks, start_time), |
+ ConvertTime(metrics.receive_headers_end, start_ticks, start_time), |
+ ConvertTime(base::TimeTicks::Now(), start_ticks, start_time), |
+ // TODO(mgersh): report total bytes sent |
+ metrics.socket_reused, 0, url_request_->GetTotalReceivedBytes()); |
+} |
+ |
net::URLRequest* CronetURLRequestAdapter::GetURLRequestForTesting() { |
return url_request_.get(); |
} |