Skip to content

Commit 97c24b9

Browse files
fedejeanneHeikoKlare
authored andcommitted
Check if the browser is disposed before scheduling runnable in Edge
For the unlikely (but possible) case in which the callback is executed too late and the browser/display has already been disposed. Add a new private method to funnel all calls to Display::asyncExec and check there if the display is still usable.
1 parent 10cc2e6 commit 97c24b9

File tree

1 file changed

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

1 file changed

+12
-7
lines changed

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ void browserDispose(Event event) {
840840
if (inCallback > 0) {
841841
ICoreWebView2Controller controller1 = controller;
842842
controller.put_IsVisible(false);
843-
browser.getDisplay().asyncExec(() -> {
843+
asyncExec(() -> {
844844
controller1.Close();
845845
controller1.Release();
846846
});
@@ -1004,7 +1004,7 @@ private String getExposedUrl(String url) {
10041004
}
10051005

10061006
int handleCloseRequested(long pView, long pArgs) {
1007-
browser.getDisplay().asyncExec(() -> {
1007+
asyncExec(() -> {
10081008
if (browser.isDisposed()) return;
10091009
WindowEvent event = new WindowEvent(browser);
10101010
event.display = browser.getDisplay();
@@ -1022,7 +1022,7 @@ int handleDocumentTitleChanged(long pView, long pArgs) {
10221022
long[] ppsz = new long[1];
10231023
webViewProvider.getWebView(false).get_DocumentTitle(ppsz);
10241024
String title = wstrToString(ppsz[0], true);
1025-
browser.getDisplay().asyncExec(() -> {
1025+
asyncExec(() -> {
10261026
if (browser.isDisposed()) return;
10271027
TitleEvent event = new TitleEvent(browser);
10281028
event.display = browser.getDisplay();
@@ -1152,7 +1152,7 @@ int handleSourceChanged(long pView, long pArgs) {
11521152
} else {
11531153
location = url;
11541154
}
1155-
browser.getDisplay().asyncExec(() -> {
1155+
asyncExec(() -> {
11561156
if (browser.isDisposed()) return;
11571157
LocationEvent event = new LocationEvent(browser);
11581158
event.display = browser.getDisplay();
@@ -1169,7 +1169,7 @@ int handleSourceChanged(long pView, long pArgs) {
11691169
}
11701170

11711171
void sendProgressCompleted() {
1172-
browser.getDisplay().asyncExec(() -> {
1172+
asyncExec(() -> {
11731173
if (browser.isDisposed()) return;
11741174
ProgressEvent event = new ProgressEvent(browser);
11751175
event.display = browser.getDisplay();
@@ -1326,7 +1326,7 @@ int handleNavigationCompleted(long pView, long pArgs, boolean top) {
13261326
int[] pIsSuccess = new int[1];
13271327
args.get_IsSuccess(pIsSuccess);
13281328
if (pIsSuccess[0] != 0) {
1329-
browser.getDisplay().asyncExec(() -> {
1329+
asyncExec(() -> {
13301330
if (browser.isDisposed()) return;
13311331
LocationEvent event = new LocationEvent(browser);
13321332
event.display = browser.getDisplay();
@@ -1426,12 +1426,17 @@ int handleNewWindowRequested(long pView, long pArgs) {
14261426
if (inEvaluate) {
14271427
openWindowHandler.run();
14281428
} else {
1429-
browser.getDisplay().asyncExec(openWindowHandler);
1429+
asyncExec(openWindowHandler);
14301430
}
14311431

14321432
return COM.S_OK;
14331433
}
14341434

1435+
private void asyncExec(Runnable r) {
1436+
if (browser.isDisposed()) return;
1437+
browser.getDisplay().asyncExec(r);
1438+
}
1439+
14351440
int handleGotFocus(long pView, long pArg) {
14361441
if (ignoreGotFocus) {
14371442
ignoreGotFocus = false;

0 commit comments

Comments
 (0)