| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_client_bridge.h" | 5 #include "android_webview/native/aw_contents_client_bridge.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 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_contents.h" | 11 #include "android_webview/native/aw_contents.h" |
| 12 #include "base/android/jni_android.h" | 12 #include "base/android/jni_android.h" |
| 13 #include "base/android/jni_array.h" | 13 #include "base/android/jni_array.h" |
| 14 #include "base/android/jni_string.h" | 14 #include "base/android/jni_string.h" |
| 15 #include "base/callback_helpers.h" | 15 #include "base/callback_helpers.h" |
| 16 #include "base/macros.h" | 16 #include "base/macros.h" |
| 17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
| 18 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
| 19 #include "content/public/browser/client_certificate_delegate.h" | 19 #include "content/public/browser/client_certificate_delegate.h" |
| 20 #include "content/public/browser/render_process_host.h" | 20 #include "content/public/browser/render_process_host.h" |
| 21 #include "content/public/browser/render_view_host.h" | 21 #include "content/public/browser/render_view_host.h" |
| 22 #include "content/public/browser/web_contents.h" | 22 #include "content/public/browser/web_contents.h" |
| 23 #include "grit/components_strings.h" | 23 #include "grit/components_strings.h" |
| 24 #include "jni/AwContentsClientBridge_jni.h" | 24 #include "jni/AwContentsClientBridge_jni.h" |
| 25 #include "net/cert/x509_certificate.h" | 25 #include "net/cert/x509_certificate.h" |
| 26 #include "net/http/http_response_headers.h" | |
| 27 #include "net/ssl/openssl_client_key_store.h" | 26 #include "net/ssl/openssl_client_key_store.h" |
| 28 #include "net/ssl/ssl_cert_request_info.h" | 27 #include "net/ssl/ssl_cert_request_info.h" |
| 29 #include "net/ssl/ssl_client_cert_type.h" | 28 #include "net/ssl/ssl_client_cert_type.h" |
| 30 #include "net/ssl/ssl_platform_key_android.h" | 29 #include "net/ssl/ssl_platform_key_android.h" |
| 31 #include "net/ssl/ssl_private_key.h" | 30 #include "net/ssl/ssl_private_key.h" |
| 32 #include "ui/base/l10n/l10n_util.h" | 31 #include "ui/base/l10n/l10n_util.h" |
| 33 #include "url/gurl.h" | 32 #include "url/gurl.h" |
| 34 | 33 |
| 35 using base::android::AttachCurrentThread; | 34 using base::android::AttachCurrentThread; |
| 36 using base::android::ConvertJavaStringToUTF16; | 35 using base::android::ConvertJavaStringToUTF16; |
| 37 using base::android::ConvertUTF8ToJavaString; | 36 using base::android::ConvertUTF8ToJavaString; |
| 38 using base::android::ConvertUTF16ToJavaString; | 37 using base::android::ConvertUTF16ToJavaString; |
| 39 using base::android::HasException; | 38 using base::android::HasException; |
| 40 using base::android::JavaRef; | 39 using base::android::JavaRef; |
| 41 using base::android::ScopedJavaLocalRef; | 40 using base::android::ScopedJavaLocalRef; |
| 42 using base::android::ToJavaArrayOfStrings; | |
| 43 using content::BrowserThread; | 41 using content::BrowserThread; |
| 44 using std::vector; | |
| 45 | 42 |
| 46 namespace android_webview { | 43 namespace android_webview { |
| 47 | 44 |
| 48 namespace { | 45 namespace { |
| 49 | 46 |
| 50 // Must be called on the I/O thread to record a client certificate | 47 // Must be called on the I/O thread to record a client certificate |
| 51 // and its private key in the OpenSSLClientKeyStore. | 48 // and its private key in the OpenSSLClientKeyStore. |
| 52 void RecordClientCertificateKey(net::X509Certificate* client_cert, | 49 void RecordClientCertificateKey(net::X509Certificate* client_cert, |
| 53 scoped_refptr<net::SSLPrivateKey> private_key) { | 50 scoped_refptr<net::SSLPrivateKey> private_key) { |
| 54 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 51 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); | 404 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); |
| 408 | 405 |
| 409 ScopedJavaLocalRef<jstring> jaccount; | 406 ScopedJavaLocalRef<jstring> jaccount; |
| 410 if (!account.empty()) | 407 if (!account.empty()) |
| 411 jaccount = ConvertUTF8ToJavaString(env, account); | 408 jaccount = ConvertUTF8ToJavaString(env, account); |
| 412 | 409 |
| 413 Java_AwContentsClientBridge_newLoginRequest(env, obj, jrealm, jaccount, | 410 Java_AwContentsClientBridge_newLoginRequest(env, obj, jrealm, jaccount, |
| 414 jargs); | 411 jargs); |
| 415 } | 412 } |
| 416 | 413 |
| 417 void AwContentsClientBridge::OnReceivedError( | |
| 418 const AwWebResourceRequest& request, | |
| 419 int error_code) { | |
| 420 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 421 JNIEnv* env = AttachCurrentThread(); | |
| 422 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | |
| 423 if (obj.is_null()) | |
| 424 return; | |
| 425 | |
| 426 ScopedJavaLocalRef<jstring> jstring_description = | |
| 427 ConvertUTF8ToJavaString(env, net::ErrorToString(error_code)); | |
| 428 | |
| 429 AwWebResourceRequest::AwJavaWebResourceRequest java_web_resource_request; | |
| 430 AwWebResourceRequest::ConvertToJava(env, request, &java_web_resource_request); | |
| 431 | |
| 432 Java_AwContentsClientBridge_onReceivedError( | |
| 433 env, obj, java_web_resource_request.jurl, request.is_main_frame, | |
| 434 request.has_user_gesture, java_web_resource_request.jmethod, | |
| 435 java_web_resource_request.jheader_names, | |
| 436 java_web_resource_request.jheader_values, error_code, | |
| 437 jstring_description); | |
| 438 } | |
| 439 | |
| 440 void AwContentsClientBridge::OnReceivedHttpError( | |
| 441 const AwWebResourceRequest& request, | |
| 442 const scoped_refptr<const net::HttpResponseHeaders>& response_headers) { | |
| 443 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 444 JNIEnv* env = AttachCurrentThread(); | |
| 445 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | |
| 446 if (obj.is_null()) | |
| 447 return; | |
| 448 | |
| 449 AwWebResourceRequest::AwJavaWebResourceRequest java_web_resource_request; | |
| 450 AwWebResourceRequest::ConvertToJava(env, request, &java_web_resource_request); | |
| 451 | |
| 452 vector<std::string> response_header_names; | |
| 453 vector<std::string> response_header_values; | |
| 454 | |
| 455 { | |
| 456 size_t headers_iterator = 0; | |
| 457 std::string header_name, header_value; | |
| 458 while (response_headers->EnumerateHeaderLines( | |
| 459 &headers_iterator, &header_name, &header_value)) { | |
| 460 response_header_names.push_back(header_name); | |
| 461 response_header_values.push_back(header_value); | |
| 462 } | |
| 463 } | |
| 464 | |
| 465 std::string mime_type, encoding; | |
| 466 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); | |
| 467 ScopedJavaLocalRef<jstring> jstring_mime_type = | |
| 468 ConvertUTF8ToJavaString(env, mime_type); | |
| 469 ScopedJavaLocalRef<jstring> jstring_encoding = | |
| 470 ConvertUTF8ToJavaString(env, encoding); | |
| 471 int status_code = response_headers->response_code(); | |
| 472 ScopedJavaLocalRef<jstring> jstring_reason = | |
| 473 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); | |
| 474 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = | |
| 475 ToJavaArrayOfStrings(env, response_header_names); | |
| 476 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = | |
| 477 ToJavaArrayOfStrings(env, response_header_values); | |
| 478 | |
| 479 Java_AwContentsClientBridge_onReceivedHttpError( | |
| 480 env, obj, java_web_resource_request.jurl, request.is_main_frame, | |
| 481 request.has_user_gesture, java_web_resource_request.jmethod, | |
| 482 java_web_resource_request.jheader_names, | |
| 483 java_web_resource_request.jheader_values, jstring_mime_type, | |
| 484 jstring_encoding, status_code, jstring_reason, | |
| 485 jstringArray_response_header_names, jstringArray_response_header_values); | |
| 486 } | |
| 487 | |
| 488 void AwContentsClientBridge::ConfirmJsResult(JNIEnv* env, | 414 void AwContentsClientBridge::ConfirmJsResult(JNIEnv* env, |
| 489 const JavaRef<jobject>&, | 415 const JavaRef<jobject>&, |
| 490 int id, | 416 int id, |
| 491 const JavaRef<jstring>& prompt) { | 417 const JavaRef<jstring>& prompt) { |
| 492 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 418 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 493 content::JavaScriptDialogManager::DialogClosedCallback* callback = | 419 content::JavaScriptDialogManager::DialogClosedCallback* callback = |
| 494 pending_js_dialog_callbacks_.Lookup(id); | 420 pending_js_dialog_callbacks_.Lookup(id); |
| 495 if (!callback) { | 421 if (!callback) { |
| 496 LOG(WARNING) << "Unexpected JS dialog confirm. " << id; | 422 LOG(WARNING) << "Unexpected JS dialog confirm. " << id; |
| 497 return; | 423 return; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 526 pending_client_cert_request_delegates_.Remove(request_id); | 452 pending_client_cert_request_delegates_.Remove(request_id); |
| 527 | 453 |
| 528 delete delegate; | 454 delete delegate; |
| 529 } | 455 } |
| 530 | 456 |
| 531 bool RegisterAwContentsClientBridge(JNIEnv* env) { | 457 bool RegisterAwContentsClientBridge(JNIEnv* env) { |
| 532 return RegisterNativesImpl(env); | 458 return RegisterNativesImpl(env); |
| 533 } | 459 } |
| 534 | 460 |
| 535 } // namespace android_webview | 461 } // namespace android_webview |
| OLD | NEW |