Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "android_webview/native/aw_contents_io_thread_client_impl.h" | 5 #include "android_webview/native/aw_contents_io_thread_client_impl.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "android_webview/common/devtools_instrumentation.h" | 10 #include "android_webview/common/devtools_instrumentation.h" |
| 11 #include "android_webview/native/aw_web_resource_response_impl.h" | 11 #include "android_webview/native/aw_web_resource_response_impl.h" |
| 12 #include "base/android/jni_array.h" | 12 #include "base/android/jni_array.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/android/jni_weak_ref.h" | 14 #include "base/android/jni_weak_ref.h" |
| 15 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
| 16 #include "base/memory/linked_ptr.h" | 16 #include "base/memory/linked_ptr.h" |
| 17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
| 18 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
| 19 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" |
| 20 #include "content/public/browser/render_frame_host.h" | 20 #include "content/public/browser/render_frame_host.h" |
| 21 #include "content/public/browser/render_process_host.h" | 21 #include "content/public/browser/render_process_host.h" |
| 22 #include "content/public/browser/render_view_host.h" | 22 #include "content/public/browser/render_view_host.h" |
| 23 #include "content/public/browser/resource_request_info.h" | 23 #include "content/public/browser/resource_request_info.h" |
| 24 #include "content/public/browser/web_contents.h" | 24 #include "content/public/browser/web_contents.h" |
| 25 #include "content/public/browser/web_contents_observer.h" | 25 #include "content/public/browser/web_contents_observer.h" |
| 26 #include "jni/AwContentsIoThreadClient_jni.h" | 26 #include "jni/AwContentsIoThreadClient_jni.h" |
| 27 #include "net/base/net_errors.h" | |
| 27 #include "net/http/http_request_headers.h" | 28 #include "net/http/http_request_headers.h" |
| 28 #include "net/http/http_response_headers.h" | 29 #include "net/http/http_response_headers.h" |
| 29 #include "net/url_request/url_request.h" | 30 #include "net/url_request/url_request.h" |
| 30 #include "url/gurl.h" | 31 #include "url/gurl.h" |
| 31 | 32 |
| 32 using base::android::AttachCurrentThread; | 33 using base::android::AttachCurrentThread; |
| 33 using base::android::ConvertUTF8ToJavaString; | 34 using base::android::ConvertUTF8ToJavaString; |
| 34 using base::android::JavaRef; | 35 using base::android::JavaRef; |
| 35 using base::android::ScopedJavaLocalRef; | 36 using base::android::ScopedJavaLocalRef; |
| 36 using base::android::ToJavaArrayOfStrings; | 37 using base::android::ToJavaArrayOfStrings; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 } | 147 } |
| 147 | 148 |
| 148 void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) { | 149 void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) { |
| 149 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); | 150 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); |
| 150 } | 151 } |
| 151 | 152 |
| 152 void ClientMapEntryUpdater::WebContentsDestroyed() { | 153 void ClientMapEntryUpdater::WebContentsDestroyed() { |
| 153 delete this; | 154 delete this; |
| 154 } | 155 } |
| 155 | 156 |
| 157 struct WebResourceRequest { | |
| 158 ScopedJavaLocalRef<jstring> jstring_url; | |
| 159 bool is_main_frame; | |
| 160 bool has_user_gesture; | |
| 161 ScopedJavaLocalRef<jstring> jstring_method; | |
| 162 ScopedJavaLocalRef<jobjectArray> jstringArray_header_names; | |
| 163 ScopedJavaLocalRef<jobjectArray> jstringArray_header_values; | |
| 164 | |
| 165 WebResourceRequest(JNIEnv* env, const net::URLRequest* request) | |
| 166 : jstring_url(ConvertUTF8ToJavaString(env, request->url().spec())), | |
| 167 jstring_method(ConvertUTF8ToJavaString(env, request->method())) { | |
| 168 const content::ResourceRequestInfo* info = | |
| 169 content::ResourceRequestInfo::ForRequest(request); | |
| 170 is_main_frame = | |
| 171 info && info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; | |
| 172 has_user_gesture = info && info->HasUserGesture(); | |
| 173 | |
| 174 vector<string> header_names; | |
| 175 vector<string> header_values; | |
| 176 net::HttpRequestHeaders headers; | |
| 177 if (!request->GetFullRequestHeaders(&headers)) | |
| 178 headers = request->extra_request_headers(); | |
| 179 net::HttpRequestHeaders::Iterator headers_iterator(headers); | |
| 180 while (headers_iterator.GetNext()) { | |
| 181 header_names.push_back(headers_iterator.name()); | |
| 182 header_values.push_back(headers_iterator.value()); | |
| 183 } | |
| 184 jstringArray_header_names = ToJavaArrayOfStrings(env, header_names); | |
| 185 jstringArray_header_values = ToJavaArrayOfStrings(env, header_values); | |
| 186 } | |
| 187 }; | |
| 188 | |
| 156 } // namespace | 189 } // namespace |
| 157 | 190 |
| 158 // AwContentsIoThreadClientImpl ----------------------------------------------- | 191 // AwContentsIoThreadClientImpl ----------------------------------------------- |
| 159 | 192 |
| 160 // static | 193 // static |
| 161 scoped_ptr<AwContentsIoThreadClient> | 194 scoped_ptr<AwContentsIoThreadClient> |
| 162 AwContentsIoThreadClient::FromID(int render_process_id, int render_frame_id) { | 195 AwContentsIoThreadClient::FromID(int render_process_id, int render_frame_id) { |
| 163 pair<int, int> rfh_id(render_process_id, render_frame_id); | 196 pair<int, int> rfh_id(render_process_id, render_frame_id); |
| 164 IoThreadClientData client_data; | 197 IoThreadClientData client_data; |
| 165 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) | 198 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 234 env, java_object_.obj())); | 267 env, java_object_.obj())); |
| 235 } | 268 } |
| 236 | 269 |
| 237 scoped_ptr<AwWebResourceResponse> | 270 scoped_ptr<AwWebResourceResponse> |
| 238 AwContentsIoThreadClientImpl::ShouldInterceptRequest( | 271 AwContentsIoThreadClientImpl::ShouldInterceptRequest( |
| 239 const GURL& location, | 272 const GURL& location, |
| 240 const net::URLRequest* request) { | 273 const net::URLRequest* request) { |
| 241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 242 if (java_object_.is_null()) | 275 if (java_object_.is_null()) |
| 243 return scoped_ptr<AwWebResourceResponse>(); | 276 return scoped_ptr<AwWebResourceResponse>(); |
| 244 const content::ResourceRequestInfo* info = | |
| 245 content::ResourceRequestInfo::ForRequest(request); | |
| 246 bool is_main_frame = info && | |
| 247 info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; | |
| 248 bool has_user_gesture = info && info->HasUserGesture(); | |
| 249 | |
| 250 vector<string> headers_names; | |
| 251 vector<string> headers_values; | |
| 252 { | |
| 253 net::HttpRequestHeaders headers; | |
| 254 if (!request->GetFullRequestHeaders(&headers)) | |
| 255 headers = request->extra_request_headers(); | |
| 256 net::HttpRequestHeaders::Iterator headers_iterator(headers); | |
| 257 while (headers_iterator.GetNext()) { | |
| 258 headers_names.push_back(headers_iterator.name()); | |
| 259 headers_values.push_back(headers_iterator.value()); | |
| 260 } | |
| 261 } | |
| 262 | 277 |
| 263 JNIEnv* env = AttachCurrentThread(); | 278 JNIEnv* env = AttachCurrentThread(); |
| 264 ScopedJavaLocalRef<jstring> jstring_url = | 279 WebResourceRequest web_request(env, request); |
| 265 ConvertUTF8ToJavaString(env, location.spec()); | 280 web_request.jstring_url = ConvertUTF8ToJavaString(env, location.spec()); |
|
sgurun-gerrit only
2015/03/17 00:30:04
question: do you really need to overwrite this? wh
mnaganov (inactive)
2015/03/17 15:29:09
Great question! I've looked up where we are gettin
| |
| 266 ScopedJavaLocalRef<jstring> jstring_method = | 281 |
| 267 ConvertUTF8ToJavaString(env, request->method()); | |
| 268 ScopedJavaLocalRef<jobjectArray> jstringArray_headers_names = | |
| 269 ToJavaArrayOfStrings(env, headers_names); | |
| 270 ScopedJavaLocalRef<jobjectArray> jstringArray_headers_values = | |
| 271 ToJavaArrayOfStrings(env, headers_values); | |
| 272 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( | 282 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
| 273 "shouldInterceptRequest"); | 283 "shouldInterceptRequest"); |
| 274 ScopedJavaLocalRef<jobject> ret = | 284 ScopedJavaLocalRef<jobject> ret = |
| 275 Java_AwContentsIoThreadClient_shouldInterceptRequest( | 285 Java_AwContentsIoThreadClient_shouldInterceptRequest( |
| 276 env, | 286 env, |
| 277 java_object_.obj(), | 287 java_object_.obj(), |
| 278 jstring_url.obj(), | 288 web_request.jstring_url.obj(), |
| 279 is_main_frame, | 289 web_request.is_main_frame, |
| 280 has_user_gesture, | 290 web_request.has_user_gesture, |
| 281 jstring_method.obj(), | 291 web_request.jstring_method.obj(), |
| 282 jstringArray_headers_names.obj(), | 292 web_request.jstringArray_header_names.obj(), |
| 283 jstringArray_headers_values.obj()); | 293 web_request.jstringArray_header_values.obj()); |
| 284 if (ret.is_null()) | 294 if (ret.is_null()) |
| 285 return scoped_ptr<AwWebResourceResponse>(); | 295 return scoped_ptr<AwWebResourceResponse>(); |
| 286 return scoped_ptr<AwWebResourceResponse>( | 296 return scoped_ptr<AwWebResourceResponse>( |
| 287 new AwWebResourceResponseImpl(ret)); | 297 new AwWebResourceResponseImpl(ret)); |
| 288 } | 298 } |
| 289 | 299 |
| 290 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { | 300 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { |
| 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 301 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 292 if (java_object_.is_null()) | 302 if (java_object_.is_null()) |
| 293 return false; | 303 return false; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); | 379 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); |
| 370 | 380 |
| 371 ScopedJavaLocalRef<jstring> jaccount; | 381 ScopedJavaLocalRef<jstring> jaccount; |
| 372 if (!account.empty()) | 382 if (!account.empty()) |
| 373 jaccount = ConvertUTF8ToJavaString(env, account); | 383 jaccount = ConvertUTF8ToJavaString(env, account); |
| 374 | 384 |
| 375 Java_AwContentsIoThreadClient_newLoginRequest( | 385 Java_AwContentsIoThreadClient_newLoginRequest( |
| 376 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); | 386 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); |
| 377 } | 387 } |
| 378 | 388 |
| 389 void AwContentsIoThreadClientImpl::OnReceivedError( | |
| 390 const net::URLRequest* request) { | |
| 391 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 392 if (java_object_.is_null()) | |
| 393 return; | |
| 394 | |
| 395 JNIEnv* env = AttachCurrentThread(); | |
| 396 WebResourceRequest web_request(env, request); | |
| 397 | |
| 398 int error_code = request->status().error(); | |
| 399 ScopedJavaLocalRef<jstring> jstring_description = ConvertUTF8ToJavaString( | |
| 400 env, net::ErrorToString(request->status().error())); | |
| 401 | |
| 402 Java_AwContentsIoThreadClient_onReceivedError( | |
| 403 env, | |
| 404 java_object_.obj(), | |
| 405 web_request.jstring_url.obj(), | |
| 406 web_request.is_main_frame, | |
| 407 web_request.has_user_gesture, | |
| 408 web_request.jstring_method.obj(), | |
| 409 web_request.jstringArray_header_names.obj(), | |
| 410 web_request.jstringArray_header_values.obj(), | |
| 411 error_code, | |
| 412 jstring_description.obj()); | |
| 413 } | |
| 414 | |
| 379 void AwContentsIoThreadClientImpl::OnReceivedHttpError( | 415 void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
| 380 const net::URLRequest* request, | 416 const net::URLRequest* request, |
| 381 const net::HttpResponseHeaders* response_headers) { | 417 const net::HttpResponseHeaders* response_headers) { |
| 382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 383 if (java_object_.is_null()) | 419 if (java_object_.is_null()) |
| 384 return; | 420 return; |
| 385 | 421 |
| 386 vector<string> request_header_names; | 422 JNIEnv* env = AttachCurrentThread(); |
| 387 vector<string> request_header_values; | 423 WebResourceRequest web_request(env, request); |
| 388 { | |
| 389 net::HttpRequestHeaders headers; | |
| 390 if (!request->GetFullRequestHeaders(&headers)) | |
| 391 headers = request->extra_request_headers(); | |
| 392 net::HttpRequestHeaders::Iterator headers_iterator(headers); | |
| 393 while (headers_iterator.GetNext()) { | |
| 394 request_header_names.push_back(headers_iterator.name()); | |
| 395 request_header_values.push_back(headers_iterator.value()); | |
| 396 } | |
| 397 } | |
| 398 | 424 |
| 399 vector<string> response_header_names; | 425 vector<string> response_header_names; |
| 400 vector<string> response_header_values; | 426 vector<string> response_header_values; |
| 401 { | 427 { |
| 402 void* headers_iterator = NULL; | 428 void* headers_iterator = NULL; |
| 403 string header_name, header_value; | 429 string header_name, header_value; |
| 404 while (response_headers->EnumerateHeaderLines( | 430 while (response_headers->EnumerateHeaderLines( |
| 405 &headers_iterator, &header_name, &header_value)) { | 431 &headers_iterator, &header_name, &header_value)) { |
| 406 response_header_names.push_back(header_name); | 432 response_header_names.push_back(header_name); |
| 407 response_header_values.push_back(header_value); | 433 response_header_values.push_back(header_value); |
| 408 } | 434 } |
| 409 } | 435 } |
| 410 | 436 |
| 411 JNIEnv* env = AttachCurrentThread(); | |
| 412 ScopedJavaLocalRef<jstring> jstring_url = | |
| 413 ConvertUTF8ToJavaString(env, request->url().spec()); | |
| 414 ScopedJavaLocalRef<jstring> jstring_method = | |
| 415 ConvertUTF8ToJavaString(env, request->method()); | |
| 416 ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_names = | |
| 417 ToJavaArrayOfStrings(env, request_header_names); | |
| 418 ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_values = | |
| 419 ToJavaArrayOfStrings(env, request_header_values); | |
| 420 | |
| 421 const content::ResourceRequestInfo* info = | |
| 422 content::ResourceRequestInfo::ForRequest(request); | |
| 423 bool is_main_frame = info && | |
| 424 info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; | |
| 425 bool has_user_gesture = info && info->HasUserGesture(); | |
| 426 | |
| 427 string mime_type, encoding; | 437 string mime_type, encoding; |
| 428 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); | 438 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); |
| 429 ScopedJavaLocalRef<jstring> jstring_mime_type = | 439 ScopedJavaLocalRef<jstring> jstring_mime_type = |
| 430 ConvertUTF8ToJavaString(env, mime_type); | 440 ConvertUTF8ToJavaString(env, mime_type); |
| 431 ScopedJavaLocalRef<jstring> jstring_encoding = | 441 ScopedJavaLocalRef<jstring> jstring_encoding = |
| 432 ConvertUTF8ToJavaString(env, encoding); | 442 ConvertUTF8ToJavaString(env, encoding); |
| 433 int status_code = response_headers->response_code(); | 443 int status_code = response_headers->response_code(); |
| 434 ScopedJavaLocalRef<jstring> jstring_reason = | 444 ScopedJavaLocalRef<jstring> jstring_reason = |
| 435 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); | 445 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); |
| 436 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = | 446 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = |
| 437 ToJavaArrayOfStrings(env, response_header_names); | 447 ToJavaArrayOfStrings(env, response_header_names); |
| 438 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = | 448 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = |
| 439 ToJavaArrayOfStrings(env, response_header_values); | 449 ToJavaArrayOfStrings(env, response_header_values); |
| 440 | 450 |
| 441 Java_AwContentsIoThreadClient_onReceivedHttpError( | 451 Java_AwContentsIoThreadClient_onReceivedHttpError( |
| 442 env, | 452 env, |
| 443 java_object_.obj(), | 453 java_object_.obj(), |
| 444 jstring_url.obj(), | 454 web_request.jstring_url.obj(), |
| 445 is_main_frame, | 455 web_request.is_main_frame, |
| 446 has_user_gesture, | 456 web_request.has_user_gesture, |
| 447 jstring_method.obj(), | 457 web_request.jstring_method.obj(), |
| 448 jstringArray_request_header_names.obj(), | 458 web_request.jstringArray_header_names.obj(), |
| 449 jstringArray_request_header_values.obj(), | 459 web_request.jstringArray_header_values.obj(), |
| 450 jstring_mime_type.obj(), | 460 jstring_mime_type.obj(), |
| 451 jstring_encoding.obj(), | 461 jstring_encoding.obj(), |
| 452 status_code, | 462 status_code, |
| 453 jstring_reason.obj(), | 463 jstring_reason.obj(), |
| 454 jstringArray_response_header_names.obj(), | 464 jstringArray_response_header_names.obj(), |
| 455 jstringArray_response_header_values.obj()); | 465 jstringArray_response_header_values.obj()); |
| 456 } | 466 } |
| 457 | 467 |
| 458 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { | 468 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { |
| 459 return RegisterNativesImpl(env); | 469 return RegisterNativesImpl(env); |
| 460 } | 470 } |
| 461 | 471 |
| 462 } // namespace android_webview | 472 } // namespace android_webview |
| OLD | NEW |