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. 4 5#include "chrome/browser/prerender/prerender_message_filter.h" 6 7#include "base/bind.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" 14 15using content::BrowserThread; 16 17namespace { 18 19void OnChannelClosingInUIThread(Profile* profile, int render_process_id) { 20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 21 if (!g_browser_process->profile_manager()->IsValidProfile(profile)) 22 return; 23 prerender::PrerenderLinkManager* prerender_link_manager = 24 prerender::PrerenderLinkManagerFactory::GetForProfile(profile); 25 if (!prerender_link_manager) 26 return; 27 prerender_link_manager->OnChannelClosing(render_process_id); 28} 29 30} // namespace 31 32namespace prerender { 33 34PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id, 35 Profile* profile) 36 : BrowserMessageFilter(PrerenderMsgStart), 37 render_process_id_(render_process_id), 38 profile_(profile) { 39} 40 41PrerenderMessageFilter::~PrerenderMessageFilter() { 42} 43 44bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message) { 45 bool handled = true; 46 IPC_BEGIN_MESSAGE_MAP(PrerenderMessageFilter, message) 47 IPC_MESSAGE_HANDLER(PrerenderHostMsg_AddLinkRelPrerender, OnAddPrerender) 48 IPC_MESSAGE_HANDLER( 49 PrerenderHostMsg_CancelLinkRelPrerender, OnCancelPrerender) 50 IPC_MESSAGE_HANDLER( 51 PrerenderHostMsg_AbandonLinkRelPrerender, OnAbandonPrerender) 52 IPC_MESSAGE_UNHANDLED(handled = false) 53 IPC_END_MESSAGE_MAP() 54 55 return handled; 56} 57 58void 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; 64 } 65} 66 67void PrerenderMessageFilter::OnChannelClosing() { 68 BrowserThread::PostTask( 69 BrowserThread::UI, FROM_HERE, 70 base::Bind(&OnChannelClosingInUIThread, profile_, render_process_id_)); 71} 72 73void PrerenderMessageFilter::OnAddPrerender( 74 int prerender_id, 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) 83 return; 84 prerender_link_manager->OnAddPrerender( 85 render_process_id_, prerender_id, 86 attributes.url, attributes.rel_types, referrer, 87 size, render_view_route_id); 88} 89 90void PrerenderMessageFilter::OnCancelPrerender( 91 int prerender_id) { 92 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 93 PrerenderLinkManager* prerender_link_manager = 94 PrerenderLinkManagerFactory::GetForProfile(profile_); 95 if (!prerender_link_manager) 96 return; 97 prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id); 98} 99 100void PrerenderMessageFilter::OnAbandonPrerender( 101 int prerender_id) { 102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 103 PrerenderLinkManager* prerender_link_manager = 104 PrerenderLinkManagerFactory::GetForProfile(profile_); 105 if (!prerender_link_manager) 106 return; 107 prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id); 108} 109 110} // namespace prerender 111 112