cefsharp / cefsharp/CefSharp

CefSharp.WinForms.Example.netcore crashes when popup window

Open
#4,656 5 comments 0 reactions 0 assignees View on GitHub
upstream
Dominant language
C#
Stars
10.3k
Forks
2.9k
Avg merge
5d 22h
Merged PRs (30d)
4

Description

### Is there an existing issue for this?

- [X] I have searched both open/closed issues, no issue already exists.

### CefSharp Version

120.1.80

### Operating System

Windows 11

### Architecture

x64

### .Net Version

.Net 6.0

### Implementation

WinForms

### Reproduction Steps

1. Run CefSharp.WinForms.Example.netcore
2. Show popup window
3. Close popup window
4. Repeat 2 - 3.

### Expected behavior

Expectations is that it will not crash when you close the popup window

### Actual behavior

![crash](https://github.com/cefsharp/CefSharp/assets/53356723/7e7c58f5-ac77-4dbc-932a-461451f0d634)

### Regression?

_No response_

### Known Workarounds

Is this due to DoClose in LifeSpanHandler.cs?
Excluding control.Dispose() from InnvokeSyncOnUiThreadIfRequired stops crashing.

### Does this problem also occur in the CEF Sample Application

No

### Other information

html source
``` html

Popup!
Close!

const popup_open = () => {
window.open("index.html?pop=on")
}
const popup_close = () => {
parent.window.close()
}
const params = new URLSearchParams(document.location.search)
if (params.has("pop")) {
document.getElementById("open").style.display = "none"
document.title = "Popup!!"
} else {
document.getElementById("close").style.display = "none"
document.title = "Popup Main"
}

```
edit source code
CefSharp.WinForms\Handler\LifeSpanhandler.cs
``` c#
control.InvokeSyncOnUiThreadIfRequired(new Action(() =>
{
onPopupDestroyed?.Invoke(control, browser);

//control.Dispose(); // Comment out!!
}));
// Add
control.InvokeOnUiThreadIfRequired(new Action(() =>
{
control.Dispose();
}));
```
CefSharp.WinForms.Example\BrowserTabUserControl.cs
``` c#
.OnPopupDestroyed((ctrl, popupBrowser) =>
{
//If we docked DevTools (hosted it ourselves rather than the default popup)
//Used when the BrowserTabUserControl.ShowDevToolsDocked method is called
if (popupBrowser.MainFrame.Url.Equals("devtools://devtools/devtools_app.html"))
{
//Dispose of the parent control we used to host DevTools, this will release the DevTools window handle
//and the ILifeSpanHandler.OnBeforeClose() will be call after.
ctrl.Dispose();
}
else
{
//If browser is disposed or the handle has been released then we don't
//need to remove the tab in this example. The user likely used the
// File -> Close Tab menu option which also calls BrowserForm.RemoveTab
if (!ctrl.IsDisposed && ctrl.IsHandleCreated)
{
if (ctrl.FindForm() is BrowserForm owner)
{
owner.RemoveTab(ctrl);
}

//ctrl.Dispose(); // Comment out!!
}
}
})
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.