是否可以使 chromium 在选项卡崩溃时立即重新加载?

Is it possible to make chromium instantly reload on tab crash?

提问人:svi3c 提问时间:3/21/2022 更新时间:2/7/2023 访问量:229

问:

我们在嵌入式系统上运行 chromium 83,并遇到一些随机标签崩溃。

如果标签崩溃(不显示“Aw snap!”页面),是否可以直接在 chromium 中重新加载标签?

我们目前正在尝试修补源代码以使其正常工作,这就是我们迄今为止的方法。

(都在 sad_tab_helper.cc -> SadTabHelper::RenderProcessGone() 中 方法1:

if (SadTab::ShouldShow(status)) {
  web_contents()->GetController().Reload(content::ReloadType::NORMAL, true);      
}

方法2:

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)

之后,整个浏览器崩溃。有没有办法做我们想做的事,或者我们在这里走在死胡同里?

铬嵌入

评论

0赞 Asesh 3/22/2022
我不认为重新加载是解决这个问题的方法。也许致力于修复渲染器进程错误?
0赞 svi3c 3/23/2022
我完全同意。我们知道这是一个丑陋的解决方法,但浏览器必须 24/7 全天候运行,我们无法在几周内找出根本原因,我们需要尽快发货。我们已经退后了一些 Chromium 版本,因为在 83 版本中,这个问题确实发生频率较低。

答:

1赞 273K 3/22/2022 #1

第二种方法是次优的,只能在UI上运行。SadTabHelper::RenderProcessGone

必须避免在处理来自任何 ( is a ) 的通知时启动导航。这会导致问题。这两种方法都试图做到这一点。我想使用而不是应该会有所帮助。WebContentsObserverSadTabHelperWebContentsObserverbase::PostTaskcontent::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()));
}

评论

0赞 svi3c 3/23/2022
谢谢,在包含正确的头文件后,它就像一个魅力!
0赞 JP Lebel 2/7/2023 #2

我的声誉不够好,无法发表评论,所以我不能把这个评论留在它应该在的地方。

如果您遇到此特定解决方案,则所需的包括:

#include "base/task_scheduler/post_task.h"
#include "content/public/browser/browser_thread.h"
#include "base/bind.h"

评论

0赞 Thomas 2/13/2023
这并不能提供问题的答案。一旦你有足够的声誉,你就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案。- 来自评论