blob: 4e6fbdda49d572acefedef9316f2cbd155cb67b1 [file] [log] [blame]
// 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);
}