From 4f4fd15fefca9d26c93f4a07b872846ab41b4a42 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Thu, 3 Oct 2024 22:43:42 +0200 Subject: [PATCH] WebView: implement WebViewClient callbacks --- src/api-impl-jni/util.c | 1 + src/api-impl-jni/util.h | 1 + .../widgets/android_webkit_WebView.c | 8 ++++++++ src/api-impl/android/webkit/WebView.java | 16 +++++++++++++++- src/api-impl/android/webkit/WebViewClient.java | 2 ++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/util.c b/src/api-impl-jni/util.c index 0fa58623..b0e9c523 100644 --- a/src/api-impl-jni/util.c +++ b/src/api-impl-jni/util.c @@ -164,6 +164,7 @@ void set_up_handle_cache(JNIEnv *env) handle_cache.webview.class = _REF((*env)->FindClass(env, "android/webkit/WebView")); handle_cache.webview.internalGetAssetManager = _METHOD(handle_cache.webview.class, "internalGetAssetManager", "()Landroid/content/res/AssetManager;"); + handle_cache.webview.internalLoadChanged = _METHOD(handle_cache.webview.class, "internalLoadChanged", "(ILjava/lang/String;)V"); } void extract_from_apk(const char *path, const char *target) { diff --git a/src/api-impl-jni/util.h b/src/api-impl-jni/util.h index 5218e27e..392f5826 100644 --- a/src/api-impl-jni/util.h +++ b/src/api-impl-jni/util.h @@ -114,6 +114,7 @@ struct handle_cache { struct { jclass class; jmethodID internalGetAssetManager; + jmethodID internalLoadChanged; } webview; }; diff --git a/src/api-impl-jni/widgets/android_webkit_WebView.c b/src/api-impl-jni/widgets/android_webkit_WebView.c index c8c84c60..23821651 100644 --- a/src/api-impl-jni/widgets/android_webkit_WebView.c +++ b/src/api-impl-jni/widgets/android_webkit_WebView.c @@ -33,6 +33,13 @@ static void asset_uri_scheme_request_cb(WebKitURISchemeRequest *request, gpointe g_object_unref(stream); } +static void web_view_load_changed(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer user_data) +{ + WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(web_view))); + JNIEnv *env = get_jni_env(); + (*env)->CallVoidMethod(env, wrapper->jobj, handle_cache.webview.internalLoadChanged, load_event, _JSTRING(webkit_web_view_get_uri(web_view))); +} + JNIEXPORT jlong JNICALL Java_android_webkit_WebView_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs) { /* @@ -48,6 +55,7 @@ JNIEXPORT jlong JNICALL Java_android_webkit_WebView_native_1constructor(JNIEnv * wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), webview); wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this); webkit_web_context_register_uri_scheme(webkit_web_view_get_context(WEBKIT_WEB_VIEW(webview)), "android-asset", asset_uri_scheme_request_cb, NULL, NULL); + g_signal_connect(G_OBJECT(webview), "load-changed", G_CALLBACK(web_view_load_changed), NULL); return _INTPTR(webview); } diff --git a/src/api-impl/android/webkit/WebView.java b/src/api-impl/android/webkit/WebView.java index eec02a6c..8e580b33 100644 --- a/src/api-impl/android/webkit/WebView.java +++ b/src/api-impl/android/webkit/WebView.java @@ -6,6 +6,9 @@ import android.util.AttributeSet; import android.view.View; public class WebView extends View { + + private WebViewClient webViewClient; + public WebView(Context context) { this(context, null); } @@ -26,7 +29,18 @@ public class WebView extends View { public void setScrollBarStyle(int scrollBarStyle) {} - public void setWebViewClient(WebViewClient webViewClient) {} + public void setWebViewClient(WebViewClient webViewClient) { + this.webViewClient = webViewClient; + } + + // to be used by native code + void internalLoadChanged(int loadState, String url) { + if (loadState == /*WEBKIT_LOAD_STARTED*/0 && webViewClient != null) { + webViewClient.onPageStarted(this, url); + } else if (loadState == /*WEBKIT_LOAD_FINISHED*/3 && webViewClient != null) { + webViewClient.onPageFinished(this, url); + } + } public void setVerticalScrollBarEnabled(boolean enabled) {} diff --git a/src/api-impl/android/webkit/WebViewClient.java b/src/api-impl/android/webkit/WebViewClient.java index e70340e6..10cedfe1 100644 --- a/src/api-impl/android/webkit/WebViewClient.java +++ b/src/api-impl/android/webkit/WebViewClient.java @@ -1,4 +1,6 @@ package android.webkit; public class WebViewClient { + public void onPageStarted(WebView view, String url) {} + public void onPageFinished(WebView view, String url) {} }