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 0cadc9491f02355c4224bd89d9a232d3471f86cd..419631e5fbcd63ad6c2d68e964f1e53f1ce33bbf 100644 |
--- a/android_webview/native/aw_contents_io_thread_client_impl.cc |
+++ b/android_webview/native/aw_contents_io_thread_client_impl.cc |
@@ -24,6 +24,7 @@ |
#include "content/public/browser/web_contents.h" |
#include "content/public/browser/web_contents_observer.h" |
#include "jni/AwContentsIoThreadClient_jni.h" |
+#include "net/base/net_errors.h" |
#include "net/http/http_request_headers.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/url_request.h" |
@@ -153,6 +154,38 @@ void ClientMapEntryUpdater::WebContentsDestroyed() { |
delete this; |
} |
+struct WebResourceRequest { |
+ ScopedJavaLocalRef<jstring> jstring_url; |
+ bool is_main_frame; |
+ bool has_user_gesture; |
+ 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())) { |
+ 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(); |
+ net::HttpRequestHeaders::Iterator headers_iterator(headers); |
+ while (headers_iterator.GetNext()) { |
+ header_names.push_back(headers_iterator.name()); |
+ header_values.push_back(headers_iterator.value()); |
+ } |
+ jstringArray_header_names = ToJavaArrayOfStrings(env, header_names); |
+ jstringArray_header_values = ToJavaArrayOfStrings(env, header_values); |
+ } |
+}; |
+ |
} // namespace |
// AwContentsIoThreadClientImpl ----------------------------------------------- |
@@ -236,51 +269,26 @@ AwContentsIoThreadClientImpl::GetCacheMode() const { |
scoped_ptr<AwWebResourceResponse> |
AwContentsIoThreadClientImpl::ShouldInterceptRequest( |
- const GURL& location, |
const net::URLRequest* request) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
if (java_object_.is_null()) |
return scoped_ptr<AwWebResourceResponse>(); |
- const content::ResourceRequestInfo* info = |
- content::ResourceRequestInfo::ForRequest(request); |
- bool is_main_frame = info && |
- info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; |
- bool has_user_gesture = info && info->HasUserGesture(); |
- |
- vector<string> headers_names; |
- vector<string> headers_values; |
- { |
- net::HttpRequestHeaders headers; |
- if (!request->GetFullRequestHeaders(&headers)) |
- headers = request->extra_request_headers(); |
- net::HttpRequestHeaders::Iterator headers_iterator(headers); |
- while (headers_iterator.GetNext()) { |
- headers_names.push_back(headers_iterator.name()); |
- headers_values.push_back(headers_iterator.value()); |
- } |
- } |
JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jstring> jstring_url = |
- ConvertUTF8ToJavaString(env, location.spec()); |
- ScopedJavaLocalRef<jstring> jstring_method = |
- ConvertUTF8ToJavaString(env, request->method()); |
- ScopedJavaLocalRef<jobjectArray> jstringArray_headers_names = |
- ToJavaArrayOfStrings(env, headers_names); |
- ScopedJavaLocalRef<jobjectArray> jstringArray_headers_values = |
- ToJavaArrayOfStrings(env, headers_values); |
+ WebResourceRequest web_request(env, request); |
+ |
devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
"shouldInterceptRequest"); |
ScopedJavaLocalRef<jobject> ret = |
Java_AwContentsIoThreadClient_shouldInterceptRequest( |
env, |
java_object_.obj(), |
- jstring_url.obj(), |
- is_main_frame, |
- has_user_gesture, |
- jstring_method.obj(), |
- jstringArray_headers_names.obj(), |
- jstringArray_headers_values.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>( |
@@ -376,6 +384,32 @@ void AwContentsIoThreadClientImpl::NewLoginRequest(const string& realm, |
env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); |
} |
+void AwContentsIoThreadClientImpl::OnReceivedError( |
+ const net::URLRequest* request) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (java_object_.is_null()) |
+ return; |
+ |
+ JNIEnv* env = AttachCurrentThread(); |
+ WebResourceRequest web_request(env, request); |
+ |
+ int error_code = request->status().error(); |
+ ScopedJavaLocalRef<jstring> jstring_description = ConvertUTF8ToJavaString( |
+ env, net::ErrorToString(request->status().error())); |
+ |
+ Java_AwContentsIoThreadClient_onReceivedError( |
+ env, |
+ java_object_.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(), |
+ error_code, |
+ jstring_description.obj()); |
+} |
+ |
void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
const net::URLRequest* request, |
const net::HttpResponseHeaders* response_headers) { |
@@ -383,18 +417,8 @@ void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
if (java_object_.is_null()) |
return; |
- vector<string> request_header_names; |
- vector<string> request_header_values; |
- { |
- net::HttpRequestHeaders headers; |
- if (!request->GetFullRequestHeaders(&headers)) |
- headers = request->extra_request_headers(); |
- net::HttpRequestHeaders::Iterator headers_iterator(headers); |
- while (headers_iterator.GetNext()) { |
- request_header_names.push_back(headers_iterator.name()); |
- request_header_values.push_back(headers_iterator.value()); |
- } |
- } |
+ JNIEnv* env = AttachCurrentThread(); |
+ WebResourceRequest web_request(env, request); |
vector<string> response_header_names; |
vector<string> response_header_values; |
@@ -408,22 +432,6 @@ void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
} |
} |
- JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jstring> jstring_url = |
- ConvertUTF8ToJavaString(env, request->url().spec()); |
- ScopedJavaLocalRef<jstring> jstring_method = |
- ConvertUTF8ToJavaString(env, request->method()); |
- ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_names = |
- ToJavaArrayOfStrings(env, request_header_names); |
- ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_values = |
- ToJavaArrayOfStrings(env, request_header_values); |
- |
- const content::ResourceRequestInfo* info = |
- content::ResourceRequestInfo::ForRequest(request); |
- bool is_main_frame = info && |
- info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; |
- bool has_user_gesture = info && info->HasUserGesture(); |
- |
string mime_type, encoding; |
response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); |
ScopedJavaLocalRef<jstring> jstring_mime_type = |
@@ -441,12 +449,12 @@ void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
Java_AwContentsIoThreadClient_onReceivedHttpError( |
env, |
java_object_.obj(), |
- jstring_url.obj(), |
- is_main_frame, |
- has_user_gesture, |
- jstring_method.obj(), |
- jstringArray_request_header_names.obj(), |
- jstringArray_request_header_values.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(), |
jstring_mime_type.obj(), |
jstring_encoding.obj(), |
status_code, |