Skip to content

Commit d901d53

Browse files
committed
[GTK4] Migrate to API version 6.0 of webkit and jsc
With the most recent GTK4s the API version is now 6.0 for webkit/jsc and a lot of [deprecated items have been removed](https://webkitgtk.org/reference/webkitgtk/2.50.1/migrating-to-webkitgtk-6.0.html#stop-using-deprecated-apis). This commit brings some of the key implementations to the new webkit API when using GTK4. To make it easier to ensure I don't regress anything I had working, I marked all known tests that need attention for GTK4 with `@Tag("gtk4-todo")`. This allows running the test suite with exclude tag of `gtk4-todo` and have a fast and clean run. This includes a g_critical call when webkitgtk.c cannot dynamically load a called method. When a method cannot be loaded it fairly silently fails (normally returns 0). With the g_critical it makes it easier to spot the problems. This includes a change to the looping while waiting for a response from the async script to make timeout more accurate to the default 10s. TODOs: - [ ] I plan to split this PR up into a few component parts - [ ] Cookies - [ ] Arrays of items (gtk4_convertToJava missing jsc_value_is_object case) - [ ] a bunch of OpenWindowListener cases (see `@Tag("gtk4-todo")` tests) - [ ] probably more - [ ] check which version of API we can use as a reasonable minimum, in particular do we need to deal with API version 5 (version 4 was the version of the API that aligned with GTK3) Fixes #2667
1 parent 92db85c commit d901d53

File tree

6 files changed

+448
-10
lines changed

6 files changed

+448
-10
lines changed

bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk.c

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,186 @@ JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(JSValueToStringCopy)
243243
}
244244
#endif
245245

246+
#ifndef NO_jsc_1value_1is_1boolean
247+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1boolean)
248+
(JNIEnv *env, jclass that, jlong arg0)
249+
{
250+
jboolean rc = 0;
251+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1boolean_FUNC);
252+
/*
253+
rc = (jboolean)jsc_value_is_boolean(arg0);
254+
*/
255+
{
256+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_boolean)
257+
if (fp) {
258+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
259+
}
260+
}
261+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1boolean_FUNC);
262+
return rc;
263+
}
264+
#endif
265+
266+
#ifndef NO_jsc_1value_1is_1null
267+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1null)
268+
(JNIEnv *env, jclass that, jlong arg0)
269+
{
270+
jboolean rc = 0;
271+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1null_FUNC);
272+
/*
273+
rc = (jboolean)jsc_value_is_null(arg0);
274+
*/
275+
{
276+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_null)
277+
if (fp) {
278+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
279+
}
280+
}
281+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1null_FUNC);
282+
return rc;
283+
}
284+
#endif
285+
286+
#ifndef NO_jsc_1value_1is_1number
287+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1number)
288+
(JNIEnv *env, jclass that, jlong arg0)
289+
{
290+
jboolean rc = 0;
291+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1number_FUNC);
292+
/*
293+
rc = (jboolean)jsc_value_is_number(arg0);
294+
*/
295+
{
296+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_number)
297+
if (fp) {
298+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
299+
}
300+
}
301+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1number_FUNC);
302+
return rc;
303+
}
304+
#endif
305+
306+
#ifndef NO_jsc_1value_1is_1object
307+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1object)
308+
(JNIEnv *env, jclass that, jlong arg0)
309+
{
310+
jboolean rc = 0;
311+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1object_FUNC);
312+
/*
313+
rc = (jboolean)jsc_value_is_object(arg0);
314+
*/
315+
{
316+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_object)
317+
if (fp) {
318+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
319+
}
320+
}
321+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1object_FUNC);
322+
return rc;
323+
}
324+
#endif
325+
326+
#ifndef NO_jsc_1value_1is_1string
327+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1string)
328+
(JNIEnv *env, jclass that, jlong arg0)
329+
{
330+
jboolean rc = 0;
331+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1string_FUNC);
332+
/*
333+
rc = (jboolean)jsc_value_is_string(arg0);
334+
*/
335+
{
336+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_string)
337+
if (fp) {
338+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
339+
}
340+
}
341+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1string_FUNC);
342+
return rc;
343+
}
344+
#endif
345+
346+
#ifndef NO_jsc_1value_1is_1undefined
347+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1is_1undefined)
348+
(JNIEnv *env, jclass that, jlong arg0)
349+
{
350+
jboolean rc = 0;
351+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1is_1undefined_FUNC);
352+
/*
353+
rc = (jboolean)jsc_value_is_undefined(arg0);
354+
*/
355+
{
356+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_is_undefined)
357+
if (fp) {
358+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
359+
}
360+
}
361+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1is_1undefined_FUNC);
362+
return rc;
363+
}
364+
#endif
365+
366+
#ifndef NO_jsc_1value_1to_1boolean
367+
JNIEXPORT jboolean JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1boolean)
368+
(JNIEnv *env, jclass that, jlong arg0)
369+
{
370+
jboolean rc = 0;
371+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1boolean_FUNC);
372+
/*
373+
rc = (jboolean)jsc_value_to_boolean(arg0);
374+
*/
375+
{
376+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_boolean)
377+
if (fp) {
378+
rc = (jboolean)((jboolean (CALLING_CONVENTION*)(jlong))fp)(arg0);
379+
}
380+
}
381+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1boolean_FUNC);
382+
return rc;
383+
}
384+
#endif
385+
386+
#ifndef NO_jsc_1value_1to_1double
387+
JNIEXPORT jdouble JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1double)
388+
(JNIEnv *env, jclass that, jlong arg0)
389+
{
390+
jdouble rc = 0;
391+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1double_FUNC);
392+
/*
393+
rc = (jdouble)jsc_value_to_double(arg0);
394+
*/
395+
{
396+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_double)
397+
if (fp) {
398+
rc = (jdouble)((jdouble (CALLING_CONVENTION*)(jlong))fp)(arg0);
399+
}
400+
}
401+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1double_FUNC);
402+
return rc;
403+
}
404+
#endif
405+
406+
#ifndef NO_jsc_1value_1to_1string
407+
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(jsc_1value_1to_1string)
408+
(JNIEnv *env, jclass that, jlong arg0)
409+
{
410+
jlong rc = 0;
411+
WebKitGTK_NATIVE_ENTER(env, that, jsc_1value_1to_1string_FUNC);
412+
/*
413+
rc = (jlong)jsc_value_to_string(arg0);
414+
*/
415+
{
416+
WebKitGTK_LOAD_FUNCTION(fp, jsc_value_to_string)
417+
if (fp) {
418+
rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
419+
}
420+
}
421+
WebKitGTK_NATIVE_EXIT(env, that, jsc_1value_1to_1string_FUNC);
422+
return rc;
423+
}
424+
#endif
425+
246426
#ifndef NO_soup_1cookie_1get_1name
247427
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(soup_1cookie_1get_1name)
248428
(JNIEnv *env, jclass that, jlong arg0)
@@ -1225,6 +1405,46 @@ JNIEXPORT void JNICALL WebKitGTK_NATIVE(webkit_1javascript_1result_1unref)
12251405
}
12261406
#endif
12271407

