Commit 2447e4f0 authored by gbillock@chromium.org's avatar gbillock@chromium.org

Forward handling of low-mem message to the content renderer client. Add APIs to handle this case.

Found from Coverity CID=16390

R=jam@chromium.org
BUG=
TEST=none


Review URL: http://codereview.chromium.org/7222023

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@95896 0039d316-1c4b-4281-b951-d872f2087c98
parent 352412f5
...@@ -152,7 +152,7 @@ ChromeContentRendererClient::~ChromeContentRendererClient() { ...@@ -152,7 +152,7 @@ ChromeContentRendererClient::~ChromeContentRendererClient() {
} }
void ChromeContentRendererClient::RenderThreadStarted() { void ChromeContentRendererClient::RenderThreadStarted() {
chrome_observer_.reset(new ChromeRenderProcessObserver()); chrome_observer_.reset(new ChromeRenderProcessObserver(this));
extension_dispatcher_.reset(new ExtensionDispatcher()); extension_dispatcher_.reset(new ExtensionDispatcher());
histogram_snapshots_.reset(new RendererHistogramSnapshots()); histogram_snapshots_.reset(new RendererHistogramSnapshots());
net_predictor_.reset(new RendererNetPredictor()); net_predictor_.reset(new RendererNetPredictor());
...@@ -215,7 +215,7 @@ void ChromeContentRendererClient::RenderViewCreated(RenderView* render_view) { ...@@ -215,7 +215,7 @@ void ChromeContentRendererClient::RenderViewCreated(RenderView* render_view) {
new PageLoadHistograms(render_view, histogram_snapshots_.get()); new PageLoadHistograms(render_view, histogram_snapshots_.get());
new PrintWebViewHelper(render_view); new PrintWebViewHelper(render_view);
new SearchBox(render_view); new SearchBox(render_view);
new SpellCheckProvider(render_view, spellcheck_.get()); spellcheck_provider_ = new SpellCheckProvider(render_view, spellcheck_.get());
#if defined(ENABLE_SAFE_BROWSING) #if defined(ENABLE_SAFE_BROWSING)
safe_browsing::MalwareDOMDetails::Create(render_view); safe_browsing::MalwareDOMDetails::Create(render_view);
#endif #endif
...@@ -692,4 +692,16 @@ bool ChromeContentRendererClient::CrossesExtensionExtents(WebFrame* frame, ...@@ -692,4 +692,16 @@ bool ChromeContentRendererClient::CrossesExtensionExtents(WebFrame* frame,
return !extensions->InSameExtent(old_url, new_url); return !extensions->InSameExtent(old_url, new_url);
} }
void ChromeContentRendererClient::OnPurgeMemory() {
DVLOG(1) << "Resetting spellcheck in renderer client";
RenderThread* thread = RenderThread::current();
if (spellcheck_.get())
thread->RemoveObserver(spellcheck_.get());
SpellCheck* new_spellcheck = new SpellCheck();
if (spellcheck_provider_)
spellcheck_provider_->SetSpellCheck(new_spellcheck);
spellcheck_.reset(new_spellcheck);
thread->AddObserver(new_spellcheck);
}
} // namespace chrome } // namespace chrome
...@@ -15,6 +15,7 @@ class ExtensionDispatcher; ...@@ -15,6 +15,7 @@ class ExtensionDispatcher;
class RendererHistogramSnapshots; class RendererHistogramSnapshots;
class RendererNetPredictor; class RendererNetPredictor;
class SpellCheck; class SpellCheck;
class SpellCheckProvider;
class VisitedLinkSlave; class VisitedLinkSlave;
namespace safe_browsing { namespace safe_browsing {
...@@ -73,6 +74,10 @@ class ChromeContentRendererClient : public content::ContentRendererClient { ...@@ -73,6 +74,10 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
// For testing. // For testing.
void SetExtensionDispatcher(ExtensionDispatcher* extension_dispatcher); void SetExtensionDispatcher(ExtensionDispatcher* extension_dispatcher);
// Called in low-memory conditions to dump the memory used by the spellchecker
// and start over.
void OnPurgeMemory();
private: private:
WebKit::WebPlugin* CreatePluginImpl( WebKit::WebPlugin* CreatePluginImpl(
RenderView* render_view, RenderView* render_view,
...@@ -99,6 +104,9 @@ class ChromeContentRendererClient : public content::ContentRendererClient { ...@@ -99,6 +104,9 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
scoped_ptr<RendererHistogramSnapshots> histogram_snapshots_; scoped_ptr<RendererHistogramSnapshots> histogram_snapshots_;
scoped_ptr<RendererNetPredictor> net_predictor_; scoped_ptr<RendererNetPredictor> net_predictor_;
scoped_ptr<SpellCheck> spellcheck_; scoped_ptr<SpellCheck> spellcheck_;
// The SpellCheckProvider is a RenderViewObserver, and handles its own
// destruction.
SpellCheckProvider* spellcheck_provider_;
scoped_ptr<VisitedLinkSlave> visited_link_slave_; scoped_ptr<VisitedLinkSlave> visited_link_slave_;
scoped_ptr<safe_browsing::PhishingClassifierFilter> phishing_classifier_; scoped_ptr<safe_browsing::PhishingClassifierFilter> phishing_classifier_;
}; };
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "chrome/common/extensions/extension_localization_peer.h" #include "chrome/common/extensions/extension_localization_peer.h"
#include "chrome/common/net/net_resource_provider.h" #include "chrome/common/net/net_resource_provider.h"
#include "chrome/common/render_messages.h" #include "chrome/common/render_messages.h"
#include "chrome/renderer/chrome_content_renderer_client.h"
#include "chrome/renderer/content_settings_observer.h" #include "chrome/renderer/content_settings_observer.h"
#include "chrome/renderer/security_filter_peer.h" #include "chrome/renderer/security_filter_peer.h"
#include "content/common/resource_dispatcher.h" #include "content/common/resource_dispatcher.h"
...@@ -305,7 +306,9 @@ class ShutdownDetector : public base::PlatformThread::Delegate { ...@@ -305,7 +306,9 @@ class ShutdownDetector : public base::PlatformThread::Delegate {
bool ChromeRenderProcessObserver::is_incognito_process_ = false; bool ChromeRenderProcessObserver::is_incognito_process_ = false;
ChromeRenderProcessObserver::ChromeRenderProcessObserver() { ChromeRenderProcessObserver::ChromeRenderProcessObserver(
chrome::ChromeContentRendererClient* client)
: client_(client) {
const CommandLine& command_line = *CommandLine::ForCurrentProcess(); const CommandLine& command_line = *CommandLine::ForCurrentProcess();
if (command_line.HasSwitch(switches::kEnableWatchdog)) { if (command_line.HasSwitch(switches::kEnableWatchdog)) {
// TODO(JAR): Need to implement renderer IO msgloop watchdog. // TODO(JAR): Need to implement renderer IO msgloop watchdog.
...@@ -502,4 +505,7 @@ void ChromeRenderProcessObserver::OnPurgeMemory() { ...@@ -502,4 +505,7 @@ void ChromeRenderProcessObserver::OnPurgeMemory() {
// Tell tcmalloc to release any free pages it's still holding. // Tell tcmalloc to release any free pages it's still holding.
MallocExtension::instance()->ReleaseFreeMemory(); MallocExtension::instance()->ReleaseFreeMemory();
#endif #endif
if (client_)
client_->OnPurgeMemory();
} }
...@@ -12,6 +12,10 @@ ...@@ -12,6 +12,10 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "content/renderer/render_process_observer.h" #include "content/renderer/render_process_observer.h"
namespace chrome {
class ChromeContentRendererClient;
}
class GURL; class GURL;
class ResourceDispatcherDelegate; class ResourceDispatcherDelegate;
struct ContentSettings; struct ContentSettings;
...@@ -22,7 +26,8 @@ struct ContentSettings; ...@@ -22,7 +26,8 @@ struct ContentSettings;
// observer. // observer.
class ChromeRenderProcessObserver : public RenderProcessObserver { class ChromeRenderProcessObserver : public RenderProcessObserver {
public: public:
ChromeRenderProcessObserver(); explicit ChromeRenderProcessObserver(
chrome::ChromeContentRendererClient* client);
virtual ~ChromeRenderProcessObserver(); virtual ~ChromeRenderProcessObserver();
static bool is_incognito_process() { return is_incognito_process_; } static bool is_incognito_process() { return is_incognito_process_; }
...@@ -49,6 +54,7 @@ class ChromeRenderProcessObserver : public RenderProcessObserver { ...@@ -49,6 +54,7 @@ class ChromeRenderProcessObserver : public RenderProcessObserver {
static bool is_incognito_process_; static bool is_incognito_process_;
scoped_ptr<ResourceDispatcherDelegate> resource_delegate_; scoped_ptr<ResourceDispatcherDelegate> resource_delegate_;
chrome::ChromeContentRendererClient* client_;
DISALLOW_COPY_AND_ASSIGN(ChromeRenderProcessObserver); DISALLOW_COPY_AND_ASSIGN(ChromeRenderProcessObserver);
}; };
......
...@@ -36,18 +36,13 @@ bool SpellCheck::OnControlMessageReceived(const IPC::Message& message) { ...@@ -36,18 +36,13 @@ bool SpellCheck::OnControlMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_UNHANDLED(handled = false) IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP() IPC_END_MESSAGE_MAP()
if (message.type() == ViewMsg_PurgeMemory::ID) {
delete this;
new SpellCheck();
}
return handled; return handled;
} }
void SpellCheck::OnInit(IPC::PlatformFileForTransit bdict_file, void SpellCheck::OnInit(IPC::PlatformFileForTransit bdict_file,
const std::vector<std::string>& custom_words, const std::vector<std::string>& custom_words,
const std::string& language, const std::string& language,
bool auto_spell_correct) { bool auto_spell_correct) {
Init(IPC::PlatformFileForTransitToPlatformFile(bdict_file), Init(IPC::PlatformFileForTransitToPlatformFile(bdict_file),
custom_words, language); custom_words, language);
auto_spell_correct_turned_on_ = auto_spell_correct; auto_spell_correct_turned_on_ = auto_spell_correct;
......
...@@ -202,3 +202,7 @@ void SpellCheckProvider::EnsureDocumentTag() { ...@@ -202,3 +202,7 @@ void SpellCheckProvider::EnsureDocumentTag() {
} }
#endif #endif
} }
void SpellCheckProvider::SetSpellCheck(SpellCheck* spellcheck) {
spellcheck_ = spellcheck;
}
...@@ -53,6 +53,8 @@ class SpellCheckProvider : public RenderViewObserver, ...@@ -53,6 +53,8 @@ class SpellCheckProvider : public RenderViewObserver,
virtual bool OnMessageReceived(const IPC::Message& message); virtual bool OnMessageReceived(const IPC::Message& message);
virtual void FocusedNodeChanged(const WebKit::WebNode& node); virtual void FocusedNodeChanged(const WebKit::WebNode& node);
void SetSpellCheck(SpellCheck* spellcheck);
private: private:
// WebKit::WebSpellCheckClient implementation. // WebKit::WebSpellCheckClient implementation.
virtual void spellCheck( virtual void spellCheck(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment