cefsharp / cefsharp/CefSharp

CefSharp.WinForms.Example.netcore crashes when popup window

Ouverte
#4,656 5 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
upstream
Langage dominant
C#
Étoiles
10.3k
Forks
2.9k
Merge moyen
5 j 22 h
PR mergées (30 j)
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!!
}
}
})
```

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par reproduire la séquence répétée d’ouverture et de fermeture des fenêtres popup dans CefSharp.WinForms.Example.netcore sous Windows 11 avec .NET 6, puis inspectez CefSharp.WinForms\Handler\LifeSpanhandler.cs et BrowserTabUserControl.cs. Suivez le callback DoClose et l’ordre de libération des contrôles, y compris le workaround fourni InvokeSyncOnUiThreadIfRequired. Le travail est terminé lorsque la fermeture répétée des fenêtres popup ne provoque plus de plantage et que le comportement existant de libération de DevTools reste intact.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp
Domaine
desktop
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.