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 225de649f77d85aade8155835593a97ad0a914e2..63965db2074f4dfdf8844bde3d4ea9f9f660d1a1 100644 |
--- a/android_webview/native/aw_contents_io_thread_client_impl.cc |
+++ b/android_webview/native/aw_contents_io_thread_client_impl.cc |
@@ -8,7 +8,6 @@ |
#include <memory> |
#include <utility> |
-#include "android_webview/browser/net/aw_web_resource_request.h" |
#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" |
@@ -25,7 +24,11 @@ |
#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" |
+#include "url/gurl.h" |
using base::android::AttachCurrentThread; |
using base::android::ConvertUTF8ToJavaString; |
@@ -40,6 +43,7 @@ |
using std::map; |
using std::pair; |
using std::string; |
+using std::vector; |
namespace android_webview { |
@@ -153,6 +157,51 @@ |
void ClientMapEntryUpdater::WebContentsDestroyed() { |
delete this; |
} |
+ |
+struct WebResourceRequest { |
+ 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(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(); |
+ |
+ 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()); |
+ } |
+ } |
+ |
+ WebResourceRequest(JNIEnv* env, const net::URLRequest* request) |
+ : 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); |
+ } |
+}; |
} // namespace |
@@ -264,7 +313,7 @@ |
namespace { |
std::unique_ptr<AwWebResourceResponse> RunShouldInterceptRequest( |
- const AwWebResourceRequest& request, |
+ WebResourceRequest web_request, |
JavaObjectWeakGlobalRef ref) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
JNIEnv* env = AttachCurrentThread(); |
@@ -272,17 +321,16 @@ |
if (obj.is_null()) |
return nullptr; |
- AwWebResourceRequest::AwJavaWebResourceRequest java_web_resource_request; |
- AwWebResourceRequest::ConvertToJava(env, request, &java_web_resource_request); |
+ web_request.ConvertToJava(env); |
devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
"shouldInterceptRequest"); |
ScopedJavaLocalRef<jobject> ret = |
AwContentsBackgroundThreadClient::shouldInterceptRequest( |
- env, obj, java_web_resource_request.jurl, request.is_main_frame, |
- request.has_user_gesture, java_web_resource_request.jmethod, |
- java_web_resource_request.jheader_names, |
- java_web_resource_request.jheader_values); |
+ env, obj, web_request.jstring_url, web_request.is_main_frame, |
+ web_request.has_user_gesture, web_request.jstring_method, |
+ web_request.jstringArray_header_names, |
+ web_request.jstringArray_header_values); |
return std::unique_ptr<AwWebResourceResponse>( |
ret.is_null() ? nullptr : new AwWebResourceResponseImpl(ret)); |
} |
@@ -307,7 +355,7 @@ |
} |
if (!bg_thread_client_object_.is_null()) { |
get_response = base::Bind( |
- &RunShouldInterceptRequest, AwWebResourceRequest(*request), |
+ &RunShouldInterceptRequest, WebResourceRequest(request), |
JavaObjectWeakGlobalRef(env, bg_thread_client_object_.obj())); |
} |
BrowserThread::PostTaskAndReplyWithResult(BrowserThread::FILE, FROM_HERE, |
@@ -353,4 +401,69 @@ |
java_object_); |
} |
+void AwContentsIoThreadClientImpl::OnReceivedError( |
+ const net::URLRequest* request) { |
+ DCHECK_CURRENTLY_ON(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_, web_request.jstring_url, web_request.is_main_frame, |
+ web_request.has_user_gesture, web_request.jstring_method, |
+ web_request.jstringArray_header_names, |
+ web_request.jstringArray_header_values, error_code, jstring_description); |
+} |
+ |
+void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
+ const net::URLRequest* request, |
+ const net::HttpResponseHeaders* response_headers) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (java_object_.is_null()) |
+ return; |
+ |
+ JNIEnv* env = AttachCurrentThread(); |
+ WebResourceRequest web_request(env, request); |
+ |
+ vector<string> response_header_names; |
+ vector<string> response_header_values; |
+ { |
+ size_t headers_iterator = 0; |
+ string header_name, header_value; |
+ while (response_headers->EnumerateHeaderLines( |
+ &headers_iterator, &header_name, &header_value)) { |
+ response_header_names.push_back(header_name); |
+ response_header_values.push_back(header_value); |
+ } |
+ } |
+ |
+ string mime_type, encoding; |
+ response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); |
+ ScopedJavaLocalRef<jstring> jstring_mime_type = |
+ ConvertUTF8ToJavaString(env, mime_type); |
+ ScopedJavaLocalRef<jstring> jstring_encoding = |
+ ConvertUTF8ToJavaString(env, encoding); |
+ int status_code = response_headers->response_code(); |
+ ScopedJavaLocalRef<jstring> jstring_reason = |
+ ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); |
+ ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = |
+ ToJavaArrayOfStrings(env, response_header_names); |
+ ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = |
+ ToJavaArrayOfStrings(env, response_header_values); |
+ |
+ Java_AwContentsIoThreadClient_onReceivedHttpError( |
+ env, java_object_, web_request.jstring_url, web_request.is_main_frame, |
+ web_request.has_user_gesture, web_request.jstring_method, |
+ web_request.jstringArray_header_names, |
+ web_request.jstringArray_header_values, jstring_mime_type, |
+ jstring_encoding, status_code, jstring_reason, |
+ jstringArray_response_header_names, jstringArray_response_header_values); |
+} |
+ |
} // namespace android_webview |