Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Unified Diff: components/cronet/android/cronet_url_request_adapter.cc

Issue 2844803002: [Cronet] Make metrics reporting happen after terminal callbacks. (Closed)
Patch Set: remove an invalid comment Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 19437d59c9ec815557188fb4efbfe765550ad5ec..d80c1e90904f76d120288f279a60488642253ea2 100644
--- a/components/cronet/android/cronet_url_request_adapter.cc
+++ b/components/cronet/android/cronet_url_request_adapter.cc
@@ -92,7 +92,8 @@ CronetURLRequestAdapter::CronetURLRequestAdapter(
initial_priority_(priority),
initial_method_("GET"),
load_flags_(context->default_load_flags()),
- enable_metrics_(jenable_metrics == JNI_TRUE) {
+ enable_metrics_(jenable_metrics == JNI_TRUE),
+ weak_ptr_factory_(this) {
DCHECK(!context_->IsOnNetworkThread());
owner_.Reset(env, jurl_request);
if (jdisable_cache == JNI_TRUE)
@@ -146,18 +147,19 @@ void CronetURLRequestAdapter::Start(JNIEnv* env,
DCHECK(!context_->IsOnNetworkThread());
context_->PostTaskToNetworkThread(
FROM_HERE, base::Bind(&CronetURLRequestAdapter::StartOnNetworkThread,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
void CronetURLRequestAdapter::GetStatus(
JNIEnv* env,
const JavaParamRef<jobject>& jcaller,
- const JavaParamRef<jobject>& jstatus_listener) const {
+ const JavaParamRef<jobject>& jstatus_listener) {
base::android::ScopedJavaGlobalRef<jobject> status_listener_ref;
status_listener_ref.Reset(env, jstatus_listener);
context_->PostTaskToNetworkThread(
- FROM_HERE, base::Bind(&CronetURLRequestAdapter::GetStatusOnNetworkThread,
- base::Unretained(this), status_listener_ref));
+ FROM_HERE,
+ base::Bind(&CronetURLRequestAdapter::GetStatusOnNetworkThread,
+ weak_ptr_factory_.GetWeakPtr(), status_listener_ref));
}
void CronetURLRequestAdapter::FollowDeferredRedirect(
@@ -167,7 +169,7 @@ void CronetURLRequestAdapter::FollowDeferredRedirect(
FROM_HERE,
base::Bind(
&CronetURLRequestAdapter::FollowDeferredRedirectOnNetworkThread,
- base::Unretained(this)));
+ weak_ptr_factory_.GetWeakPtr()));
}
jboolean CronetURLRequestAdapter::ReadData(
@@ -189,23 +191,23 @@ jboolean CronetURLRequestAdapter::ReadData(
context_->PostTaskToNetworkThread(
FROM_HERE, base::Bind(&CronetURLRequestAdapter::ReadDataOnNetworkThread,
- base::Unretained(this),
- read_buffer,
+ weak_ptr_factory_.GetWeakPtr(), read_buffer,
remaining_capacity));
return JNI_TRUE;
}
void CronetURLRequestAdapter::Destroy(JNIEnv* env,
- const JavaParamRef<jobject>& jcaller,
- jboolean jsend_on_canceled) {
- // Destroy could be called from any thread, including network thread (if
- // posting task to executor throws an exception), but is posted, so |this|
- // is valid until calling task is complete. Destroy() is always called from
- // within a synchronized java block that guarantees no future posts to the
- // network thread with the adapter pointer.
+ const JavaParamRef<jobject>& jcaller) {
context_->PostTaskToNetworkThread(
FROM_HERE, base::Bind(&CronetURLRequestAdapter::DestroyOnNetworkThread,
- base::Unretained(this), jsend_on_canceled));
+ weak_ptr_factory_.GetWeakPtr()));
+}
+
+void CronetURLRequestAdapter::Cancel(JNIEnv* env,
+ const JavaParamRef<jobject>& jcaller) {
+ context_->PostTaskToNetworkThread(
+ FROM_HERE, base::Bind(&CronetURLRequestAdapter::CancelOnNetworkThread,
mef 2017/04/27 21:33:13 Hrm, from comment on WeakPtrFactory: // Note that
xunjieli 2017/04/28 13:36:47 Ah, thanks, You are right! I missed this. I tried
+ weak_ptr_factory_.GetWeakPtr()));
}
void CronetURLRequestAdapter::OnReceivedRedirect(
@@ -245,12 +247,7 @@ void CronetURLRequestAdapter::OnSSLCertificateError(
DCHECK(context_->IsOnNetworkThread());
request->Cancel();
int net_error = net::MapCertStatusToNetError(ssl_info.cert_status);
- JNIEnv* env = base::android::AttachCurrentThread();
- cronet::Java_CronetUrlRequest_onError(
- env, owner_.obj(), NetErrorToUrlRequestError(net_error), net_error,
- net::QUIC_NO_ERROR,
- ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
- request->GetTotalReceivedBytes());
+ ReportError(request, net_error);
mef 2017/04/27 21:33:13 nice!
}
void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request,
@@ -286,8 +283,9 @@ void CronetURLRequestAdapter::OnReadCompleted(net::URLRequest* request,
if (bytes_read == 0) {
JNIEnv* env = base::android::AttachCurrentThread();
- cronet::Java_CronetUrlRequest_onSucceeded(
- env, owner_.obj(), url_request_->GetTotalReceivedBytes());
+ cronet::Java_CronetUrlRequest_onSucceeded(env, owner_.obj(),
+ request->GetTotalReceivedBytes());
+ DestroyOnNetworkThread();
} else {
JNIEnv* env = base::android::AttachCurrentThread();
cronet::Java_CronetUrlRequest_onReadCompleted(
@@ -373,16 +371,20 @@ void CronetURLRequestAdapter::ReadDataOnNetworkThread(
OnReadCompleted(url_request_.get(), result);
}
-void CronetURLRequestAdapter::DestroyOnNetworkThread(bool send_on_canceled) {
+void CronetURLRequestAdapter::DestroyOnNetworkThread() {
DCHECK(context_->IsOnNetworkThread());
JNIEnv* env = base::android::AttachCurrentThread();
- if (send_on_canceled) {
- cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj());
- }
+ cronet::Java_CronetUrlRequest_onDestroyed(env, owner_.obj());
MaybeReportMetrics(env);
delete this;
}
+void CronetURLRequestAdapter::CancelOnNetworkThread() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ cronet::Java_CronetUrlRequest_onCanceled(env, owner_.obj());
+ DestroyOnNetworkThread();
+}
+
void CronetURLRequestAdapter::ReportError(net::URLRequest* request,
int net_error) {
DCHECK_NE(net::ERR_IO_PENDING, net_error);
@@ -399,6 +401,7 @@ void CronetURLRequestAdapter::ReportError(net::URLRequest* request,
net_error_details.quic_connection_error,
ConvertUTF8ToJavaString(env, net::ErrorToString(net_error)).obj(),
request->GetTotalReceivedBytes());
+ DestroyOnNetworkThread();
}
void CronetURLRequestAdapter::MaybeReportMetrics(JNIEnv* env) const {

Powered by Google App Engine
This is Rietveld 408576698