Commit a26edbf7 authored by bauerb's avatar bauerb Committed by Commit bot

Listen for keyed service shutdown notifications in PrerenderMessageFilter.

BUG=457590

Review URL: https://codereview.chromium.org/914963002

Cr-Commit-Position: refs/heads/master@{#317433}
parent f917e431
...@@ -5,42 +5,62 @@ ...@@ -5,42 +5,62 @@
#include "chrome/browser/prerender/prerender_message_filter.h" #include "chrome/browser/prerender/prerender_message_filter.h"
#include "base/bind.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.h"
#include "chrome/browser/prerender/prerender_link_manager_factory.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 "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" #include "content/public/browser/browser_thread.h"
using content::BrowserThread; using content::BrowserThread;
namespace prerender {
namespace { namespace {
void OnChannelClosingInUIThread(Profile* profile, int render_process_id) { class ShutdownNotifierFactory
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); : public BrowserContextKeyedServiceShutdownNotifierFactory {
if (!g_browser_process->profile_manager()->IsValidProfile(profile)) public:
return; static ShutdownNotifierFactory* GetInstance() {
prerender::PrerenderLinkManager* prerender_link_manager = return Singleton<ShutdownNotifierFactory>::get();
prerender::PrerenderLinkManagerFactory::GetForProfile(profile); }
if (!prerender_link_manager)
return;
prerender_link_manager->OnChannelClosing(render_process_id);
}
} // 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, PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id,
Profile* profile) Profile* profile)
: BrowserMessageFilter(PrerenderMsgStart), : BrowserMessageFilter(PrerenderMsgStart),
render_process_id_(render_process_id), 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() { PrerenderMessageFilter::~PrerenderMessageFilter() {
} }
// static
void PrerenderMessageFilter::EnsureShutdownNotifierFactoryBuilt() {
ShutdownNotifierFactory::GetInstance();
}
bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message) { bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message) {
bool handled = true; bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PrerenderMessageFilter, message) IPC_BEGIN_MESSAGE_MAP(PrerenderMessageFilter, message)
...@@ -67,7 +87,7 @@ void PrerenderMessageFilter::OverrideThreadForMessage( ...@@ -67,7 +87,7 @@ void PrerenderMessageFilter::OverrideThreadForMessage(
void PrerenderMessageFilter::OnChannelClosing() { void PrerenderMessageFilter::OnChannelClosing() {
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
base::Bind(&OnChannelClosingInUIThread, profile_, render_process_id_)); base::Bind(&PrerenderMessageFilter::OnChannelClosingInUIThread, this));
} }
void PrerenderMessageFilter::OnAddPrerender( void PrerenderMessageFilter::OnAddPrerender(
...@@ -77,11 +97,9 @@ void PrerenderMessageFilter::OnAddPrerender( ...@@ -77,11 +97,9 @@ void PrerenderMessageFilter::OnAddPrerender(
const gfx::Size& size, const gfx::Size& size,
int render_view_route_id) { int render_view_route_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
PrerenderLinkManager* prerender_link_manager = if (!prerender_link_manager_)
PrerenderLinkManagerFactory::GetForProfile(profile_);
if (!prerender_link_manager)
return; return;
prerender_link_manager->OnAddPrerender( prerender_link_manager_->OnAddPrerender(
render_process_id_, prerender_id, render_process_id_, prerender_id,
attributes.url, attributes.rel_types, referrer, attributes.url, attributes.rel_types, referrer,
size, render_view_route_id); size, render_view_route_id);
...@@ -90,21 +108,29 @@ void PrerenderMessageFilter::OnAddPrerender( ...@@ -90,21 +108,29 @@ void PrerenderMessageFilter::OnAddPrerender(
void PrerenderMessageFilter::OnCancelPrerender( void PrerenderMessageFilter::OnCancelPrerender(
int prerender_id) { int prerender_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
PrerenderLinkManager* prerender_link_manager = if (!prerender_link_manager_)
PrerenderLinkManagerFactory::GetForProfile(profile_);
if (!prerender_link_manager)
return; return;
prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id); prerender_link_manager_->OnCancelPrerender(render_process_id_, prerender_id);
} }
void PrerenderMessageFilter::OnAbandonPrerender( void PrerenderMessageFilter::OnAbandonPrerender(
int prerender_id) { int prerender_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
PrerenderLinkManager* prerender_link_manager = if (!prerender_link_manager_)
PrerenderLinkManagerFactory::GetForProfile(profile_); return;
if (!prerender_link_manager) 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; return;
prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id); prerender_link_manager_->OnChannelClosing(render_process_id_);
} }
} // namespace prerender } // namespace prerender
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define CHROME_BROWSER_PRERENDER_PRERENDER_MESSAGE_FILTER_H_ #define CHROME_BROWSER_PRERENDER_PRERENDER_MESSAGE_FILTER_H_
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "components/keyed_service/core/keyed_service_shutdown_notifier.h"
#include "content/public/browser/browser_message_filter.h" #include "content/public/browser/browser_message_filter.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -26,10 +27,14 @@ class Message; ...@@ -26,10 +27,14 @@ class Message;
namespace prerender { namespace prerender {
class PrerenderLinkManager;
class PrerenderMessageFilter : public content::BrowserMessageFilter { class PrerenderMessageFilter : public content::BrowserMessageFilter {
public: public:
PrerenderMessageFilter(int render_process_id, Profile* profile); PrerenderMessageFilter(int render_process_id, Profile* profile);
static void EnsureShutdownNotifierFactoryBuilt();
private: private:
~PrerenderMessageFilter() override; ~PrerenderMessageFilter() override;
...@@ -47,8 +52,15 @@ class PrerenderMessageFilter : public content::BrowserMessageFilter { ...@@ -47,8 +52,15 @@ class PrerenderMessageFilter : public content::BrowserMessageFilter {
void OnCancelPrerender(int prerender_id); void OnCancelPrerender(int prerender_id);
void OnAbandonPrerender(int prerender_id); void OnAbandonPrerender(int prerender_id);
void ShutdownOnUIThread();
void OnChannelClosingInUIThread();
const int render_process_id_; const int render_process_id_;
Profile* const profile_;
PrerenderLinkManager* prerender_link_manager_;
scoped_ptr<KeyedServiceShutdownNotifier::Subscription> shutdown_notifier_;
DISALLOW_COPY_AND_ASSIGN(PrerenderMessageFilter); DISALLOW_COPY_AND_ASSIGN(PrerenderMessageFilter);
}; };
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h" #include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
#include "chrome/browser/prerender/prerender_link_manager_factory.h" #include "chrome/browser/prerender/prerender_link_manager_factory.h"
#include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/prerender/prerender_message_filter.h"
#include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h" #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h"
#include "chrome/browser/profiles/gaia_info_update_service_factory.h" #include "chrome/browser/profiles/gaia_info_update_service_factory.h"
#include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/search/instant_service_factory.h"
...@@ -261,8 +262,9 @@ EnsureBrowserContextKeyedServiceFactoriesBuilt() { ...@@ -261,8 +262,9 @@ EnsureBrowserContextKeyedServiceFactoriesBuilt() {
predictors::AutocompleteActionPredictorFactory::GetInstance(); predictors::AutocompleteActionPredictorFactory::GetInstance();
predictors::PredictorDatabaseFactory::GetInstance(); predictors::PredictorDatabaseFactory::GetInstance();
predictors::ResourcePrefetchPredictorFactory::GetInstance(); predictors::ResourcePrefetchPredictorFactory::GetInstance();
prerender::PrerenderManagerFactory::GetInstance();
prerender::PrerenderLinkManagerFactory::GetInstance(); prerender::PrerenderLinkManagerFactory::GetInstance();
prerender::PrerenderManagerFactory::GetInstance();
prerender::PrerenderMessageFilter::EnsureShutdownNotifierFactoryBuilt();
ProfileSyncServiceFactory::GetInstance(); ProfileSyncServiceFactory::GetInstance();
ProtocolHandlerRegistryFactory::GetInstance(); ProtocolHandlerRegistryFactory::GetInstance();
#if defined(ENABLE_SESSION_SERVICE) #if defined(ENABLE_SESSION_SERVICE)
......
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