chromiumchromium-embedded

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


We are running chromium 83 on an embedded system and experience some random tab crashes.

Is it possible to directly reload a tab in chromium, if it crashes (without showing the "Aw snap!" page)?

We're currently trying to patch the source code to get it working and those were our approaches so far.

(both in sad_tab_helper.cc -> SadTabHelper::RenderProcessGone() Approach 1:

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

Approach 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())));
}

Both changes finally lead to crash of the entire browser.

It seems that chromium tries to reload the page but as said, it then crashes. The log we get are:

[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)

After that the entire browser crashes. Is there a way to do what we want or are we on a dead end here?


Solution

  • The second approach is suboptimal, SadTabHelper::RenderProcessGone only runs on UI.

    Initiating navigation while handling notifications from any WebContentsObserver (SadTabHelper is a WebContentsObserver) must be avoided. It leads to problems. The both approaches attempt to do this. I suppose using base::PostTask instead of content::RunOrPostTaskOnThread should help.

    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()));
    }