diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk.c b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk.c index bfa0feadfc..495683fa4a 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk.c +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk.c @@ -243,6 +243,270 @@ JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(JSValueToStringCopy) } #endif +#ifndef NO_jsc_1value_1is_1boolean +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1boolean) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1boolean_FUNC); +/* + rc = (jboolean)jsc_value_is_boolean(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_boolean) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1boolean_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1is_1null +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1null) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1null_FUNC); +/* + rc = (jboolean)jsc_value_is_null(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_null) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1null_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1is_1number +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1number) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1number_FUNC); +/* + rc = (jboolean)jsc_value_is_number(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_number) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1number_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1is_1object +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1object) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1object_FUNC); +/* + rc = (jboolean)jsc_value_is_object(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_object) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1object_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1is_1string +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1string) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1string_FUNC); +/* + rc = (jboolean)jsc_value_is_string(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_string) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1string_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1is_1typed_1array +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1typed_1array) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1typed_1array_FUNC); +/* + rc = (jboolean)jsc_value_is_typed_array(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_typed_array) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1typed_1array_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1is_1undefined +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1undefined) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1undefined_FUNC); +/* + rc = (jboolean)jsc_value_is_undefined(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_undefined) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1undefined_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1object_1get_1property +JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(jsc_1value_1object_1get_1property) + (JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1) +{ + jbyte *lparg1=NULL; + jlong rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1object_1get_1property_FUNC); + if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail; +/* + rc = (jlong)jsc_value_object_get_property(arg0, lparg1); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_object_get_property) + if (fp) { + rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jbyte *))fp)(arg0, lparg1); + } + } +fail: + if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0); + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1object_1get_1property_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1object_1get_1property_1at_1index +JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(jsc_1value_1object_1get_1property_1at_1index) + (JNIEnv *env, jclass that, jlong arg0, jint arg1) +{ + jlong rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1object_1get_1property_1at_1index_FUNC); +/* + rc = (jlong)jsc_value_object_get_property_at_index(arg0, arg1); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_object_get_property_at_index) + if (fp) { + rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jint))fp)(arg0, arg1); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1object_1get_1property_1at_1index_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1to_1boolean +JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1boolean) + (JNIEnv *env, jclass that, jlong arg0) +{ + jboolean rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1boolean_FUNC); +/* + rc = (jboolean)jsc_value_to_boolean(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_boolean) + if (fp) { + rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1boolean_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1to_1double +JNIEXPORT jdouble JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1double) + (JNIEnv *env, jclass that, jlong arg0) +{ + jdouble rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1double_FUNC); +/* + rc = (jdouble)jsc_value_to_double(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_double) + if (fp) { + rc = (jdouble)((jdouble (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1double_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1to_1int32 +JNIEXPORT jint JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1int32) + (JNIEnv *env, jclass that, jlong arg0) +{ + jint rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1int32_FUNC); +/* + rc = (jint)jsc_value_to_int32(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_int32) + if (fp) { + rc = (jint)((jint (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1int32_FUNC); + return rc; +} +#endif + +#ifndef NO_jsc_1value_1to_1string +JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1string) + (JNIEnv *env, jclass that, jlong arg0) +{ + jlong rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1string_FUNC); +/* + rc = (jlong)jsc_value_to_string(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_string) + if (fp) { + rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1string_FUNC); + return rc; +} +#endif + #ifndef NO_soup_1cookie_1get_1name JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(soup_1cookie_1get_1name) (JNIEnv *env, jclass that, jlong arg0) @@ -1225,6 +1489,46 @@ JNIEXPORT void JNICALL WebKitGTK_NATIVE(webkit_1javascript_1result_1unref) } #endif +#ifndef NO_webkit_1navigation_1action_1get_1request +JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1navigation_1action_1get_1request) + (JNIEnv *env, jclass that, jlong arg0) +{ + jlong rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, webkit_1navigation_1action_1get_1request_FUNC); +/* + rc = (jlong)webkit_navigation_action_get_request(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, webkit_navigation_action_get_request) + if (fp) { + rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, webkit_1navigation_1action_1get_1request_FUNC); + return rc; +} +#endif + +#ifndef NO_webkit_1navigation_1policy_1decision_1get_1navigation_1action +JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1navigation_1policy_1decision_1get_1navigation_1action) + (JNIEnv *env, jclass that, jlong arg0) +{ + jlong rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, webkit_1navigation_1policy_1decision_1get_1navigation_1action_FUNC); +/* + rc = (jlong)webkit_navigation_policy_decision_get_navigation_action(arg0); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, webkit_navigation_policy_decision_get_navigation_action) + if (fp) { + rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0); + } + } + WebKitGTK_NATIVE_EXIT(env, that, webkit_1navigation_1policy_1decision_1get_1navigation_1action_FUNC); + return rc; +} +#endif + #ifndef NO_webkit_1navigation_1policy_1decision_1get_1request JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1navigation_1policy_1decision_1get_1request) (JNIEnv *env, jclass that, jlong arg0) @@ -1918,6 +2222,52 @@ JNIEXPORT jint JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1can_1show_1mime_1type } #endif +#ifndef NO_webkit_1web_1view_1evaluate_1javascript +JNIEXPORT void JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1evaluate_1javascript) + (JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7) +{ + jbyte *lparg1=NULL; + WebKitGTK_NATIVE_ENTER(env, that, webkit_1web_1view_1evaluate_1javascript_FUNC); + if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail; +/* + webkit_web_view_evaluate_javascript(arg0, lparg1, arg2, arg3, arg4, arg5, arg6, arg7); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, webkit_web_view_evaluate_javascript) + if (fp) { + ((void (CALLING_CONVENTION*)(jlong, jbyte *, jlong, jlong, jlong, jlong, jlong, jlong))fp)(arg0, lparg1, arg2, arg3, arg4, arg5, arg6, arg7); + } + } +fail: + if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0); + WebKitGTK_NATIVE_EXIT(env, that, webkit_1web_1view_1evaluate_1javascript_FUNC); +} +#endif + +#ifndef NO_webkit_1web_1view_1evaluate_1javascript_1finish +JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1evaluate_1javascript_1finish) + (JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2) +{ + jlong *lparg2=NULL; + jlong rc = 0; + WebKitGTK_NATIVE_ENTER(env, that, webkit_1web_1view_1evaluate_1javascript_1finish_FUNC); + if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail; +/* + rc = (jlong)webkit_web_view_evaluate_javascript_finish(arg0, arg1, (GError **)lparg2); +*/ + { + WebKitGTK_LOAD_FUNCTION(fp, webkit_web_view_evaluate_javascript_finish) + if (fp) { + rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jlong, GError **))fp)(arg0, arg1, (GError **)lparg2); + } + } +fail: + if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0); + WebKitGTK_NATIVE_EXIT(env, that, webkit_1web_1view_1evaluate_1javascript_1finish_FUNC); + return rc; +} +#endif + #ifndef NO_webkit_1web_1view_1get_1context JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1get_1context) (JNIEnv *env, jclass that, jlong arg0) diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk_stats.h b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk_stats.h index 7dcbcb57ce..28a2efad11 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk_stats.h +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk_stats.h @@ -34,6 +34,19 @@ typedef enum { JSValueGetType_FUNC, JSValueToNumber_FUNC, JSValueToStringCopy_FUNC, + jsc_1value_1is_1boolean_FUNC, + jsc_1value_1is_1null_FUNC, + jsc_1value_1is_1number_FUNC, + jsc_1value_1is_1object_FUNC, + jsc_1value_1is_1string_FUNC, + jsc_1value_1is_1typed_1array_FUNC, + jsc_1value_1is_1undefined_FUNC, + jsc_1value_1object_1get_1property_FUNC, + jsc_1value_1object_1get_1property_1at_1index_FUNC, + jsc_1value_1to_1boolean_FUNC, + jsc_1value_1to_1double_FUNC, + jsc_1value_1to_1int32_FUNC, + jsc_1value_1to_1string_FUNC, soup_1cookie_1get_1name_FUNC, soup_1cookie_1get_1value_FUNC, soup_1cookie_1parse_FUNC, @@ -82,6 +95,8 @@ typedef enum { webkit_1javascript_1result_1get_1global_1context_FUNC, webkit_1javascript_1result_1get_1value_FUNC, webkit_1javascript_1result_1unref_FUNC, + webkit_1navigation_1action_1get_1request_FUNC, + webkit_1navigation_1policy_1decision_1get_1navigation_1action_FUNC, webkit_1navigation_1policy_1decision_1get_1request_FUNC, webkit_1network_1session_1get_1cookie_1manager_FUNC, webkit_1network_1session_1get_1default_FUNC, @@ -116,6 +131,8 @@ typedef enum { webkit_1web_1view_1can_1go_1back_FUNC, webkit_1web_1view_1can_1go_1forward_FUNC, webkit_1web_1view_1can_1show_1mime_1type_FUNC, + webkit_1web_1view_1evaluate_1javascript_FUNC, + webkit_1web_1view_1evaluate_1javascript_1finish_FUNC, webkit_1web_1view_1get_1context_FUNC, webkit_1web_1view_1get_1estimated_1load_1progress_FUNC, webkit_1web_1view_1get_1find_1controller_FUNC, diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java index 89a86a0a36..7846cdbfba 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java @@ -954,7 +954,11 @@ private static class Webkit2AsyncToSync { private static Callback getCookie_callback; static { - runjavascript_callback = new Callback(Webkit2AsyncToSync.class, "runjavascript_callback", void.class, new Type[] {long.class, long.class, long.class}); + if (GTK.GTK4) { + runjavascript_callback = new Callback(Webkit2AsyncToSync.class, "gtk4_runjavascript_callback", void.class, new Type[] {long.class, long.class, long.class}); + } else { + runjavascript_callback = new Callback(Webkit2AsyncToSync.class, "gtk3_runjavascript_callback", void.class, new Type[] {long.class, long.class, long.class}); + } getText_callback = new Callback(Webkit2AsyncToSync.class, "getText_callback", void.class, new Type[] {long.class, long.class, long.class}); setCookie_callback = new Callback(Webkit2AsyncToSync.class, "setCookie_callback", void.class, new Type[] {long.class, long.class, long.class}); getCookie_callback = new Callback(Webkit2AsyncToSync.class, "getCookie_callback", void.class, new Type[] {long.class, long.class, long.class}); @@ -1056,13 +1060,26 @@ static Object evaluate (String script, Browser browser, long webView) { static Object runjavascript(String script, Browser browser, long webView) { if (nonBlockingEvaluate > 0) { // Execute script, but do not wait for async call to complete. (assume it does). Bug 512001. - WebKitGTK.webkit_web_view_run_javascript(webView, Converter.wcsToMbcs(script, true), 0, 0, 0); + if (GTK.GTK4) { + byte[] wcsToMbcs = Converter.wcsToMbcs(script, false); + WebKitGTK.webkit_web_view_evaluate_javascript(webView, wcsToMbcs, wcsToMbcs.length, 0, 0, 0, 0, 0); + } else { + WebKitGTK.webkit_web_view_run_javascript(webView, Converter.wcsToMbcs(script, true), 0, 0, 0); + } return null; } else { // Callback logic: Initiate an async callback and wait for it to finish. // The callback comes back in runjavascript_callback(..) below. - Consumer asyncFunc = (callbackId) -> - WebKitGTK.webkit_web_view_run_javascript(webView, Converter.wcsToMbcs(script, true), 0, runjavascript_callback.getAddress(), callbackId); + Consumer asyncFunc = (callbackId) -> { + if (GTK.GTK4) { + byte[] wcsToMbcs = Converter.wcsToMbcs(script, false); + WebKitGTK.webkit_web_view_evaluate_javascript(webView, wcsToMbcs, wcsToMbcs.length, 0, 0, 0, + runjavascript_callback.getAddress(), callbackId); + } else { + WebKitGTK.webkit_web_view_run_javascript(webView, Converter.wcsToMbcs(script, true), 0, runjavascript_callback.getAddress(), + callbackId); + } + }; Webkit2AsyncReturnObj retObj = execAsyncAndWaitForReturn(browser, asyncFunc, " The following javascript was executed:\n" + script +"\n\n"); @@ -1078,7 +1095,36 @@ static Object runjavascript(String script, Browser browser, long webView) { } @SuppressWarnings("unused") // Only called directly from C (from javascript). - private static void runjavascript_callback (long GObject_source, long GAsyncResult, long user_data) { + private static void gtk4_runjavascript_callback (long GObject_source, long GAsyncResult, long user_data) { + int callbackId = (int) user_data; + Webkit2AsyncReturnObj retObj = CallBackMap.getObj(callbackId); + + if (retObj != null) { // retObj can be null if there was a timeout. + long [] gerror = new long [1]; // GError ** + long jsc_value = WebKitGTK.webkit_web_view_evaluate_javascript_finish(GObject_source, GAsyncResult, gerror); + if (jsc_value == 0) { + long errMsg = OS.g_error_get_message(gerror[0]); + String msg = Converter.cCharPtrToJavaString(errMsg, false); + OS.g_error_free(gerror[0]); + + retObj.errorNum = SWT.ERROR_FAILED_EVALUATE; + retObj.errorMsg = msg != null ? msg : ""; + } else { + try { + retObj.returnValue = gtk4_convertToJava(jsc_value); + } catch (IllegalArgumentException ex) { + retObj.errorNum = SWT.ERROR_INVALID_RETURN_VALUE; + retObj.errorMsg = "Type of return value not is not valid. For supported types see: Browser.evaluate() JavaDoc"; + } + OS.g_object_unref (jsc_value); + } + retObj.callbackFinished = true; + } + Display.getCurrent().wake(); + } + + @SuppressWarnings("unused") // Only called directly from C (from javascript). + private static void gtk3_runjavascript_callback (long GObject_source, long GAsyncResult, long user_data) { int callbackId = (int) user_data; Webkit2AsyncReturnObj retObj = CallBackMap.getObj(callbackId); @@ -1097,7 +1143,7 @@ private static void runjavascript_callback (long GObject_source, long GAsyncResu long value = WebKitGTK.webkit_javascript_result_get_value (js_result); try { - retObj.returnValue = convertToJava(context, value); + retObj.returnValue = gtk3_convertToJava(context, value); } catch (IllegalArgumentException ex) { retObj.errorNum = SWT.ERROR_INVALID_RETURN_VALUE; retObj.errorMsg = "Type of return value not is not valid. For supported types see: Browser.evaluate() JavaDoc"; @@ -2341,7 +2387,16 @@ long webkit_hovering_over_link (long web_view, long title, long uri) { long webkit_decide_policy (long web_view, long decision, int decision_type, long user_data) { switch (decision_type) { case WebKitGTK.WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: - long request = WebKitGTK. webkit_navigation_policy_decision_get_request(decision); + long request; + if (GTK.GTK4) { + long navigation = WebKitGTK. webkit_navigation_policy_decision_get_navigation_action(decision); + if (navigation == 0) { + return 0; + } + request = WebKitGTK.webkit_navigation_action_get_request(navigation); + } else { + request = WebKitGTK. webkit_navigation_policy_decision_get_request(decision); + } if (request == 0){ return 0; } @@ -2813,7 +2868,39 @@ private void search(long findController, Supplier currentText, Consumer< } } -static Object convertToJava (long ctx, long value) { +static Object gtk4_convertToJava(long jsc_value) { + if (WebKitGTK.jsc_value_is_boolean(jsc_value)) { + return WebKitGTK.jsc_value_to_boolean(jsc_value); + } else if (WebKitGTK.jsc_value_is_number(jsc_value)) { + double result = WebKitGTK.jsc_value_to_double(jsc_value); + return Double.valueOf(result); + } else if (WebKitGTK.jsc_value_is_string(jsc_value)) { + long string = WebKitGTK.jsc_value_to_string(jsc_value); + if (string == 0) + return ""; //$NON-NLS-1$ + return Converter.cCharPtrToJavaString(string, true); + } else if (WebKitGTK.jsc_value_is_null(jsc_value) || WebKitGTK.jsc_value_is_undefined(jsc_value)) { + return null; + } else if (WebKitGTK.jsc_value_is_object(jsc_value)) { + long jsc_length = WebKitGTK.jsc_value_object_get_property(jsc_value, Converter.wcsToMbcs(PROPERTY_LENGTH, true)); + if (WebKitGTK.jsc_value_is_number(jsc_length)) { + int length = WebKitGTK.jsc_value_to_int32(jsc_length); + Object[] result = new Object[length]; + for (int i = 0; i < length; i++) { + long jsc_value_at_i = WebKitGTK.jsc_value_object_get_property_at_index (jsc_value, i); + if (jsc_value_at_i != 0) { + result[i] = gtk4_convertToJava (jsc_value_at_i); + } + } + return result; + } + } + + SWT.error(SWT.ERROR_INVALID_ARGUMENT); + return null; +} + +static Object gtk3_convertToJava (long ctx, long value) { int type = WebKitGTK.JSValueGetType (ctx, value); switch (type) { case WebKitGTK.kJSTypeBoolean: { @@ -2849,7 +2936,7 @@ static Object convertToJava (long ctx, long value) { for (int i = 0; i < length; i++) { long current = WebKitGTK.JSObjectGetPropertyAtIndex (ctx, value, i, null); if (current != 0) { - result[i] = convertToJava (ctx, current); + result[i] = gtk3_convertToJava (ctx, current); } } return result; diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java index b8b422b7c8..7405ded244 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/internal/webkit/WebKitGTK.java @@ -353,6 +353,12 @@ public class WebKitGTK extends C { /** @method flags=dynamic */ public static final native long webkit_navigation_policy_decision_get_request(long decision); +/** @method flags=dynamic */ +public static final native long webkit_navigation_policy_decision_get_navigation_action(long decision); + +/** @method flags=dynamic */ +public static final native long webkit_navigation_action_get_request(long navigation); + /** @method flags=dynamic */ public static final native void webkit_policy_decision_download(long decision); @@ -488,6 +494,81 @@ public class WebKitGTK extends C { /*WebKitJavascriptResult * webkit_web_view_run_javascript_finish (WebKitWebView *web_view, GAsyncResult *result, GError **error);*/ public static final native long webkit_web_view_run_javascript_finish(long web_view, long GAsyncResult, long [] gerror); +/* + * void webkit_web_view_evaluate_javascript ( WebKitWebView* web_view, const + * char* script, gssize length, const char* world_name, const char* source_uri, + * GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data ) + */ +/** + * @method flags=dynamic + */ +public static final native void webkit_web_view_evaluate_javascript(long web_view, byte[] script, long length, + long world_name, long source_uri, long cancellable, long callback, long user_data); + +/** + * @method flags=dynamic + * @param error cast=(GError **) + */ +/* + * JSCValue* webkit_web_view_evaluate_javascript_finish ( WebKitWebView* + * web_view, GAsyncResult* result, GError** error ) + */ +public static final native long webkit_web_view_evaluate_javascript_finish(long web_view, long result, long [] error); + +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_boolean(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_to_boolean(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_string(long value); +/** + * @method flags=dynamic + */ +public static final native long jsc_value_to_string(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_null(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_undefined(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_object(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_number(long value); +/** + * @method flags=dynamic + */ +public static final native double jsc_value_to_double(long value); +/** + * @method flags=dynamic + */ +public static final native int jsc_value_to_int32(long value); +/** + * @method flags=dynamic + */ +public static final native boolean jsc_value_is_typed_array(long value); +/** + * @method flags=dynamic + */ +public static final native long jsc_value_object_get_property(long value, byte[] name); +/** + * @method flags=dynamic + */ +public static final native long jsc_value_object_get_property_at_index(long value, int index); + + /** @method flags=dynamic */ public static final native void webkit_web_view_stop_loading(long web_view);