1408+
#ifndef NO_webkit_1navigation_1action_1get_1request
1409+
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1navigation_1action_1get_1request)
1410+
(JNIEnv *env, jclass that, jlong arg0)
1411+
{
1412+
jlong rc = 0;
1413+
WebKitGTK_NATIVE_ENTER(env, that, webkit_1navigation_1action_1get_1request_FUNC);
1414+
/*
1415+
rc = (jlong)webkit_navigation_action_get_request(arg0);
1416+
*/
1417+
{
1418+
WebKitGTK_LOAD_FUNCTION(fp, webkit_navigation_action_get_request)
1419+
if (fp) {
1420+
rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
1421+
}
1422+
}
1423+
WebKitGTK_NATIVE_EXIT(env, that, webkit_1navigation_1action_1get_1request_FUNC);
1424+
return rc;
1425+
}
1426+
#endif
1427+
1428+
#ifndef NO_webkit_1navigation_1policy_1decision_1get_1navigation_1action
1429+
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1navigation_1policy_1decision_1get_1navigation_1action)
1430+
(JNIEnv *env, jclass that, jlong arg0)
1431+
{
1432+
jlong rc = 0;
1433+
WebKitGTK_NATIVE_ENTER(env, that, webkit_1navigation_1policy_1decision_1get_1navigation_1action_FUNC);
1434+
/*
1435+
rc = (jlong)webkit_navigation_policy_decision_get_navigation_action(arg0);
1436+
*/
1437+
{
1438+
WebKitGTK_LOAD_FUNCTION(fp, webkit_navigation_policy_decision_get_navigation_action)
1439+
if (fp) {
1440+
rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong))fp)(arg0);
1441+
}
1442+
}
1443+
WebKitGTK_NATIVE_EXIT(env, that, webkit_1navigation_1policy_1decision_1get_1navigation_1action_FUNC);
1444+
return rc;
1445+
}
1446+
#endif
1447+
12281448
#ifndef NO_webkit_1navigation_1policy_1decision_1get_1request
12291449
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1navigation_1policy_1decision_1get_1request)
12301450
(JNIEnv *env, jclass that, jlong arg0)
@@ -1878,6 +2098,52 @@ JNIEXPORT jint JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1can_1show_1mime_1type
18782098
}
18792099
#endif
18802100

