118 lines
4.5 KiB
Java
Executable File
118 lines
4.5 KiB
Java
Executable File
// 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);
|
|
}
|
|
};
|
|
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);
|
|
}
|