Don't force restart renderer process for in-page navigation

This commit is contained in:
Cheng Zhao 2015-05-11 14:40:40 +08:00
parent 40631edb70
commit d1545a64ae
3 changed files with 19 additions and 0 deletions

View file

@ -6,6 +6,7 @@
#include <set> #include <set>
#include "atom/browser/atom_browser_client.h"
#include "atom/browser/atom_browser_context.h" #include "atom/browser/atom_browser_context.h"
#include "atom/browser/atom_javascript_dialog_manager.h" #include "atom/browser/atom_javascript_dialog_manager.h"
#include "atom/browser/native_window.h" #include "atom/browser/native_window.h"
@ -444,10 +445,12 @@ void WebContents::ReloadIgnoringCache() {
} }
void WebContents::GoBack() { void WebContents::GoBack() {
atom::AtomBrowserClient::SuppressRendererProcessRestartForOnce();
web_contents()->GetController().GoBack(); web_contents()->GetController().GoBack();
} }
void WebContents::GoForward() { void WebContents::GoForward() {
atom::AtomBrowserClient::SuppressRendererProcessRestartForOnce();
web_contents()->GetController().GoForward(); web_contents()->GetController().GoForward();
} }

View file

@ -32,6 +32,9 @@ namespace atom {
namespace { namespace {
// Next navigation should not restart renderer process.
bool g_suppress_renderer_process_restart = false;
struct FindByProcessId { struct FindByProcessId {
explicit FindByProcessId(int child_process_id) explicit FindByProcessId(int child_process_id)
: child_process_id_(child_process_id) { : child_process_id_(child_process_id) {
@ -51,6 +54,11 @@ struct FindByProcessId {
} // namespace } // namespace
// static
void AtomBrowserClient::SuppressRendererProcessRestartForOnce() {
g_suppress_renderer_process_restart = true;
}
AtomBrowserClient::AtomBrowserClient() AtomBrowserClient::AtomBrowserClient()
: dying_render_process_(nullptr) { : dying_render_process_(nullptr) {
} }
@ -131,6 +139,11 @@ void AtomBrowserClient::OverrideSiteInstanceForNavigation(
content::SiteInstance* current_instance, content::SiteInstance* current_instance,
const GURL& url, const GURL& url,
content::SiteInstance** new_instance) { content::SiteInstance** new_instance) {
if (g_suppress_renderer_process_restart) {
g_suppress_renderer_process_restart = false;
return;
}
if (current_instance->HasProcess()) if (current_instance->HasProcess())
dying_render_process_ = current_instance->GetProcess(); dying_render_process_ = current_instance->GetProcess();

View file

@ -18,6 +18,9 @@ class AtomBrowserClient : public brightray::BrowserClient {
AtomBrowserClient(); AtomBrowserClient();
virtual ~AtomBrowserClient(); virtual ~AtomBrowserClient();
// Don't force renderer process to restart for once.
static void SuppressRendererProcessRestartForOnce();
protected: protected:
// content::ContentBrowserClient: // content::ContentBrowserClient:
void RenderProcessWillLaunch(content::RenderProcessHost* host) override; void RenderProcessWillLaunch(content::RenderProcessHost* host) override;