Skip to content

Commit 649bb49

Browse files
tnikolai2HeikoKlare
authored andcommitted
[Edge] Change lambdas for OS callbacks to classes
Contributes to supporting native images (GraalVM) for Edge.
1 parent 89a168f commit 649bb49

File tree

1 file changed

+46
-20
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser

1 file changed

+46
-20
lines changed

bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10431069
int handleFrameNavigationStarting(long pView, long pArgs) {

0 commit comments

Comments
 (0)