Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(762)

Unified Diff: chrome/browser/prerender/prerender_message_filter.cc

Issue 914963002: Listen for keyed service shutdown notifications in PrerenderMessageFilter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: review Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_message_filter.cc
diff --git a/chrome/browser/prerender/prerender_message_filter.cc b/chrome/browser/prerender/prerender_message_filter.cc
index 14b6beb8ec7b931273ce93c0a0424447e8fac216..4a306d8d7560f4e1ee77d41446501049e77208b7 100644
--- a/chrome/browser/prerender/prerender_message_filter.cc
+++ b/chrome/browser/prerender/prerender_message_filter.cc
@@ -5,42 +5,62 @@
#include "chrome/browser/prerender/prerender_message_filter.h"
#include "base/bind.h"
-#include "chrome/browser/browser_process.h"
+#include "base/memory/singleton.h"
#include "chrome/browser/prerender/prerender_link_manager.h"
#include "chrome/browser/prerender/prerender_link_manager_factory.h"
-#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/common/prerender_messages.h"
+#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
+namespace prerender {
+
namespace {
-void OnChannelClosingInUIThread(Profile* profile, int render_process_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (!g_browser_process->profile_manager()->IsValidProfile(profile))
- return;
- prerender::PrerenderLinkManager* prerender_link_manager =
- prerender::PrerenderLinkManagerFactory::GetForProfile(profile);
- if (!prerender_link_manager)
- return;
- prerender_link_manager->OnChannelClosing(render_process_id);
-}
+class ShutdownNotifierFactory
+ : public BrowserContextKeyedServiceShutdownNotifierFactory {
+ public:
+ static ShutdownNotifierFactory* GetInstance() {
+ return Singleton<ShutdownNotifierFactory>::get();
+ }
-} // namespace
+ private:
+ friend struct DefaultSingletonTraits<ShutdownNotifierFactory>;
-namespace prerender {
+ ShutdownNotifierFactory()
+ : BrowserContextKeyedServiceShutdownNotifierFactory(
+ "PrerenderMessageFilter") {
+ DependsOn(PrerenderLinkManagerFactory::GetInstance());
+ }
+ ~ShutdownNotifierFactory() override {}
+
+ DISALLOW_COPY_AND_ASSIGN(ShutdownNotifierFactory);
+};
+
+} // namespace
PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id,
Profile* profile)
: BrowserMessageFilter(PrerenderMsgStart),
render_process_id_(render_process_id),
- profile_(profile) {
+ prerender_link_manager_(
+ PrerenderLinkManagerFactory::GetForProfile(profile)) {
+ shutdown_notifier_ =
+ ShutdownNotifierFactory::GetInstance()->Get(profile)->Subscribe(
+ base::Bind(&PrerenderMessageFilter::ShutdownOnUIThread,
+ base::Unretained(this)));
}
PrerenderMessageFilter::~PrerenderMessageFilter() {
}
+// static
+void PrerenderMessageFilter::EnsureShutdownNotifierFactoryBuilt() {
+ ShutdownNotifierFactory::GetInstance();
+}
+
bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PrerenderMessageFilter, message)
@@ -67,7 +87,7 @@ void PrerenderMessageFilter::OverrideThreadForMessage(
void PrerenderMessageFilter::OnChannelClosing() {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- base::Bind(&OnChannelClosingInUIThread, profile_, render_process_id_));
+ base::Bind(&PrerenderMessageFilter::OnChannelClosingInUIThread, this));
}
void PrerenderMessageFilter::OnAddPrerender(
@@ -77,11 +97,9 @@ void PrerenderMessageFilter::OnAddPrerender(
const gfx::Size& size,
int render_view_route_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- PrerenderLinkManager* prerender_link_manager =
- PrerenderLinkManagerFactory::GetForProfile(profile_);
- if (!prerender_link_manager)
+ if (!prerender_link_manager_)
return;
- prerender_link_manager->OnAddPrerender(
+ prerender_link_manager_->OnAddPrerender(
render_process_id_, prerender_id,
attributes.url, attributes.rel_types, referrer,
size, render_view_route_id);
@@ -90,21 +108,29 @@ void PrerenderMessageFilter::OnAddPrerender(
void PrerenderMessageFilter::OnCancelPrerender(
int prerender_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- PrerenderLinkManager* prerender_link_manager =
- PrerenderLinkManagerFactory::GetForProfile(profile_);
- if (!prerender_link_manager)
+ if (!prerender_link_manager_)
return;
- prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id);
+ prerender_link_manager_->OnCancelPrerender(render_process_id_, prerender_id);
}
void PrerenderMessageFilter::OnAbandonPrerender(
int prerender_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- PrerenderLinkManager* prerender_link_manager =
- PrerenderLinkManagerFactory::GetForProfile(profile_);
- if (!prerender_link_manager)
+ if (!prerender_link_manager_)
+ return;
+ prerender_link_manager_->OnAbandonPrerender(render_process_id_, prerender_id);
+}
+
+void PrerenderMessageFilter::ShutdownOnUIThread() {
+ prerender_link_manager_ = nullptr;
+ shutdown_notifier_.reset();
+}
+
+void PrerenderMessageFilter::OnChannelClosingInUIThread() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (!prerender_link_manager_)
return;
- prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id);
+ prerender_link_manager_->OnChannelClosing(render_process_id_);
}
} // namespace prerender

Powered by Google App Engine
This is Rietveld 408576698