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

Research direction

Start by reproducing the repeated popup open/close sequence in CefSharp.WinForms.Example.netcore on Windows 11 with .NET 6, then inspect CefSharp.WinForms\Handler\LifeSpanhandler.cs and BrowserTabUserControl.cs. Trace the DoClose callback and control disposal order, including the provided InvokeSyncOnUiThreadIfRequired workaround. Done means repeatedly closing popup windows no longer crashes while the existing DevTools disposal behavior remains intact.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp
Domain
desktop
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.