Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / prerender / prerender_message_filter.cc
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
15 using content::BrowserThread;
16
17 namespace {
18
19 void 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
32 namespace prerender {
33
34 PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id,
35                                                Profile* profile)
36     : BrowserMessageFilter(PrerenderMsgStart),
37       render_process_id_(render_process_id),
38       profile_(profile) {
39 }
40
41 PrerenderMessageFilter::~PrerenderMessageFilter() {
42 }
43
44 bool 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
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;
64   }
65 }
66
67 void PrerenderMessageFilter::OnChannelClosing() {
68   BrowserThread::PostTask(
69       BrowserThread::UI, FROM_HERE,
70       base::Bind(&OnChannelClosingInUIThread, profile_, render_process_id_));
71 }
72
73 void 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
90 void 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
100 void 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