CefSharp.WinForms.Example.netcore crashes when popup window
- Lenguaje dominante
- C#
- Estrellas
- 10.3k
- Forks
- 2.9k
- Merge medio
- 5 d 22 h
- PR fusionados (30 d)
- 4
Descripción
### 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

### 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
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!!
}
}
})
```
Guía de contribución
Línea de trabajo
Empieza reproduciendo la secuencia repetida de apertura y cierre de ventanas emergentes en CefSharp.WinForms.Example.netcore en Windows 11 con .NET 6, y después inspecciona CefSharp.WinForms\Handler\LifeSpanhandler.cs y BrowserTabUserControl.cs. Traza la devolución de llamada DoClose y el orden de disposición de los controles, incluido el workaround proporcionado InvokeSyncOnUiThreadIfRequired. La tarea estará completada cuando cerrar repetidamente las ventanas emergentes ya no provoque fallos y el comportamiento existente de disposición de DevTools se mantenga intacto.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- csharp
- Área
- desktop
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100