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() {
}
void ChromeContentRendererClient::RenderThreadStarted() {
chrome_observer_.reset(new ChromeRenderProcessObserver());
chrome_observer_.reset(new ChromeRenderProcessObserver(this));
extension_dispatcher_.reset(new ExtensionDispatcher());
histogram_snapshots_.reset(new RendererHistogramSnapshots());
net_predictor_.reset(new RendererNetPredictor());
......@@ -215,7 +215,7 @@ void ChromeContentRendererClient::RenderViewCreated(RenderView* render_view) {
new PageLoadHistograms(render_view, histogram_snapshots_.get());
new PrintWebViewHelper(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)
safe_browsing::MalwareDOMDetails::Create(render_view);
#endif
......@@ -692,4 +692,16 @@ bool ChromeContentRendererClient::CrossesExtensionExtents(WebFrame* frame,
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
......@@ -15,6 +15,7 @@ class ExtensionDispatcher;
class RendererHistogramSnapshots;
class RendererNetPredictor;
class SpellCheck;
class SpellCheckProvider;
class VisitedLinkSlave;
namespace safe_browsing {
......@@ -73,6 +74,10 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
// For testing.
void SetExtensionDispatcher(ExtensionDispatcher* extension_dispatcher);
// Called in low-memory conditions to dump the memory used by the spellchecker
// and start over.
void OnPurgeMemory();
private:
WebKit::WebPlugin* CreatePluginImpl(
RenderView* render_view,
......@@ -99,6 +104,9 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
scoped_ptr<RendererHistogramSnapshots> histogram_snapshots_;
scoped_ptr<RendererNetPredictor> net_predictor_;
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<safe_browsing::PhishingClassifierFilter> phishing_classifier_;
};
......
......@@ -17,6 +17,7 @@
#include "chrome/common/extensions/extension_localization_peer.h"
#include "chrome/common/net/net_resource_provider.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/security_filter_peer.h"
#include "content/common/resource_dispatcher.h"
......@@ -305,7 +306,9 @@ class ShutdownDetector : public base::PlatformThread::Delegate {
bool ChromeRenderProcessObserver::is_incognito_process_ = false;
ChromeRenderProcessObserver::ChromeRenderProcessObserver() {
ChromeRenderProcessObserver::ChromeRenderProcessObserver(
chrome::ChromeContentRendererClient* client)
: client_(client) {
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
if (command_line.HasSwitch(switches::kEnableWatchdog)) {
// TODO(JAR): Need to implement renderer IO msgloop watchdog.
......@@ -502,4 +505,7 @@ void ChromeRenderProcessObserver::OnPurgeMemory() {
// Tell tcmalloc to release any free pages it's still holding.
MallocExtension::instance()->ReleaseFreeMemory();
#endif
if (client_)
client_->OnPurgeMemory();
}
......@@ -12,6 +12,10 @@
#include "base/memory/scoped_ptr.h"
#include "content/renderer/render_process_observer.h"
namespace chrome {
class ChromeContentRendererClient;
}
class GURL;
class ResourceDispatcherDelegate;
struct ContentSettings;
......@@ -22,7 +26,8 @@ struct ContentSettings;
// observer.
class ChromeRenderProcessObserver : public RenderProcessObserver {
public:
ChromeRenderProcessObserver();
explicit ChromeRenderProcessObserver(
chrome::ChromeContentRendererClient* client);
virtual ~ChromeRenderProcessObserver();
static bool is_incognito_process() { return is_incognito_process_; }
......@@ -49,6 +54,7 @@ class ChromeRenderProcessObserver : public RenderProcessObserver {
static bool is_incognito_process_;
scoped_ptr<ResourceDispatcherDelegate> resource_delegate_;
chrome::ChromeContentRendererClient* client_;
DISALLOW_COPY_AND_ASSIGN(ChromeRenderProcessObserver);
};
......
......@@ -36,18 +36,13 @@ bool SpellCheck::OnControlMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
if (message.type() == ViewMsg_PurgeMemory::ID) {
delete this;
new SpellCheck();
}
return handled;
}
void SpellCheck::OnInit(IPC::PlatformFileForTransit bdict_file,
const std::vector<std::string>& custom_words,
const std::string& language,
bool auto_spell_correct) {
bool auto_spell_correct) {
Init(IPC::PlatformFileForTransitToPlatformFile(bdict_file),
custom_words, language);
auto_spell_correct_turned_on_ = auto_spell_correct;
......
......@@ -202,3 +202,7 @@ void SpellCheckProvider::EnsureDocumentTag() {
}
#endif
}
void SpellCheckProvider::SetSpellCheck(SpellCheck* spellcheck) {
spellcheck_ = spellcheck;
}
......@@ -53,6 +53,8 @@ class SpellCheckProvider : public RenderViewObserver,
virtual bool OnMessageReceived(const IPC::Message& message);
virtual void FocusedNodeChanged(const WebKit::WebNode& node);
void SetSpellCheck(SpellCheck* spellcheck);
private:
// WebKit::WebSpellCheckClient implementation.
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