Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1983)

Unified Diff: android_webview/native/aw_contents_client_bridge.cc

Issue 12091111: Implement Webviewclient.onReceivedSslError (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: wasting time... Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « android_webview/native/aw_contents_client_bridge.h ('k') | android_webview/native/aw_http_auth_handler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..2149ae08478fd875807c4005a67a3795a18936ad
--- /dev/null
+++ b/android_webview/native/aw_contents_client_bridge.cc
@@ -0,0 +1,91 @@
+// 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(), 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) {
+ 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
« no previous file with comments | « android_webview/native/aw_contents_client_bridge.h ('k') | android_webview/native/aw_http_auth_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698