Index: components/cronet/android/test/mock_url_request_job_factory.cc |
diff --git a/components/cronet/android/test/mock_url_request_job_factory.cc b/components/cronet/android/test/mock_url_request_job_factory.cc |
index 092df0ae1fd64c8633cf355bab57a6f7ed81d1c0..1fa0eb48e0dae2de8fc53b8a6986fe7aa6a2a473 100644 |
--- a/components/cronet/android/test/mock_url_request_job_factory.cc |
+++ b/components/cronet/android/test/mock_url_request_job_factory.cc |
@@ -6,11 +6,15 @@ |
#include "base/android/jni_android.h" |
#include "base/android/jni_string.h" |
+#include "base/memory/ptr_util.h" |
#include "jni/MockUrlRequestJobFactory_jni.h" |
#include "net/test/url_request/ssl_certificate_error_job.h" |
#include "net/test/url_request/url_request_failed_job.h" |
#include "net/test/url_request/url_request_hanging_read_job.h" |
#include "net/test/url_request/url_request_mock_data_job.h" |
+#include "net/url_request/url_request_context.h" |
+#include "net/url_request/url_request_filter.h" |
+#include "net/url_request/url_request_intercepting_job_factory.h" |
#include "url/gurl.h" |
using base::android::JavaParamRef; |
@@ -18,6 +22,12 @@ using base::android::ScopedJavaLocalRef; |
namespace cronet { |
+// URLRequestJobFactory previously used in URLRequestContext. |
+static const net::URLRequestJobFactory* old_job_factory; |
+// URLRequestJobFactory inserted during tests to intercept URLRequests with |
+// libcronet's URLRequestFilter. |
+static std::unique_ptr<net::URLRequestJobFactory> new_job_factory; |
+ |
void AddUrlInterceptors(JNIEnv* env, const JavaParamRef<jclass>& jcaller) { |
net::URLRequestMockDataJob::AddUrlHandler(); |
net::URLRequestFailedJob::AddUrlHandler(); |
@@ -25,6 +35,33 @@ void AddUrlInterceptors(JNIEnv* env, const JavaParamRef<jclass>& jcaller) { |
net::SSLCertificateErrorJob::AddUrlHandler(); |
} |
+// URL interceptors are registered with the URLRequestFilter in |
+// libcronet_tests.so. However tests are run on libcronet.so. Use the |
+// URLRequestFilter in libcronet_tests.so with the URLRequestContext in |
+// libcronet.so by installing a URLRequestInterceptingJobFactory |
+// that calls into libcronet_tests.so's URLRequestFilter. |
+void AddUrlInterceptorJobFactory(JNIEnv* env, |
+ const JavaParamRef<jclass>& jcaller, |
+ jlong jrequestContext) { |
+ // Intercept |request_context| job creation using URLRequestFilter |
+ net::URLRequestContext* request_context = |
+ reinterpret_cast<net::URLRequestContext*>(jrequestContext); |
+ old_job_factory = request_context->job_factory(); |
+ new_job_factory.reset(new net::URLRequestInterceptingJobFactory( |
+ const_cast<net::URLRequestJobFactory*>(old_job_factory), |
+ net::URLRequestFilter::GetInstance())); |
+ request_context->set_job_factory(new_job_factory.get()); |
+} |
+ |
+// Put back the old URLRequestJobFactory into the URLRequestContext. |
+void RemoveUrlInterceptorJobFactory(JNIEnv* env, |
+ const JavaParamRef<jclass>& jcaller, |
+ jlong jrequestContext) { |
+ reinterpret_cast<net::URLRequestContext*>(jrequestContext) |
+ ->set_job_factory(old_job_factory); |
+ new_job_factory.reset(); |
+} |
+ |
ScopedJavaLocalRef<jstring> GetMockUrlWithFailure( |
JNIEnv* jenv, |
const JavaParamRef<jclass>& jcaller, |