Index: components/cronet/android/cronet_bidirectional_stream_adapter.cc |
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.cc b/components/cronet/android/cronet_bidirectional_stream_adapter.cc |
index d4a75edb86f1400e947ae2b7ea772136a500d04c..114520096ab6321c1e55d0ff606150d5ae0aab4c 100644 |
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.cc |
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.cc |
@@ -49,6 +49,15 @@ size_t SafeGetArrayLength(JNIEnv* env, JavaArrayType jarray) { |
return static_cast<size_t>(std::max(0, length)); |
} |
+int64_t ConvertTime(base::TimeTicks ticks, |
+ base::Time start_time, |
+ base::TimeTicks start_ticks) { |
+ if (ticks.is_null()) { |
+ return -1; |
+ } |
+ return (start_time + (ticks - start_ticks)).ToJavaTime(); |
+} |
+ |
} // namespace |
PendingWriteData::PendingWriteData(JNIEnv* env, |
@@ -73,7 +82,8 @@ static jlong CreateBidirectionalStream( |
JNIEnv* env, |
const base::android::JavaParamRef<jobject>& jbidi_stream, |
jlong jurl_request_context_adapter, |
- jboolean jsend_request_headers_automatically) { |
+ jboolean jsend_request_headers_automatically, |
+ jboolean jenable_metrics) { |
CronetURLRequestContextAdapter* context_adapter = |
reinterpret_cast<CronetURLRequestContextAdapter*>( |
jurl_request_context_adapter); |
@@ -81,7 +91,8 @@ static jlong CreateBidirectionalStream( |
CronetBidirectionalStreamAdapter* adapter = |
new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, |
- jsend_request_headers_automatically); |
+ jsend_request_headers_automatically, |
+ jenable_metrics); |
return reinterpret_cast<jlong>(adapter); |
} |
@@ -95,10 +106,12 @@ CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( |
CronetURLRequestContextAdapter* context, |
JNIEnv* env, |
const base::android::JavaParamRef<jobject>& jbidi_stream, |
- bool send_request_headers_automatically) |
+ bool send_request_headers_automatically, |
+ bool enable_metrics) |
: context_(context), |
owner_(env, jbidi_stream), |
send_request_headers_automatically_(send_request_headers_automatically), |
+ enable_metrics_(enable_metrics), |
stream_failed_(false) {} |
CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { |
@@ -411,6 +424,7 @@ void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( |
JNIEnv* env = base::android::AttachCurrentThread(); |
cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); |
} |
+ MaybeReportMetrics(); |
delete this; |
} |
@@ -428,4 +442,40 @@ CronetBidirectionalStreamAdapter::GetHeadersArray( |
return base::android::ToJavaArrayOfStrings(env, headers); |
} |
+void CronetBidirectionalStreamAdapter::MaybeReportMetrics() { |
+ if (!enable_metrics_) |
+ return; |
+ |
+ if (!bidi_stream_) |
+ return; |
+ net::LoadTimingInfo load_timing_info; |
+ bidi_stream_->GetLoadTimingInfo(&load_timing_info); |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ base::Time start_time = load_timing_info.request_start_time; |
+ base::TimeTicks start_ticks = load_timing_info.request_start; |
+ cronet::Java_CronetBidirectionalStream_onMetricsCollected( |
+ env, owner_.obj(), start_time.ToJavaTime(), |
+ ConvertTime(load_timing_info.connect_timing.dns_start, start_time, |
+ start_ticks), |
+ ConvertTime(load_timing_info.connect_timing.dns_end, start_time, |
+ start_ticks), |
+ ConvertTime(load_timing_info.connect_timing.connect_start, start_time, |
+ start_ticks), |
+ ConvertTime(load_timing_info.connect_timing.connect_end, start_time, |
+ start_ticks), |
+ ConvertTime(load_timing_info.connect_timing.ssl_start, start_time, |
+ start_ticks), |
+ ConvertTime(load_timing_info.connect_timing.ssl_end, start_time, |
+ start_ticks), |
+ ConvertTime(load_timing_info.send_start, start_time, start_ticks), |
+ ConvertTime(load_timing_info.send_end, start_time, start_ticks), |
+ ConvertTime(load_timing_info.push_start, start_time, start_ticks), |
+ ConvertTime(load_timing_info.push_end, start_time, start_ticks), |
+ ConvertTime(load_timing_info.receive_headers_end, start_time, |
+ start_ticks), |
+ ConvertTime(base::TimeTicks::Now(), start_time, start_ticks), |
+ load_timing_info.socket_reused, bidi_stream_->GetTotalSentBytes(), |
+ bidi_stream_->GetTotalReceivedBytes()); |
+} |
+ |
} // namespace cronet |