cefsharp / cefsharp/CefSharp

CefSharp.WinForms.Example.netcore crashes when popup window

オープン
#4,656 コメント 5 件 リアクション 0 件 担当者 0 名 GitHub で見る
upstream
主要言語
C#
スター
10.3k
フォーク
2.9k
平均マージ
5日 22時間
マージ済み PR(30日)
4

説明

### 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!!
}
}
})
```

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

まず、Windows 11 上の .NET 6 で CefSharp.WinForms.Example.netcore におけるポップアップウィンドウの開閉シーケンスを繰り返し再現し、次に CefSharp.WinForms\Handler\LifeSpanhandler.cs と BrowserTabUserControl.cs を調査します。提供されている InvokeSyncOnUiThreadIfRequired workaround を含め、DoClose callback とコントロールの破棄順序を追跡します。ポップアップウィンドウを繰り返し閉じてもクラッシュせず、既存の DevTools の破棄動作が維持されれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp
領域
desktop
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
38/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。