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 : render_process_id_(render_process_id),
40 PrerenderMessageFilter::~PrerenderMessageFilter() {
43 bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message,
44 bool* message_was_ok) {
46 IPC_BEGIN_MESSAGE_MAP_EX(PrerenderMessageFilter, message, *message_was_ok)
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(
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 url, referrer, size, render_view_route_id);
89 void PrerenderMessageFilter::OnCancelPrerender(
91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
92 PrerenderLinkManager* prerender_link_manager =
93 PrerenderLinkManagerFactory::GetForProfile(profile_);
94 if (!prerender_link_manager)
96 prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id);
99 void PrerenderMessageFilter::OnAbandonPrerender(
101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
102 PrerenderLinkManager* prerender_link_manager =
103 PrerenderLinkManagerFactory::GetForProfile(profile_);
104 if (!prerender_link_manager)
106 prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id);
109 } // namespace prerender