Skip to content

Commit 4ea366e

Browse files
committed
Edge: Implement ICoreWebView2_12 to send out StatusTextEvents
1 parent 70aee87 commit 4ea366e

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ class WebViewProvider {
284284
private CompletableFuture<ICoreWebView2> webViewFuture = new CompletableFuture<>();
285285
private CompletableFuture<ICoreWebView2_2> webView_2Future = new CompletableFuture<>();
286286
private CompletableFuture<ICoreWebView2_11> webView_11Future = new CompletableFuture<>();
287+
private CompletableFuture<ICoreWebView2_12> webView_12Future = new CompletableFuture<>();
287288

288289
private CompletableFuture<Void> lastWebViewTask = webViewFuture.thenRun(() -> {});
289290

@@ -293,6 +294,7 @@ ICoreWebView2 initializeWebView(ICoreWebView2Controller controller) {
293294
final ICoreWebView2 webView = new ICoreWebView2(ppv[0]);
294295
initializeWebView_2(webView);
295296
initializeWebView_11(webView);
297+
initializeWebView_12(webView);
296298
webViewFuture.complete(webView);
297299
return webView;
298300
}
@@ -317,6 +319,16 @@ private void initializeWebView_11(ICoreWebView2 webView) {
317319
}
318320
}
319321

322+
private void initializeWebView_12(ICoreWebView2 webView) {
323+
long[] ppv = new long[1];
324+
int hr = webView.QueryInterface(COM.IID_ICoreWebView2_12, ppv);
325+
if (hr == COM.S_OK) {
326+
webView_12Future.complete(new ICoreWebView2_12(ppv[0]));
327+
} else {
328+
webView_12Future.cancel(true);
329+
}
330+
}
331+
320332
ICoreWebView2 getWebView(boolean waitForPendingWebviewTasksToFinish) {
321333
if(waitForPendingWebviewTasksToFinish) {
322334
waitForFutureToFinish(lastWebViewTask);
@@ -348,6 +360,18 @@ boolean isWebView_11Available() {
348360
return !webView_11Future.isCancelled();
349361
}
350362

363+
ICoreWebView2_12 getWebView_12(boolean waitForPendingWebviewTasksToFinish) {
364+
if(waitForPendingWebviewTasksToFinish) {
365+
waitForFutureToFinish(lastWebViewTask);
366+
}
367+
return webView_12Future.join();
368+
}
369+
370+
boolean isWebView_12Available() {
371+
waitForFutureToFinish(webView_12Future);
372+
return !webView_12Future.isCancelled();
373+
}
374+
351375
/*
352376
* Schedule a given runnable in a queue to execute when the webView is free and
353377
* has finished all the pending tasks queued before it.
@@ -561,6 +585,11 @@ void setupBrowser(int hr, long pv) {
561585
webViewProvider.getWebView_11(false).add_ContextMenuRequested(handler, token);
562586
handler.Release();
563587
}
588+
if (webViewProvider.isWebView_12Available()) {
589+
handler = newCallback(this::handleStatusBarTextChanged);
590+
webViewProvider.getWebView_12(false).add_StatusBarTextChanged(handler, token);
591+
handler.Release();
592+
}
564593

565594
IUnknown hostDisp = newHostObject(this::handleCallJava);
566595
long[] hostObj = { COM.VT_DISPATCH, hostDisp.getAddress(), 0 }; // VARIANT
@@ -587,6 +616,7 @@ void browserDispose(Event event) {
587616
if (settings != null) settings.Release();
588617
if (webViewProvider.isWebView_2Available()) webViewProvider.getWebView_2(false).Release();
589618
if (webViewProvider.isWebView_11Available()) webViewProvider.getWebView_11(false).Release();
619+
if (webViewProvider.isWebView_12Available()) webViewProvider.getWebView_12(false).Release();
590620
if(controller != null) {
591621
// Bug in WebView2. Closing the controller from an event handler results
592622
// in a crash. The fix is to delay the closure with asyncExec.
@@ -866,6 +896,20 @@ int handleContextMenuRequested(long pView, long pArgs) {
866896
return COM.S_OK;
867897
}
868898

899+
int handleStatusBarTextChanged(long pView, long pArgs) {
900+
long ppsz[] = new long[1];
901+
webViewProvider.getWebView_12(true).get_StatusBarText(ppsz);
902+
String text = wstrToString(ppsz[0], true);
903+
StatusTextEvent newEvent5 = new StatusTextEvent(browser);
904+
newEvent5.display = browser.getDisplay();
905+
newEvent5.widget = browser;
906+
newEvent5.text = text;
907+
for (StatusTextListener statusTextListener : statusTextListeners) {
908+
statusTextListener.changed(newEvent5);
909+
}
910+
return COM.S_OK;
911+
}
912+
869913
int handleNavigationCompleted(long pView, long pArgs) {
870914
return handleNavigationCompleted(pView, pArgs, true);
871915
}

bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/COM.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public class COM extends OS {
8787
public static final GUID IID_ICoreWebView2Environment2 = IIDFromString("{41F3632B-5EF4-404F-AD82-2D606C5A9A21}"); //$NON-NLS-1$
8888
public static final GUID IID_ICoreWebView2_2 = IIDFromString("{9E8F0CF8-E670-4B5E-B2BC-73E061E3184C}"); //$NON-NLS-1$
8989
public static final GUID IID_ICoreWebView2_11 = IIDFromString("{0BE78E56-C193-4051-B943-23B460C08BDB}"); //$NON-NLS-1$
90+
public static final GUID IID_ICoreWebView2_12 = IIDFromString("{35D69927-BCFA-4566-9349-6B3E0D154CAC}"); //$NON-NLS-1$
9091

9192
// IA2 related GUIDS
9293
public static final GUID IIDIAccessible2 = IIDFromString("{E89F726E-C4F4-4c19-BB19-B647D7FA8478}"); //$NON-NLS-1$
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 SAP SE and others.
3+
*
4+
* This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License 2.0
6+
* which accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* SAP SE - initial implementation
13+
*******************************************************************************/
14+
package org.eclipse.swt.internal.ole.win32;
15+
16+
public class ICoreWebView2_12 extends ICoreWebView2_11 {
17+
18+
public ICoreWebView2_12(long address) {
19+
super(address);
20+
}
21+
22+
public int add_StatusBarTextChanged(IUnknown eventHandler, long[] token) {
23+
return COM.VtblCall(102, address, eventHandler.getAddress(), token);
24+
}
25+
26+
public int remove_StatusBarTextChanged(long[] token) {
27+
return COM.VtblCall(103, address, token);
28+
}
29+
30+
public int get_StatusBarText(long[] value) {
31+
return COM.VtblCall(104, address, value);
32+
}
33+
34+
}

0 commit comments

Comments
 (0)