| 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
|
|
|