CefSharp.WinForms.Example.netcore crashes when popup window
- Vorherrschende Sprache
- C#
- Sterne
- 10.3k
- Forks
- 2.9k
- Ø Merge
- 5 T. 22 Std.
- Gemergte PRs (30 T.)
- 4
Beschreibung
### 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!!
}
}
})
```
Beitragsleitfaden
Rechercherichtung
Beginne damit, die wiederholte Sequenz zum Öffnen und Schließen von Popup-Fenstern in CefSharp.WinForms.Example.netcore unter Windows 11 mit .NET 6 zu reproduzieren, und untersuche anschließend CefSharp.WinForms\Handler\LifeSpanhandler.cs und BrowserTabUserControl.cs. Verfolge den DoClose-Callback und die Reihenfolge der Freigabe der Steuerelemente, einschließlich des bereitgestellten Workarounds InvokeSyncOnUiThreadIfRequired. Als erledigt gilt die Aufgabe, wenn das wiederholte Schließen von Popup-Fenstern keine Abstürze mehr verursacht und das bestehende Verhalten bei der Freigabe von DevTools weiterhin unverändert bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- csharp
- Bereich
- desktop
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 38/100