From 17e9c6ea3b550cf8e20343ca484b88d06d951deb Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 7 Apr 2013 23:38:22 +0800 Subject: [PATCH] Restart renderer process when reloaded for 4 times. Fix #481. --- native/atom_cef_client.cpp | 11 +++++++++++ native/atom_cef_client.h | 1 + src/app/atom.coffee | 3 +++ src/app/window.coffee | 9 ++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/native/atom_cef_client.cpp b/native/atom_cef_client.cpp index 6ddf00ce1..8c697fba8 100644 --- a/native/atom_cef_client.cpp +++ b/native/atom_cef_client.cpp @@ -90,6 +90,9 @@ bool AtomCefClient::OnProcessMessageReceived(CefRefPtr browser, else if (name == "crash") { __builtin_trap(); } + else if (name == "restartRendererProcess") { + RestartRendererProcess(browser); + } else { return false; } @@ -252,3 +255,11 @@ bool AtomCefClient::Save(const std::string& path, const std::string& data) { fclose(f); return true; } + +void AtomCefClient::RestartRendererProcess(CefRefPtr browser) { + // Navigating to the same URL has the effect of restarting the renderer + // process, because cefode has overridden ContentBrowserClient's + // ShouldSwapProcessesForNavigation method. + CefRefPtr frame = browser->GetFocusedFrame(); + frame->LoadURL(frame->GetURL()); +} diff --git a/native/atom_cef_client.h b/native/atom_cef_client.h index 494009c5c..0e49194b5 100644 --- a/native/atom_cef_client.h +++ b/native/atom_cef_client.h @@ -99,6 +99,7 @@ class AtomCefClient : public CefClient, void EndTracing(); bool Save(const std::string& path, const std::string& data); + void RestartRendererProcess(CefRefPtr browser); protected: CefRefPtr m_Browser; diff --git a/src/app/atom.coffee b/src/app/atom.coffee index 7807af1c3..ada93c5d4 100644 --- a/src/app/atom.coffee +++ b/src/app/atom.coffee @@ -126,6 +126,9 @@ _.extend atom, newWindow: (args...) -> @sendMessageToBrowserProcess('newWindow', args) + restartRendererProcess: -> + @sendMessageToBrowserProcess('restartRendererProcess') + confirm: (message, detailedMessage, buttonLabelsAndCallbacks...) -> wrapCallback = (callback) => => @dismissModal(callback) @presentModal => diff --git a/src/app/window.coffee b/src/app/window.coffee index d2d70894c..2c2175565 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -154,7 +154,14 @@ window.applyStylesheet = (id, text, ttype = 'bundled') -> $("head").append "" window.reload = -> - $native.reload() + timesReloaded = process.global.timesReloaded ? 0 + ++timesReloaded + + if timesReloaded > 3 + atom.restartRendererProcess() + else + $native.reload() + process.global.timesReloaded = timesReloaded window.onerror = -> atom.showDevTools()