1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/prerender/prerender_message_filter.h"
8 #include "chrome/browser/browser_process.h"
9 #include "chrome/browser/prerender/prerender_link_manager.h"
10 #include "chrome/browser/prerender/prerender_link_manager_factory.h"
11 #include "chrome/browser/profiles/profile_manager.h"
12 #include "chrome/common/prerender_messages.h"
13 #include "content/public/browser/browser_thread.h"
15 using content::BrowserThread;
19 void OnChannelClosingInUIThread(Profile* profile, int render_process_id) {
20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
21 if (!g_browser_process->profile_manager()->IsValidProfile(profile))
23 prerender::PrerenderLinkManager* prerender_link_manager =
24 prerender::PrerenderLinkManagerFactory::GetForProfile(profile);
25 if (!prerender_link_manager)
27 prerender_link_manager->OnChannelClosing(render_process_id);
34 PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id,
36 : BrowserMessageFilter(PrerenderMsgStart),
37 render_process_id_(render_process_id),
41 PrerenderMessageFilter::~PrerenderMessageFilter() {
44 bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message) {
46 IPC_BEGIN_MESSAGE_MAP(PrerenderMessageFilter, message)
47 IPC_MESSAGE_HANDLER(PrerenderHostMsg_AddLinkRelPrerender, OnAddPrerender)
49 PrerenderHostMsg_CancelLinkRelPrerender, OnCancelPrerender)
51 PrerenderHostMsg_AbandonLinkRelPrerender, OnAbandonPrerender)
52 IPC_MESSAGE_UNHANDLED(handled = false)
58 void PrerenderMessageFilter::OverrideThreadForMessage(
59 const IPC::Message& message, content::BrowserThread::ID* thread) {
60 if (message.type() == PrerenderHostMsg_AddLinkRelPrerender::ID ||
61 message.type() == PrerenderHostMsg_CancelLinkRelPrerender::ID ||
62 message.type() == PrerenderHostMsg_AbandonLinkRelPrerender::ID) {
63 *thread = BrowserThread::UI;
67 void PrerenderMessageFilter::OnChannelClosing() {
68 BrowserThread::PostTask(
69 BrowserThread::UI, FROM_HERE,
70 base::Bind(&OnChannelClosingInUIThread, profile_, render_process_id_));
73 void PrerenderMessageFilter::OnAddPrerender(
75 const PrerenderAttributes& attributes,
76 const content::Referrer& referrer,
77 const gfx::Size& size,
78 int render_view_route_id) {
79 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
80 PrerenderLinkManager* prerender_link_manager =
81 PrerenderLinkManagerFactory::GetForProfile(profile_);
82 if (!prerender_link_manager)
84 prerender_link_manager->OnAddPrerender(
85 render_process_id_, prerender_id,
86 attributes.url, attributes.rel_types, referrer,
87 size, render_view_route_id);
90 void PrerenderMessageFilter::OnCancelPrerender(
92 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
93 PrerenderLinkManager* prerender_link_manager =
94 PrerenderLinkManagerFactory::GetForProfile(profile_);
95 if (!prerender_link_manager)
97 prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id);
100 void PrerenderMessageFilter::OnAbandonPrerender(
102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
103 PrerenderLinkManager* prerender_link_manager =
104 PrerenderLinkManagerFactory::GetForProfile(profile_);
105 if (!prerender_link_manager)
107 prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id);
110 } // namespace prerender