From 8b6b89087ff80ba3f66773142906648740f7ccae Mon Sep 17 00:00:00 2001 From: Nicolai Timofeev Date: Sat, 19 Apr 2025 10:25:52 +0300 Subject: [PATCH] Support Native Image for Edge Also need add to jni-config.json: [ { "name": "org.eclipse.swt.browser.Edge$HandleCoreWebView2SwtCallback", "methods": [ { "name": "Invoke", "parameterTypes": ["long", "long"] } ] }, { "name": "org.eclipse.swt.browser.Edge$HandleCoreWebView2SwtHost", "methods": [ { "name": "CallJava", "parameterTypes": ["int", "long", "long"] } ] } ] --- .../win32/org/eclipse/swt/browser/Edge.java | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java index 0ce5bf0726..5ededadd2f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/Edge.java @@ -233,15 +233,24 @@ static void error(int code, int hr) { SWT.error(code, null, String.format(" [0x%08x]", hr)); } -static IUnknown newCallback(ICoreWebView2SwtCallback handler) { - long punk = COM.CreateSwtWebView2Callback((arg0, arg1) -> { +static class HandleCoreWebView2SwtCallback implements ICoreWebView2SwtCallback { + private final ICoreWebView2SwtCallback handler; + public HandleCoreWebView2SwtCallback(ICoreWebView2SwtCallback handler) { + this.handler = handler; + } + @Override + public int Invoke(long arg0, long arg1) { inCallback++; try { return handler.Invoke(arg0, arg1); } finally { inCallback--; } - }); + } +} + +static IUnknown newCallback(ICoreWebView2SwtCallback handler) { + long punk = COM.CreateSwtWebView2Callback(new HandleCoreWebView2SwtCallback(handler)); if (punk == 0) error(SWT.ERROR_NO_HANDLES, COM.E_OUTOFMEMORY); return new IUnknown(punk); } @@ -789,7 +798,7 @@ void setupBrowser(int hr, long pv) { handler.Release(); } - IUnknown hostDisp = newHostObject(this::handleCallJava); + IUnknown hostDisp = newHostObject(new HandleCoreWebView2SwtHost(this.functions)); long[] hostObj = { COM.VT_DISPATCH, hostDisp.getAddress(), 0 }; // VARIANT webView.AddHostObjectToScript("swt\0".toCharArray(), hostObj); hostDisp.Release(); @@ -1012,24 +1021,31 @@ int handleDocumentTitleChanged(long pView, long pArgs) { return COM.S_OK; } -long handleCallJava(int index, long bstrToken, long bstrArgsJson) { - Object result = null; - String token = bstrToString(bstrToken); - BrowserFunction function = functions.get(index); - if (function != null && token.equals (function.token)) { - inCallback++; - try { - String argsJson = bstrToString(bstrArgsJson); - Object args = JSON.parse(argsJson.toCharArray()); - result = function.function ((Object[]) args); - } catch (Throwable e) { - result = WebBrowser.CreateErrorString(e.getLocalizedMessage()); - } finally { - inCallback--; +static class HandleCoreWebView2SwtHost implements ICoreWebView2SwtHost { + private final Map functions; + public HandleCoreWebView2SwtHost(Map functions) { + this.functions = functions; + } + @Override + public long CallJava(int index, long bstrToken, long bstrArgsJson) { + Object result = null; + String token = bstrToString(bstrToken); + BrowserFunction function = functions.get(index); + if (function != null && token.equals (function.token)) { + inCallback++; + try { + String argsJson = bstrToString(bstrArgsJson); + Object args = JSON.parse(argsJson.toCharArray()); + result = function.function ((Object[]) args); + } catch (Throwable e) { + result = WebBrowser.CreateErrorString(e.getLocalizedMessage()); + } finally { + inCallback--; + } } - } - String json = JSON.stringify(result); - return COM.SysAllocStringLen(json.toCharArray(), json.length()); + String json = JSON.stringify(result); + return COM.SysAllocStringLen(json.toCharArray(), json.length()); + } } int handleFrameNavigationStarting(long pView, long pArgs) {