2101+
#ifndef NO_webkit_1web_1view_1evaluate_1javascript
2102+
JNIEXPORT void JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1evaluate_1javascript)
2103+
(JNIEnv *env, jclass that, jlong arg0, jbyteArray arg1, jlong arg2, jlong arg3, jlong arg4, jlong arg5, jlong arg6, jlong arg7)
2104+
{
2105+
jbyte *lparg1=NULL;
2106+
WebKitGTK_NATIVE_ENTER(env, that, webkit_1web_1view_1evaluate_1javascript_FUNC);
2107+
if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
2108+
/*
2109+
webkit_web_view_evaluate_javascript(arg0, lparg1, arg2, arg3, arg4, arg5, arg6, arg7);
2110+
*/
2111+
{
2112+
WebKitGTK_LOAD_FUNCTION(fp, webkit_web_view_evaluate_javascript)
2113+
if (fp) {
2114+
((void (CALLING_CONVENTION*)(jlong, jbyte *, jlong, jlong, jlong, jlong, jlong, jlong))fp)(arg0, lparg1, arg2, arg3, arg4, arg5, arg6, arg7);
2115+
}
2116+
}
2117+
fail:
2118+
if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0);
2119+
WebKitGTK_NATIVE_EXIT(env, that, webkit_1web_1view_1evaluate_1javascript_FUNC);
2120+
}
2121+
#endif
2122+
2123+
#ifndef NO_webkit_1web_1view_1evaluate_1javascript_1finish
2124+
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1evaluate_1javascript_1finish)
2125+
(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlongArray arg2)
2126+
{
2127+
jlong *lparg2=NULL;
2128+
jlong rc = 0;
2129+
WebKitGTK_NATIVE_ENTER(env, that, webkit_1web_1view_1evaluate_1javascript_1finish_FUNC);
2130+
if (arg2) if ((lparg2 = (*env)->GetLongArrayElements(env, arg2, NULL)) == NULL) goto fail;
2131+
/*
2132+
rc = (jlong)webkit_web_view_evaluate_javascript_finish(arg0, arg1, (GError **)lparg2);
2133+
*/
2134+
{
2135+
WebKitGTK_LOAD_FUNCTION(fp, webkit_web_view_evaluate_javascript_finish)
2136+
if (fp) {
2137+
rc = (jlong)((jlong (CALLING_CONVENTION*)(jlong, jlong, GError **))fp)(arg0, arg1, (GError **)lparg2);
2138+
}
2139+
}
2140+
fail:
2141+
if (arg2 && lparg2) (*env)->ReleaseLongArrayElements(env, arg2, lparg2, 0);
2142+
WebKitGTK_NATIVE_EXIT(env, that, webkit_1web_1view_1evaluate_1javascript_1finish_FUNC);
2143+
return rc;
2144+
}
2145+
#endif
2146+
18812147
#ifndef NO_webkit_1web_1view_1get_1context
18822148
JNIEXPORT jlong JNICALL WebKitGTK_NATIVE(webkit_1web_1view_1get_1context)
18832149
(JNIEnv *env, jclass that, jlong arg0)

bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
} \
5353
if (handle) { \
5454
var = dlsym(handle, #name); \
55+
if (!var) { g_critical("SWT webkitgtk: Failed to load webkit function %s", #name); } \
5556
} \
5657
CHECK_DLERROR \
5758
initialized = 1; \

bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/library/webkitgtk_stats.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ typedef enum {
3434
JSValueGetType_FUNC,
3535
JSValueToNumber_FUNC,
3636
JSValueToStringCopy_FUNC,
37+
jsc_1value_1is_1boolean_FUNC,
38+
jsc_1value_1is_1null_FUNC,
39+
jsc_1value_1is_1number_FUNC,
40+
jsc_1value_1is_1object_FUNC,
41+
jsc_1value_1is_1string_FUNC,
42+
jsc_1value_1is_1undefined_FUNC,
43+
jsc_1value_1to_1boolean_FUNC,
44+
jsc_1value_1to_1double_FUNC,
45+
jsc_1value_1to_1string_FUNC,
3746
soup_1cookie_1get_1name_FUNC,
3847
soup_1cookie_1get_1value_FUNC,
3948
soup_1cookie_1parse_FUNC,
@@ -82,6 +91,8 @@ typedef enum {
8291
webkit_1javascript_1result_1get_1global_1context_FUNC,
8392
webkit_1javascript_1result_1get_1value_FUNC,
8493
webkit_1javascript_1result_1unref_FUNC,
94+
webkit_1navigation_1action_1get_1request_FUNC,
95+
webkit_1navigation_1policy_1decision_1get_1navigation_1action_FUNC,
8596
webkit_1navigation_1policy_1decision_1get_1request_FUNC,
8697
webkit_1network_1session_1get_1default_FUNC,
8798
webkit_1policy_1decision_1download_FUNC,
@@ -114,6 +125,8 @@ typedef enum {
114125
webkit_1web_1view_1can_1go_1back_FUNC,
115126
webkit_1web_1view_1can_1go_1forward_FUNC,
116127
webkit_1web_1view_1can_1show_1mime_1type_FUNC,
128+
webkit_1web_1view_1evaluate_1javascript_FUNC,
129+
webkit_1web_1view_1evaluate_1javascript_1finish_FUNC,
117130
webkit_1web_1view_1get_1context_FUNC,
118131
webkit_1web_1view_1get_1estimated_1load_1progress_FUNC,
119132
webkit_1web_1view_1get_1find_1controller_FUNC,

0 commit comments

Comments
 (0)