是否有可能使铬在选项卡崩溃时立即重新加载?

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 上运行。

必须避免在处理来自任何 WebContentsObserverSadTabHelperWebContentsObserver)的通知时启动导航。它会导致问题。这两种方法都试图做到这一点。我想使用 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()));
}