Chromium Code Reviews| Index: android_webview/native/aw_contents_client_bridge.cc |
| diff --git a/android_webview/native/aw_contents_client_bridge.cc b/android_webview/native/aw_contents_client_bridge.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d8d1fb9faf0f29fed19212acdc0303ca33e6f8b0 |
| --- /dev/null |
| +++ b/android_webview/native/aw_contents_client_bridge.cc |
| @@ -0,0 +1,92 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "android_webview/native/aw_contents_client_bridge.h" |
| + |
| +#include "base/android/jni_android.h" |
| +#include "base/android/jni_array.h" |
| +#include "base/android/jni_string.h" |
| +#include "base/callback.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "googleurl/src/gurl.h" |
| +#include "jni/AwContentsClientBridge_jni.h" |
| +#include "net/base/x509_certificate.h" |
| + |
| +using base::android::AttachCurrentThread; |
| +using base::android::ConvertJavaStringToUTF16; |
| +using base::android::ConvertUTF8ToJavaString; |
| +using base::android::JavaRef; |
| +using base::android::ScopedJavaLocalRef; |
| +using content::BrowserThread; |
| + |
| +namespace android_webview { |
| + |
| +AwContentsClientBridge::AwContentsClientBridge(JNIEnv* env, jobject obj) |
| + : java_ref_(env, obj) { |
| + DCHECK(obj); |
| + Java_AwContentsClientBridge_setNativeContentsClientBridge(env, obj, |
| + reinterpret_cast<jint>(this)); |
| +} |
| + |
| +AwContentsClientBridge::~AwContentsClientBridge() { |
| + JNIEnv* env = AttachCurrentThread(); |
| + |
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| + if (obj.is_null()) |
| + return; |
| + // Clear the weak reference from the java peer to the native object since |
| + // it is possible that java object lifetime can exceed the AwContens. |
| + Java_AwContentsClientBridge_setNativeContentsClientBridge(env, obj.obj(), 0); |
| +} |
| + |
| +void AwContentsClientBridge::AllowCertificateError( |
| + int cert_error, |
| + net::X509Certificate* cert, |
| + const GURL& request_url, |
| + const base::Callback<void(bool)>& callback, |
| + bool* cancel_request) { |
| + |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + JNIEnv* env = AttachCurrentThread(); |
| + |
| + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| + if (obj.is_null()) |
| + return; |
| + |
| + std::string der_string; |
| + net::X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_string); |
| + ScopedJavaLocalRef<jbyteArray> jcert = base::android::ToJavaByteArray(env, |
| + reinterpret_cast<const uint8*>(der_string.data()), der_string.length()); |
| + ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString( |
| + env, request_url.spec())); |
| + // We need to add the callback before making the call to java side, |
| + // as it may do a synchronous callback prior to returning. |
| + int request_id = pending_cert_error_callbacks_.Add( |
| + new CertErrorCallback(callback)); |
| + *cancel_request = !Java_AwContentsClientBridge_allowCertificateError(env, |
| + obj.obj(), reinterpret_cast<jint>(cert_error), jcert.obj(), jurl.obj(), |
| + request_id); |
| + // if the request is cancelled, then cancel the stored callback |
| + if (*cancel_request) { |
| + pending_cert_error_callbacks_.Remove(request_id); |
| + } |
| +} |
| + |
| +void AwContentsClientBridge::ProceedSslError(JNIEnv* env, jobject obj, |
| + jboolean proceed, jint id) { |
|
benm (inactive)
2013/02/25 12:16:38
nit: indent looks wrong here
sgurun-gerrit only
2013/02/25 19:45:22
Done.
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + CertErrorCallback* callback = pending_cert_error_callbacks_.Lookup(id); |
| + if (!callback || callback->is_null()) { |
| + LOG(WARNING) << "Ignoring unexpected ssl error proceed callback"; |
| + return; |
| + } |
| + callback->Run(proceed); |
| + pending_cert_error_callbacks_.Remove(id); |
| +} |
| + |
| +bool RegisterAwContentsClientBridge(JNIEnv* env) { |
| + return RegisterNativesImpl(env) >= 0; |
| +} |
| + |
| +} // namespace android_webview |