- add sources.
[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     : render_process_id_(render_process_id),
37       profile_(profile) {
38 }
39
40 PrerenderMessageFilter::~PrerenderMessageFilter() {
41 }
42
43 bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message,
44                                                bool* message_was_ok) {
45   bool handled = true;
46   IPC_BEGIN_MESSAGE_MAP_EX(PrerenderMessageFilter, message, *message_was_ok)
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 GURL& url,
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       url, referrer, size, render_view_route_id);
87 }
88
89 void PrerenderMessageFilter::OnCancelPrerender(
90     int prerender_id) {
91   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
92   PrerenderLinkManager* prerender_link_manager =
93       PrerenderLinkManagerFactory::GetForProfile(profile_);
94   if (!prerender_link_manager)
95     return;
96   prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id);
97 }
98
99 void PrerenderMessageFilter::OnAbandonPrerender(
100     int prerender_id) {
101   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
102   PrerenderLinkManager* prerender_link_manager =
103       PrerenderLinkManagerFactory::GetForProfile(profile_);
104   if (!prerender_link_manager)
105     return;
106   prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id);
107 }
108
109 }  // namespace prerender
110