| // Copyright 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. |
| |
| package org.chromium.android_webview; |
| |
| import android.net.http.SslCertificate; |
| import android.net.http.SslError; |
| import android.webkit.ValueCallback; |
| |
| import org.chromium.base.CalledByNative; |
| import org.chromium.base.JNINamespace; |
| |
| /** |
| * This class handles the JNI communication logic for the the AwContentsClient class. |
| * Both the Java and the native peers of AwContentsClientBridge are owned by the |
| * corresponding AwContents instances. This class and its native peer are connected |
| * via weak references. The native AwContentsClientBridge sets up and clear these weak |
| * references. |
| */ |
| @JNINamespace("android_webview") |
| public class AwContentsClientBridge { |
| |
| private AwContentsClient mClient; |
| // The native peer of this object. |
| private long mNativeContentsClientBridge; |
| |
| public AwContentsClientBridge(AwContentsClient client) { |
| assert client != null; |
| mClient = client; |
| } |
| |
| // Used by the native peer to set/reset a weak ref to the native peer. |
| @CalledByNative |
| private void setNativeContentsClientBridge(long nativeContentsClientBridge) { |
| mNativeContentsClientBridge = nativeContentsClientBridge; |
| } |
| |
| // If returns false, the request is immediately canceled, and any call to proceedSslError |
| // has no effect. If returns true, the request should be canceled or proceeded using |
| // proceedSslError(). |
| // Unlike the webview classic, we do not keep keep a database of certificates that |
| // are allowed by the user, because this functionality is already handled via |
| // ssl_policy in native layers. |
| @CalledByNative |
| private boolean allowCertificateError(int certError, byte[] derBytes, final String url, |
| final int id) { |
| final SslCertificate cert = SslUtil.getCertificateFromDerBytes(derBytes); |
| if (cert == null) { |
| // if the certificate or the client is null, cancel the request |
| return false; |
| } |
| final SslError sslError = SslUtil.sslErrorFromNetErrorCode(certError, cert, url); |
| ValueCallback<Boolean> callback = new ValueCallback<Boolean>() { |
| @Override |
| public void onReceiveValue(Boolean value) { |
| proceedSslError(value.booleanValue(), id); |
| if (!value) { |
| // For backward compatibility with the classic |
| // webview, call onPageFinished after canceling ssl error. |
| AwContentsClientBridge.this.mClient.onPageFinished(url); |
| } |
| } |
| }; |
| mClient.onReceivedSslError(callback, sslError); |
| return true; |
| } |
| |
| private void proceedSslError(boolean proceed, int id) { |
| if (mNativeContentsClientBridge == 0) return; |
| nativeProceedSslError(mNativeContentsClientBridge, proceed, id); |
| } |
| |
| @CalledByNative |
| private void handleJsAlert(String url, String message, int id) { |
| JsResultHandler handler = new JsResultHandler(this, id); |
| mClient.handleJsAlert(url, message, handler); |
| } |
| |
| @CalledByNative |
| private void handleJsConfirm(String url, String message, int id) { |
| JsResultHandler handler = new JsResultHandler(this, id); |
| mClient.handleJsConfirm(url, message, handler); |
| } |
| |
| @CalledByNative |
| private void handleJsPrompt(String url, String message, String defaultValue, int id) { |
| JsResultHandler handler = new JsResultHandler(this, id); |
| mClient.handleJsPrompt(url, message, defaultValue, handler); |
| } |
| |
| @CalledByNative |
| private void handleJsBeforeUnload(String url, String message, int id) { |
| JsResultHandler handler = new JsResultHandler(this, id); |
| mClient.handleJsBeforeUnload(url, message, handler); |
| } |
| |
| @CalledByNative |
| private boolean shouldOverrideUrlLoading(String url) { |
| return mClient.shouldOverrideUrlLoading(url); |
| } |
| |
| void confirmJsResult(int id, String prompt) { |
| if (mNativeContentsClientBridge == 0) return; |
| nativeConfirmJsResult(mNativeContentsClientBridge, id, prompt); |
| } |
| |
| void cancelJsResult(int id) { |
| if (mNativeContentsClientBridge == 0) return; |
| nativeCancelJsResult(mNativeContentsClientBridge, id); |
| } |
| |
| //-------------------------------------------------------------------------------------------- |
| // Native methods |
| //-------------------------------------------------------------------------------------------- |
| private native void nativeProceedSslError(long nativeAwContentsClientBridge, boolean proceed, |
| int id); |
| |
| private native void nativeConfirmJsResult(long nativeAwContentsClientBridge, int id, |
| String prompt); |
| private native void nativeCancelJsResult(long nativeAwContentsClientBridge, int id); |
| } |