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..1bc7a491c0f7d5c0804b8745f4e064ee79fc94ec |
| --- /dev/null |
| +++ b/android_webview/native/aw_contents_client_bridge.cc |
| @@ -0,0 +1,103 @@ |
| +// 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 "android_webview/native/aw_contents.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) { |
| +} |
| + |
| +AwContentsClientBridge::~AwContentsClientBridge() { |
| +} |
| + |
| +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(); |
| + |
| + std::string der_string; |
| + net::X509Certificate::GetDEREncoded(cert->os_cert_handle(),&der_string); |
|
joth
2013/02/22 01:15:45
nit: space after comma
sgurun-gerrit only
2013/02/22 01:48:07
will fix
On 2013/02/22 01:15:45, joth wrote:
|
| + 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 an asynchronous callback prior to returning. |
|
joth
2013/02/22 01:15:45
I think you mean: an async -> a synchronous ?
sgurun-gerrit only
2013/02/22 01:48:07
yeah.
On 2013/02/22 01:15:45, joth wrote:
|
| + int request_id = pending_cert_error_callbacks_.Add( |
| + new CertErrorCallback(callback)); |
| + *cancel_request = !Java_AwContentsClientBridge_allowCertificateError(env, |
| + java_ref_.get(env).obj(), reinterpret_cast<jint>(cert_error), jcert.obj(), |
|
joth
2013/02/22 01:15:45
java_ref_ is a weak ref, so we need to always prom
sgurun-gerrit only
2013/02/22 01:48:07
Aha... right. But I think I was just looking at th
|
| + 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) { |
| + 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); |
| +} |
| + |
| +// static |
| +// The implementation is here to provide isolation of the browser/ layer |
| +// from the implementation details of native/ layer. |
| +AwCertificateErrorHandlerBase* AwCertificateErrorHandlerBase::FromID( |
| + int render_process_id, |
| + int render_view_id) { |
| + |
| + AwContents* aw_contents = |
| + AwContents::FromID(render_process_id, render_view_id); |
| + if (!aw_contents) return NULL; |
| + return static_cast<AwCertificateErrorHandlerBase*>( |
| + aw_contents->get_aw_contents_client_bridge()); |
| +} |
| + |
| +static jint Init(JNIEnv* env, |
| + jobject obj, |
| + jint aw_contents) { |
| + AwContentsClientBridge* client = new AwContentsClientBridge(env, obj); |
| + AwContents* native_aw_contents = reinterpret_cast<AwContents*>(aw_contents); |
| + DCHECK(native_aw_contents); |
| + DCHECK(!native_aw_contents->get_aw_contents_client_bridge()); |
| + native_aw_contents->set_aw_contents_client_bridge(client); |
| + return reinterpret_cast<jint>(client); |
| +} |
| + |
| +bool RegisterAwContentsClientBridge(JNIEnv* env) { |
| + return RegisterNativesImpl(env) >= 0; |
| +} |
| + |
| +} // namespace android_webview |