提问人:svi3c 提问时间:3/21/2022 更新时间:2/7/2023 访问量:229
是否可以使 chromium 在选项卡崩溃时立即重新加载?
Is it possible to make chromium instantly reload on tab crash?
问:
我们在嵌入式系统上运行 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)
之后,整个浏览器崩溃。有没有办法做我们想做的事,或者我们在这里走在死胡同里?
答:
1赞
273K
3/22/2022
#1
第二种方法是次优的,只能在UI上运行。SadTabHelper::RenderProcessGone
必须避免在处理来自任何 ( is a ) 的通知时启动导航。这会导致问题。这两种方法都试图做到这一点。我想使用而不是应该会有所帮助。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()));
}
评论
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"
评论