@@ -233,15 +233,29 @@ static void error(int code, int hr) {
233233 SWT .error (code , null , String .format (" [0x%08x]" , hr ));
234234}
235235
236- static IUnknown newCallback (ICoreWebView2SwtCallback handler ) {
237- long punk = COM .CreateSwtWebView2Callback ((arg0 , arg1 ) -> {
236+ // This class should not be replaced by a lambda and not be renamed to ensure compatibility
237+ // with native image generation when using GraalVM
238+ // See https://github.com/eclipse-platform/eclipse.platform.swt/pull/2216
239+ static class HandleCoreWebView2SwtCallback implements ICoreWebView2SwtCallback {
240+ private final ICoreWebView2SwtCallback handler ;
241+
242+ public HandleCoreWebView2SwtCallback (ICoreWebView2SwtCallback handler ) {
243+ this .handler = handler ;
244+ }
245+
246+ @ Override
247+ public int Invoke (long arg0 , long arg1 ) {
238248 inCallback ++;
239249 try {
240250 return handler .Invoke (arg0 , arg1 );
241251 } finally {
242252 inCallback --;
243253 }
244- });
254+ }
255+ }
256+
257+ static IUnknown newCallback (ICoreWebView2SwtCallback handler ) {
258+ long punk = COM .CreateSwtWebView2Callback (new HandleCoreWebView2SwtCallback (handler ));
245259 if (punk == 0 ) error (SWT .ERROR_NO_HANDLES , COM .E_OUTOFMEMORY );
246260 return new IUnknown (punk );
247261}
@@ -789,7 +803,7 @@ void setupBrowser(int hr, long pv) {
789803 handler .Release ();
790804 }
791805
792- IUnknown hostDisp = newHostObject (this :: handleCallJava );
806+ IUnknown hostDisp = newHostObject (new HandleCoreWebView2SwtHost ( this . functions ) );
793807 long [] hostObj = { COM .VT_DISPATCH , hostDisp .getAddress (), 0 }; // VARIANT
794808 webView .AddHostObjectToScript ("swt\0 " .toCharArray (), hostObj );
795809 hostDisp .Release ();
@@ -1020,24 +1034,36 @@ int handleDocumentTitleChanged(long pView, long pArgs) {
10201034 return COM .S_OK ;
10211035}
10221036
1023- long handleCallJava (int index , long bstrToken , long bstrArgsJson ) {
1024- Object result = null ;
1025- String token = bstrToString (bstrToken );
1026- BrowserFunction function = functions .get (index );
1027- if (function != null && token .equals (function .token )) {
1028- inCallback ++;
1029- try {
1030- String argsJson = bstrToString (bstrArgsJson );
1031- Object args = JSON .parse (argsJson .toCharArray ());
1032- result = function .function ((Object []) args );
1033- } catch (Throwable e ) {
1034- result = WebBrowser .CreateErrorString (e .getLocalizedMessage ());
1035- } finally {
1036- inCallback --;
1037+ // This class should not be replaced by a lambda and not be renamed to ensure compatibility
1038+ // with native image generation when using GraalVM
1039+ // See https://github.com/eclipse-platform/eclipse.platform.swt/pull/2216
1040+ static class HandleCoreWebView2SwtHost implements ICoreWebView2SwtHost {
1041+ private final Map <Integer , BrowserFunction > functions ;
1042+
1043+ public HandleCoreWebView2SwtHost (Map <Integer , BrowserFunction > functions ) {
1044+ this .functions = functions ;
1045+ }
1046+
1047+ @ Override
1048+ public long CallJava (int index , long bstrToken , long bstrArgsJson ) {
1049+ Object result = null ;
1050+ String token = bstrToString (bstrToken );
1051+ BrowserFunction function = functions .get (index );
1052+ if (function != null && token .equals (function .token )) {
1053+ inCallback ++;
1054+ try {
1055+ String argsJson = bstrToString (bstrArgsJson );
1056+ Object args = JSON .parse (argsJson .toCharArray ());
1057+ result = function .function ((Object []) args );
1058+ } catch (Throwable e ) {
1059+ result = WebBrowser .CreateErrorString (e .getLocalizedMessage ());
1060+ } finally {
1061+ inCallback --;
1062+ }
10371063 }
1064+ String json = JSON .stringify (result );
1065+ return COM .SysAllocStringLen (json .toCharArray (), json .length ());
10381066 }
1039- String json = JSON .stringify (result );
1040- return COM .SysAllocStringLen (json .toCharArray (), json .length ());
10411067}
10421068
10431069int handleFrameNavigationStarting (long pView , long pArgs ) {
0 commit comments