是否有可能使铬在选项卡崩溃时立即重新加载?
Is it possible to make chromium instantly reload on tab crash?
我们是嵌入式系统上的 运行 chromium 83,遇到了一些随机选项卡崩溃问题。
是否可以在 chromium 中直接重新加载选项卡,如果它崩溃(不显示“Aw snap!”页面)?
我们目前正在尝试修补源代码以使其正常工作,目前我们的方法就是这些。
(都在 sad_tab_helper.cc -> SadTabHelper::RenderProcessGone()
方法一:
if (SadTab::ShouldShow(status)) {
web_contents()->GetController().Reload(content::ReloadType::NORMAL, true);
}
方法二:
if (SadTab::ShouldShow(status)) {
content::RunOrPostTaskOnThread(
FROM_HERE,
content::BrowserThread::ID::UI,
base::BindOnce(
[](content::WebContents* contents) {
contents->GetController().Reload(content::ReloadType::NORMAL, true);
},
std::move(web_contents())));
}
这两项更改最终导致整个浏览器崩溃。
chromium 似乎试图重新加载页面,但如前所述,它随后崩溃了。我们得到的日志是:
[1663:1671:0321/090914.211931:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: http://127.0.0.1/login
[1663:1671:0321/090919.082378:ERROR:broker_posix.cc(40)] Recvmsg error: Connection reset by peer (104)
之后整个浏览器崩溃。有没有办法做我们想做的事,还是我们走入了死胡同?
第二种方法不是最优的,SadTabHelper::RenderProcessGone
仅在 UI 上运行。
必须避免在处理来自任何 WebContentsObserver
(SadTabHelper
是 WebContentsObserver
)的通知时启动导航。它会导致问题。这两种方法都试图做到这一点。我想使用 base::PostTask
而不是 content::RunOrPostTaskOnThread
应该会有帮助。
if (SadTab::ShouldShow(status)) {
base::PostTask(
FROM_HERE,
{content::BrowserThread::UI},
base::BindOnce(
[](content::WebContents* contents) {
contents->GetController().Reload(content::ReloadType::NORMAL, true);
},
web_contents()));
}
我们是嵌入式系统上的 运行 chromium 83,遇到了一些随机选项卡崩溃问题。
是否可以在 chromium 中直接重新加载选项卡,如果它崩溃(不显示“Aw snap!”页面)?
我们目前正在尝试修补源代码以使其正常工作,目前我们的方法就是这些。
(都在 sad_tab_helper.cc -> SadTabHelper::RenderProcessGone() 方法一:
if (SadTab::ShouldShow(status)) {
web_contents()->GetController().Reload(content::ReloadType::NORMAL, true);
}
方法二:
if (SadTab::ShouldShow(status)) {
content::RunOrPostTaskOnThread(
FROM_HERE,
content::BrowserThread::ID::UI,
base::BindOnce(
[](content::WebContents* contents) {
contents->GetController().Reload(content::ReloadType::NORMAL, true);
},
std::move(web_contents())));
}
这两项更改最终导致整个浏览器崩溃。
chromium 似乎试图重新加载页面,但如前所述,它随后崩溃了。我们得到的日志是:
[1663:1671:0321/090914.211931:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: http://127.0.0.1/login
[1663:1671:0321/090919.082378:ERROR:broker_posix.cc(40)] Recvmsg error: Connection reset by peer (104)
之后整个浏览器崩溃。有没有办法做我们想做的事,还是我们走入了死胡同?
第二种方法不是最优的,SadTabHelper::RenderProcessGone
仅在 UI 上运行。
必须避免在处理来自任何 WebContentsObserver
(SadTabHelper
是 WebContentsObserver
)的通知时启动导航。它会导致问题。这两种方法都试图做到这一点。我想使用 base::PostTask
而不是 content::RunOrPostTaskOnThread
应该会有帮助。
if (SadTab::ShouldShow(status)) {
base::PostTask(
FROM_HERE,
{content::BrowserThread::UI},
base::BindOnce(
[](content::WebContents* contents) {
contents->GetController().Reload(content::ReloadType::NORMAL, true);
},
web_contents()));
}