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 |