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

Unified Diff: android_webview/native/aw_contents_io_thread_client_impl.cc

Issue 1350553005: [Android WebView] Call shouldInterceptRequest on a background thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Final version? Created 5 years, 3 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: android_webview/native/aw_contents_io_thread_client_impl.cc
diff --git a/android_webview/native/aw_contents_io_thread_client_impl.cc b/android_webview/native/aw_contents_io_thread_client_impl.cc
index cab63d72e419dd381114f1d64c7ac425f0fe18d3..527efe0a2c0940190d7fa7ff3ab750a1aed2a0b1 100644
--- a/android_webview/native/aw_contents_io_thread_client_impl.cc
+++ b/android_webview/native/aw_contents_io_thread_client_impl.cc
@@ -8,6 +8,7 @@
#include <utility>
#include "android_webview/common/devtools_instrumentation.h"
+#include "android_webview/native/aw_contents_background_thread_client.h"
#include "android_webview/native/aw_web_resource_response_impl.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
@@ -155,24 +156,27 @@ void ClientMapEntryUpdater::WebContentsDestroyed() {
}
struct WebResourceRequest {
- ScopedJavaLocalRef<jstring> jstring_url;
+ std::string url;
+ std::string method;
bool is_main_frame;
bool has_user_gesture;
+ vector<string> header_names;
+ vector<string> header_values;
+
+ ScopedJavaLocalRef<jstring> jstring_url;
ScopedJavaLocalRef<jstring> jstring_method;
ScopedJavaLocalRef<jobjectArray> jstringArray_header_names;
ScopedJavaLocalRef<jobjectArray> jstringArray_header_values;
- WebResourceRequest(JNIEnv* env, const net::URLRequest* request)
- : jstring_url(ConvertUTF8ToJavaString(env, request->url().spec())),
- jstring_method(ConvertUTF8ToJavaString(env, request->method())) {
+ WebResourceRequest(const net::URLRequest* request)
+ : url(request->url().spec()),
+ method(request->method()) {
const content::ResourceRequestInfo* info =
content::ResourceRequestInfo::ForRequest(request);
is_main_frame =
info && info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME;
has_user_gesture = info && info->HasUserGesture();
- vector<string> header_names;
- vector<string> header_values;
net::HttpRequestHeaders headers;
if (!request->GetFullRequestHeaders(&headers))
headers = request->extra_request_headers();
@@ -181,6 +185,16 @@ struct WebResourceRequest {
header_names.push_back(headers_iterator.name());
header_values.push_back(headers_iterator.value());
}
+ }
+
+ WebResourceRequest(JNIEnv* env, const net::URLRequest* request)
boliu 2015/09/28 23:26:28 Nothing calls this I think?
mnaganov (inactive) 2015/09/29 00:14:06 AwContentsIoThreadClientImpl::OnReceivedError and
+ : WebResourceRequest(request) {
+ ConvertToJava(env);
+ }
+
+ void ConvertToJava(JNIEnv* env) {
+ jstring_url = ConvertUTF8ToJavaString(env, url);
+ jstring_method = ConvertUTF8ToJavaString(env, method);
jstringArray_header_names = ToJavaArrayOfStrings(env, header_names);
jstringArray_header_values = ToJavaArrayOfStrings(env, header_values);
}
@@ -267,32 +281,61 @@ AwContentsIoThreadClientImpl::GetCacheMode() const {
env, java_object_.obj()));
}
-scoped_ptr<AwWebResourceResponse>
-AwContentsIoThreadClientImpl::ShouldInterceptRequest(
- const net::URLRequest* request) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (java_object_.is_null())
- return scoped_ptr<AwWebResourceResponse>();
+namespace {
+
+scoped_ptr<AwWebResourceResponse> RunShouldInterceptRequest(
+ WebResourceRequest web_request,
+ JavaObjectWeakGlobalRef ref) {
+ DCHECK_CURRENTLY_ON(BrowserThread::FILE);
JNIEnv* env = AttachCurrentThread();
- WebResourceRequest web_request(env, request);
+ base::android::ScopedJavaLocalRef<jobject> obj = ref.get(env);
+ if (obj.is_null())
+ return nullptr;
+
+ web_request.ConvertToJava(env);
devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback(
"shouldInterceptRequest");
ScopedJavaLocalRef<jobject> ret =
- Java_AwContentsIoThreadClient_shouldInterceptRequest(
+ AwContentsBackgroundThreadClient::shouldInterceptRequest(
env,
- java_object_.obj(),
+ obj.obj(),
web_request.jstring_url.obj(),
web_request.is_main_frame,
web_request.has_user_gesture,
web_request.jstring_method.obj(),
web_request.jstringArray_header_names.obj(),
web_request.jstringArray_header_values.obj());
- if (ret.is_null())
- return scoped_ptr<AwWebResourceResponse>();
return scoped_ptr<AwWebResourceResponse>(
- new AwWebResourceResponseImpl(ret));
+ ret.is_null() ? nullptr : new AwWebResourceResponseImpl(ret)).Pass();
+}
+
+scoped_ptr<AwWebResourceResponse> ReturnNull() {
+ return scoped_ptr<AwWebResourceResponse>();
+}
+
+} // namespace
+
+void AwContentsIoThreadClientImpl::ShouldInterceptRequestAsync(
+ const net::URLRequest* request,
+ const base::Callback<void(scoped_ptr<AwWebResourceResponse>)> callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ base::Callback<scoped_ptr<AwWebResourceResponse>()> get_response =
+ base::Bind(&ReturnNull);
+ JNIEnv* env = AttachCurrentThread();
+ if (bg_thread_client_object_.is_null() && !java_object_.is_null()) {
+ bg_thread_client_object_.Reset(
+ Java_AwContentsIoThreadClient_getBackgroundThreadClient(
+ env, java_object_.obj()));
+ }
+ if (!bg_thread_client_object_.is_null()) {
+ get_response = base::Bind(
+ &RunShouldInterceptRequest, WebResourceRequest(request),
+ JavaObjectWeakGlobalRef(env, bg_thread_client_object_.obj()));
+ }
+ BrowserThread::PostTaskAndReplyWithResult(BrowserThread::FILE, FROM_HERE,
+ get_response, callback);
}
bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const {

Powered by Google App Engine
This is Rietveld 408576698