| 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
|
|
|