| 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
|
|
|