From d1545a64aeffcbd7ae4f207d72ea4fb29b3840f6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 11 May 2015 14:40:40 +0800 Subject: [PATCH] Don't force restart renderer process for in-page navigation --- atom/browser/api/atom_api_web_contents.cc | 3 +++ atom/browser/atom_browser_client.cc | 13 +++++++++++++ atom/browser/atom_browser_client.h | 3 +++ 3 files changed, 19 insertions(+) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 558b26b9d110..ddb05cfdfeaa 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -6,6 +6,7 @@ #include +#include "atom/browser/atom_browser_client.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/atom_javascript_dialog_manager.h" #include "atom/browser/native_window.h" @@ -444,10 +445,12 @@ void WebContents::ReloadIgnoringCache() { } void WebContents::GoBack() { + atom::AtomBrowserClient::SuppressRendererProcessRestartForOnce(); web_contents()->GetController().GoBack(); } void WebContents::GoForward() { + atom::AtomBrowserClient::SuppressRendererProcessRestartForOnce(); web_contents()->GetController().GoForward(); } diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 1d00f6bdcf03..fbc09d9fe15f 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -32,6 +32,9 @@ namespace atom { namespace { +// Next navigation should not restart renderer process. +bool g_suppress_renderer_process_restart = false; + struct FindByProcessId { explicit FindByProcessId(int child_process_id) : child_process_id_(child_process_id) { @@ -51,6 +54,11 @@ struct FindByProcessId { } // namespace +// static +void AtomBrowserClient::SuppressRendererProcessRestartForOnce() { + g_suppress_renderer_process_restart = true; +} + AtomBrowserClient::AtomBrowserClient() : dying_render_process_(nullptr) { } @@ -131,6 +139,11 @@ void AtomBrowserClient::OverrideSiteInstanceForNavigation( content::SiteInstance* current_instance, const GURL& url, content::SiteInstance** new_instance) { + if (g_suppress_renderer_process_restart) { + g_suppress_renderer_process_restart = false; + return; + } + if (current_instance->HasProcess()) dying_render_process_ = current_instance->GetProcess(); diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index cda0bd8e5cfb..cc69a1e12de8 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -18,6 +18,9 @@ class AtomBrowserClient : public brightray::BrowserClient { AtomBrowserClient(); virtual ~AtomBrowserClient(); + // Don't force renderer process to restart for once. + static void SuppressRendererProcessRestartForOnce(); + protected: // content::ContentBrowserClient: void RenderProcessWillLaunch(content::RenderProcessHost* host) override;